aboutsummaryrefslogtreecommitdiff
path: root/coverage-report
diff options
context:
space:
mode:
authorDeployment Bot (from Travis CI) <deploy@travis-ci.org>2021-05-13 12:18:40 +0000
committerDeployment Bot (from Travis CI) <deploy@travis-ci.org>2021-05-13 12:18:40 +0000
commitff7c0852427a5fa90b6423c31410a7a711a9e3ed (patch)
treed74a98751c28d87cd0114e9da3976d02603659dd /coverage-report
downloadskiboot-ff7c0852427a5fa90b6423c31410a7a711a9e3ed.zip
skiboot-ff7c0852427a5fa90b6423c31410a7a711a9e3ed.tar.gz
skiboot-ff7c0852427a5fa90b6423c31410a7a711a9e3ed.tar.bz2
Deploy open-power/skiboot to github.com/open-power/skiboot.git:gh-pages
Diffstat (limited to 'coverage-report')
-rw-r--r--coverage-report/amber.pngbin0 -> 141 bytes
-rw-r--r--coverage-report/ccan/array_size/test/index-sort-b.html107
-rw-r--r--coverage-report/ccan/array_size/test/index-sort-f.html107
-rw-r--r--coverage-report/ccan/array_size/test/index-sort-l.html107
-rw-r--r--coverage-report/ccan/array_size/test/index.html107
-rw-r--r--coverage-report/ccan/array_size/test/run.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/array_size/test/run.c.func.html85
-rw-r--r--coverage-report/ccan/array_size/test/run.c.gcov.html121
-rw-r--r--coverage-report/ccan/build_assert/test/index-sort-b.html107
-rw-r--r--coverage-report/ccan/build_assert/test/index-sort-f.html107
-rw-r--r--coverage-report/ccan/build_assert/test/index-sort-l.html107
-rw-r--r--coverage-report/ccan/build_assert/test/index.html107
-rw-r--r--coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func.html85
-rw-r--r--coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.gcov.html97
-rw-r--r--coverage-report/ccan/check_type/test/index-sort-b.html107
-rw-r--r--coverage-report/ccan/check_type/test/index-sort-f.html107
-rw-r--r--coverage-report/ccan/check_type/test/index-sort-l.html107
-rw-r--r--coverage-report/ccan/check_type/test/index.html107
-rw-r--r--coverage-report/ccan/check_type/test/run.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/check_type/test/run.c.func.html85
-rw-r--r--coverage-report/ccan/check_type/test/run.c.gcov.html110
-rw-r--r--coverage-report/ccan/container_of/test/index-sort-b.html107
-rw-r--r--coverage-report/ccan/container_of/test/index-sort-f.html107
-rw-r--r--coverage-report/ccan/container_of/test/index-sort-l.html107
-rw-r--r--coverage-report/ccan/container_of/test/index.html107
-rw-r--r--coverage-report/ccan/container_of/test/run.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/container_of/test/run.c.func.html85
-rw-r--r--coverage-report/ccan/container_of/test/run.c.gcov.html112
-rw-r--r--coverage-report/ccan/endian/endian.h.func-sort-c.html141
-rw-r--r--coverage-report/ccan/endian/endian.h.func.html141
-rw-r--r--coverage-report/ccan/endian/endian.h.gcov.html440
-rw-r--r--coverage-report/ccan/endian/index-sort-b.html107
-rw-r--r--coverage-report/ccan/endian/index-sort-f.html107
-rw-r--r--coverage-report/ccan/endian/index-sort-l.html107
-rw-r--r--coverage-report/ccan/endian/index.html107
-rw-r--r--coverage-report/ccan/endian/test/index-sort-b.html107
-rw-r--r--coverage-report/ccan/endian/test/index-sort-f.html107
-rw-r--r--coverage-report/ccan/endian/test/index-sort-l.html107
-rw-r--r--coverage-report/ccan/endian/test/index.html107
-rw-r--r--coverage-report/ccan/endian/test/run.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/endian/test/run.c.func.html85
-rw-r--r--coverage-report/ccan/endian/test/run.c.gcov.html194
-rw-r--r--coverage-report/ccan/heap/heap.c.func-sort-c.html113
-rw-r--r--coverage-report/ccan/heap/heap.c.func.html113
-rw-r--r--coverage-report/ccan/heap/heap.c.gcov.html204
-rw-r--r--coverage-report/ccan/heap/index-sort-b.html107
-rw-r--r--coverage-report/ccan/heap/index-sort-f.html107
-rw-r--r--coverage-report/ccan/heap/index-sort-l.html107
-rw-r--r--coverage-report/ccan/heap/index.html107
-rw-r--r--coverage-report/ccan/heap/test/index-sort-b.html107
-rw-r--r--coverage-report/ccan/heap/test/index-sort-f.html107
-rw-r--r--coverage-report/ccan/heap/test/index-sort-l.html107
-rw-r--r--coverage-report/ccan/heap/test/index.html107
-rw-r--r--coverage-report/ccan/heap/test/run.c.func-sort-c.html109
-rw-r--r--coverage-report/ccan/heap/test/run.c.func.html109
-rw-r--r--coverage-report/ccan/heap/test/run.c.gcov.html218
-rw-r--r--coverage-report/ccan/list/index-sort-b.html119
-rw-r--r--coverage-report/ccan/list/index-sort-f.html119
-rw-r--r--coverage-report/ccan/list/index-sort-l.html119
-rw-r--r--coverage-report/ccan/list/index.html119
-rw-r--r--coverage-report/ccan/list/list.c.func-sort-c.html93
-rw-r--r--coverage-report/ccan/list/list.c.func.html93
-rw-r--r--coverage-report/ccan/list/list.c.gcov.html128
-rw-r--r--coverage-report/ccan/list/list.h.func-sort-c.html141
-rw-r--r--coverage-report/ccan/list/list.h.func.html141
-rw-r--r--coverage-report/ccan/list/list.h.gcov.html668
-rw-r--r--coverage-report/ccan/list/test/helper.c.func-sort-c.html93
-rw-r--r--coverage-report/ccan/list/test/helper.c.func.html93
-rw-r--r--coverage-report/ccan/list/test/helper.c.gcov.html141
-rw-r--r--coverage-report/ccan/list/test/index-sort-b.html155
-rw-r--r--coverage-report/ccan/list/test/index-sort-f.html155
-rw-r--r--coverage-report/ccan/list/test/index-sort-l.html155
-rw-r--r--coverage-report/ccan/list/test/index.html155
-rw-r--r--coverage-report/ccan/list/test/run-check-corrupt.c.func-sort-c.html89
-rw-r--r--coverage-report/ccan/list/test/run-check-corrupt.c.func.html89
-rw-r--r--coverage-report/ccan/list/test/run-check-corrupt.c.gcov.html180
-rw-r--r--coverage-report/ccan/list/test/run-list_del_from-assert.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/list/test/run-list_del_from-assert.c.func.html85
-rw-r--r--coverage-report/ccan/list/test/run-list_del_from-assert.c.gcov.html125
-rw-r--r--coverage-report/ccan/list/test/run-single-eval.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/list/test/run-single-eval.c.func.html85
-rw-r--r--coverage-report/ccan/list/test/run-single-eval.c.gcov.html256
-rw-r--r--coverage-report/ccan/list/test/run.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/list/test/run.c.func.html85
-rw-r--r--coverage-report/ccan/list/test/run.c.gcov.html289
-rw-r--r--coverage-report/ccan/short_types/test/index-sort-b.html119
-rw-r--r--coverage-report/ccan/short_types/test/index-sort-f.html119
-rw-r--r--coverage-report/ccan/short_types/test/index-sort-l.html119
-rw-r--r--coverage-report/ccan/short_types/test/index.html119
-rw-r--r--coverage-report/ccan/short_types/test/run-endian.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/short_types/test/run-endian.c.func.html85
-rw-r--r--coverage-report/ccan/short_types/test/run-endian.c.gcov.html105
-rw-r--r--coverage-report/ccan/short_types/test/run.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/short_types/test/run.c.func.html85
-rw-r--r--coverage-report/ccan/short_types/test/run.c.gcov.html115
-rw-r--r--coverage-report/ccan/str/index-sort-b.html119
-rw-r--r--coverage-report/ccan/str/index-sort-f.html119
-rw-r--r--coverage-report/ccan/str/index-sort-l.html119
-rw-r--r--coverage-report/ccan/str/index.html119
-rw-r--r--coverage-report/ccan/str/str.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/str/str.c.func.html85
-rw-r--r--coverage-report/ccan/str/str.c.gcov.html98
-rw-r--r--coverage-report/ccan/str/str.h.func-sort-c.html85
-rw-r--r--coverage-report/ccan/str/str.h.func.html85
-rw-r--r--coverage-report/ccan/str/str.h.gcov.html205
-rw-r--r--coverage-report/ccan/str/test/index-sort-b.html119
-rw-r--r--coverage-report/ccan/str/test/index-sort-f.html119
-rw-r--r--coverage-report/ccan/str/test/index-sort-l.html119
-rw-r--r--coverage-report/ccan/str/test/index.html119
-rw-r--r--coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func-sort-c.html85
-rw-r--r--coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func.html85
-rw-r--r--coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.gcov.html151
-rw-r--r--coverage-report/ccan/str/test/run.c.func-sort-c.html89
-rw-r--r--coverage-report/ccan/str/test/run.c.func.html89
-rw-r--r--coverage-report/ccan/str/test/run.c.gcov.html194
-rw-r--r--coverage-report/core/bitmap.c.func-sort-c.html93
-rw-r--r--coverage-report/core/bitmap.c.func.html93
-rw-r--r--coverage-report/core/bitmap.c.gcov.html129
-rw-r--r--coverage-report/core/buddy.c.func-sort-c.html129
-rw-r--r--coverage-report/core/buddy.c.func.html129
-rw-r--r--coverage-report/core/buddy.c.gcov.html377
-rw-r--r--coverage-report/core/chip.c.func-sort-c.html113
-rw-r--r--coverage-report/core/chip.c.func.html113
-rw-r--r--coverage-report/core/chip.c.gcov.html251
-rw-r--r--coverage-report/core/console-log.c.func-sort-c.html93
-rw-r--r--coverage-report/core/console-log.c.func.html93
-rw-r--r--coverage-report/core/console-log.c.gcov.html156
-rw-r--r--coverage-report/core/cpufeatures.c.func-sort-c.html97
-rw-r--r--coverage-report/core/cpufeatures.c.func.html97
-rw-r--r--coverage-report/core/cpufeatures.c.gcov.html1068
-rw-r--r--coverage-report/core/device.c.func-sort-c.html349
-rw-r--r--coverage-report/core/device.c.func.html349
-rw-r--r--coverage-report/core/device.c.gcov.html1213
-rw-r--r--coverage-report/core/fdt.c.func-sort-c.html125
-rw-r--r--coverage-report/core/fdt.c.func.html125
-rw-r--r--coverage-report/core/fdt.c.gcov.html343
-rw-r--r--coverage-report/core/flash-firmware-versions.c.func-sort-c.html93
-rw-r--r--coverage-report/core/flash-firmware-versions.c.func.html93
-rw-r--r--coverage-report/core/flash-firmware-versions.c.gcov.html249
-rw-r--r--coverage-report/core/flash-subpartition.c.func-sort-c.html85
-rw-r--r--coverage-report/core/flash-subpartition.c.func.html85
-rw-r--r--coverage-report/core/flash-subpartition.c.gcov.html195
-rw-r--r--coverage-report/core/index-sort-b.html335
-rw-r--r--coverage-report/core/index-sort-f.html335
-rw-r--r--coverage-report/core/index-sort-l.html335
-rw-r--r--coverage-report/core/index.html335
-rw-r--r--coverage-report/core/malloc.c.func-sort-c.html101
-rw-r--r--coverage-report/core/malloc.c.func.html101
-rw-r--r--coverage-report/core/malloc.c.gcov.html161
-rw-r--r--coverage-report/core/mem_region.c.func-sort-c.html277
-rw-r--r--coverage-report/core/mem_region.c.func.html277
-rw-r--r--coverage-report/core/mem_region.c.gcov.html1640
-rw-r--r--coverage-report/core/nvram-format.c.func-sort-c.html125
-rw-r--r--coverage-report/core/nvram-format.c.func.html125
-rw-r--r--coverage-report/core/nvram-format.c.gcov.html416
-rw-r--r--coverage-report/core/opal-msg.c.func-sort-c.html97
-rw-r--r--coverage-report/core/opal-msg.c.func.html97
-rw-r--r--coverage-report/core/opal-msg.c.gcov.html278
-rw-r--r--coverage-report/core/pci-quirk.c.func-sort-c.html101
-rw-r--r--coverage-report/core/pci-quirk.c.func.html101
-rw-r--r--coverage-report/core/pci-quirk.c.gcov.html220
-rw-r--r--coverage-report/core/pel.c.func-sort-c.html129
-rw-r--r--coverage-report/core/pel.c.func.html129
-rw-r--r--coverage-report/core/pel.c.gcov.html364
-rw-r--r--coverage-report/core/pool.c.func-sort-c.html93
-rw-r--r--coverage-report/core/pool.c.func.html93
-rw-r--r--coverage-report/core/pool.c.gcov.html153
-rw-r--r--coverage-report/core/test/dummy-cpu.h.func-sort-c.html85
-rw-r--r--coverage-report/core/test/dummy-cpu.h.func.html85
-rw-r--r--coverage-report/core/test/dummy-cpu.h.gcov.html120
-rw-r--r--coverage-report/core/test/index-sort-b.html455
-rw-r--r--coverage-report/core/test/index-sort-f.html455
-rw-r--r--coverage-report/core/test/index-sort-l.html455
-rw-r--r--coverage-report/core/test/index.html455
-rw-r--r--coverage-report/core/test/run-api-test.c.func-sort-c.html85
-rw-r--r--coverage-report/core/test/run-api-test.c.func.html85
-rw-r--r--coverage-report/core/test/run-api-test.c.gcov.html125
-rw-r--r--coverage-report/core/test/run-bitmap.c.func-sort-c.html85
-rw-r--r--coverage-report/core/test/run-bitmap.c.func.html85
-rw-r--r--coverage-report/core/test/run-bitmap.c.gcov.html165
-rw-r--r--coverage-report/core/test/run-buddy.c.func-sort-c.html89
-rw-r--r--coverage-report/core/test/run-buddy.c.func.html89
-rw-r--r--coverage-report/core/test/run-buddy.c.gcov.html158
-rw-r--r--coverage-report/core/test/run-console-log-buf-overrun.c.func-sort-c.html93
-rw-r--r--coverage-report/core/test/run-console-log-buf-overrun.c.func.html93
-rw-r--r--coverage-report/core/test/run-console-log-buf-overrun.c.gcov.html190
-rw-r--r--coverage-report/core/test/run-console-log-pr_fmt.c.func-sort-c.html93
-rw-r--r--coverage-report/core/test/run-console-log-pr_fmt.c.func.html93
-rw-r--r--coverage-report/core/test/run-console-log-pr_fmt.c.gcov.html148
-rw-r--r--coverage-report/core/test/run-console-log.c.func-sort-c.html93
-rw-r--r--coverage-report/core/test/run-console-log.c.func.html93
-rw-r--r--coverage-report/core/test/run-console-log.c.gcov.html148
-rw-r--r--coverage-report/core/test/run-cpufeatures.c.func-sort-c.html93
-rw-r--r--coverage-report/core/test/run-cpufeatures.c.func.html93
-rw-r--r--coverage-report/core/test/run-cpufeatures.c.gcov.html229
-rw-r--r--coverage-report/core/test/run-device.c.func-sort-c.html105
-rw-r--r--coverage-report/core/test/run-device.c.func.html105
-rw-r--r--coverage-report/core/test/run-device.c.gcov.html556
-rw-r--r--coverage-report/core/test/run-flash-firmware-versions.c.func-sort-c.html113
-rw-r--r--coverage-report/core/test/run-flash-firmware-versions.c.func.html113
-rw-r--r--coverage-report/core/test/run-flash-firmware-versions.c.gcov.html239
-rw-r--r--coverage-report/core/test/run-flash-subpartition.c.func-sort-c.html85
-rw-r--r--coverage-report/core/test/run-flash-subpartition.c.func.html85
-rw-r--r--coverage-report/core/test/run-flash-subpartition.c.gcov.html133
-rw-r--r--coverage-report/core/test/run-malloc-speed.c.func-sort-c.html105
-rw-r--r--coverage-report/core/test/run-malloc-speed.c.func.html105
-rw-r--r--coverage-report/core/test/run-malloc-speed.c.gcov.html173
-rw-r--r--coverage-report/core/test/run-malloc.c.func-sort-c.html109
-rw-r--r--coverage-report/core/test/run-malloc.c.func.html109
-rw-r--r--coverage-report/core/test/run-malloc.c.gcov.html259
-rw-r--r--coverage-report/core/test/run-mem_range_is_reserved.c.func-sort-c.html117
-rw-r--r--coverage-report/core/test/run-mem_range_is_reserved.c.func.html117
-rw-r--r--coverage-report/core/test/run-mem_range_is_reserved.c.gcov.html292
-rw-r--r--coverage-report/core/test/run-mem_region.c.func-sort-c.html109
-rw-r--r--coverage-report/core/test/run-mem_region.c.func.html109
-rw-r--r--coverage-report/core/test/run-mem_region.c.gcov.html337
-rw-r--r--coverage-report/core/test/run-mem_region_init.c.func-sort-c.html117
-rw-r--r--coverage-report/core/test/run-mem_region_init.c.func.html117
-rw-r--r--coverage-report/core/test/run-mem_region_init.c.gcov.html260
-rw-r--r--coverage-report/core/test/run-mem_region_next.c.func-sort-c.html105
-rw-r--r--coverage-report/core/test/run-mem_region_next.c.func.html105
-rw-r--r--coverage-report/core/test/run-mem_region_next.c.gcov.html190
-rw-r--r--coverage-report/core/test/run-mem_region_release_unused.c.func-sort-c.html121
-rw-r--r--coverage-report/core/test/run-mem_region_release_unused.c.func.html121
-rw-r--r--coverage-report/core/test/run-mem_region_release_unused.c.gcov.html262
-rw-r--r--coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func-sort-c.html121
-rw-r--r--coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func.html121
-rw-r--r--coverage-report/core/test/run-mem_region_release_unused_noalloc.c.gcov.html241
-rw-r--r--coverage-report/core/test/run-mem_region_reservations.c.func-sort-c.html121
-rw-r--r--coverage-report/core/test/run-mem_region_reservations.c.func.html121
-rw-r--r--coverage-report/core/test/run-mem_region_reservations.c.gcov.html313
-rw-r--r--coverage-report/core/test/run-msg.c.func-sort-c.html109
-rw-r--r--coverage-report/core/test/run-msg.c.func.html109
-rw-r--r--coverage-report/core/test/run-msg.c.gcov.html366
-rw-r--r--coverage-report/core/test/run-nvram-format.c.func-sort-c.html101
-rw-r--r--coverage-report/core/test/run-nvram-format.c.func.html101
-rw-r--r--coverage-report/core/test/run-nvram-format.c.gcov.html252
-rw-r--r--coverage-report/core/test/run-pci-quirk.c.func-sort-c.html105
-rw-r--r--coverage-report/core/test/run-pci-quirk.c.func.html105
-rw-r--r--coverage-report/core/test/run-pci-quirk.c.gcov.html183
-rw-r--r--coverage-report/core/test/run-pel.c.func-sort-c.html93
-rw-r--r--coverage-report/core/test/run-pel.c.func.html93
-rw-r--r--coverage-report/core/test/run-pel.c.gcov.html205
-rw-r--r--coverage-report/core/test/run-pool.c.func-sort-c.html85
-rw-r--r--coverage-report/core/test/run-pool.c.func.html85
-rw-r--r--coverage-report/core/test/run-pool.c.gcov.html144
-rw-r--r--coverage-report/core/test/run-time-utils.c.func-sort-c.html85
-rw-r--r--coverage-report/core/test/run-time-utils.c.func.html85
-rw-r--r--coverage-report/core/test/run-time-utils.c.gcov.html137
-rw-r--r--coverage-report/core/test/run-timebase.c.func-sort-c.html85
-rw-r--r--coverage-report/core/test/run-timebase.c.func.html85
-rw-r--r--coverage-report/core/test/run-timebase.c.gcov.html132
-rw-r--r--coverage-report/core/test/run-timer.c.func-sort-c.html109
-rw-r--r--coverage-report/core/test/run-timer.c.func.html109
-rw-r--r--coverage-report/core/test/run-timer.c.gcov.html169
-rw-r--r--coverage-report/core/test/run-trace.c.func-sort-c.html125
-rw-r--r--coverage-report/core/test/run-trace.c.func.html125
-rw-r--r--coverage-report/core/test/run-trace.c.gcov.html477
-rw-r--r--coverage-report/core/test/stubs.c.func-sort-c.html105
-rw-r--r--coverage-report/core/test/stubs.c.func.html105
-rw-r--r--coverage-report/core/test/stubs.c.gcov.html186
-rw-r--r--coverage-report/core/time-utils.c.func-sort-c.html89
-rw-r--r--coverage-report/core/time-utils.c.func.html89
-rw-r--r--coverage-report/core/time-utils.c.gcov.html149
-rw-r--r--coverage-report/core/timer.c.func-sort-c.html133
-rw-r--r--coverage-report/core/timer.c.func.html133
-rw-r--r--coverage-report/core/timer.c.gcov.html383
-rw-r--r--coverage-report/core/trace.c.func-sort-c.html109
-rw-r--r--coverage-report/core/trace.c.func.html109
-rw-r--r--coverage-report/core/trace.c.gcov.html347
-rw-r--r--coverage-report/core/vpd.c.func-sort-c.html97
-rw-r--r--coverage-report/core/vpd.c.func.html97
-rw-r--r--coverage-report/core/vpd.c.gcov.html224
-rw-r--r--coverage-report/emerald.pngbin0 -> 141 bytes
-rw-r--r--coverage-report/external/ffspart/ccan/endian/endian.h.func-sort-c.html89
-rw-r--r--coverage-report/external/ffspart/ccan/endian/endian.h.func.html89
-rw-r--r--coverage-report/external/ffspart/ccan/endian/endian.h.gcov.html440
-rw-r--r--coverage-report/external/ffspart/ccan/endian/index-sort-b.html107
-rw-r--r--coverage-report/external/ffspart/ccan/endian/index-sort-f.html107
-rw-r--r--coverage-report/external/ffspart/ccan/endian/index-sort-l.html107
-rw-r--r--coverage-report/external/ffspart/ccan/endian/index.html107
-rw-r--r--coverage-report/external/ffspart/common/arch_flash_common.c.func-sort-c.html97
-rw-r--r--coverage-report/external/ffspart/common/arch_flash_common.c.func.html97
-rw-r--r--coverage-report/external/ffspart/common/arch_flash_common.c.gcov.html135
-rw-r--r--coverage-report/external/ffspart/common/arch_flash_unknown.c.func-sort-c.html89
-rw-r--r--coverage-report/external/ffspart/common/arch_flash_unknown.c.func.html89
-rw-r--r--coverage-report/external/ffspart/common/arch_flash_unknown.c.gcov.html127
-rw-r--r--coverage-report/external/ffspart/common/index-sort-b.html119
-rw-r--r--coverage-report/external/ffspart/common/index-sort-f.html119
-rw-r--r--coverage-report/external/ffspart/common/index-sort-l.html119
-rw-r--r--coverage-report/external/ffspart/common/index.html119
-rw-r--r--coverage-report/external/ffspart/ffspart.c.func-sort-c.html105
-rw-r--r--coverage-report/external/ffspart/ffspart.c.func.html105
-rw-r--r--coverage-report/external/ffspart/ffspart.c.gcov.html633
-rw-r--r--coverage-report/external/ffspart/index-sort-b.html107
-rw-r--r--coverage-report/external/ffspart/index-sort-f.html107
-rw-r--r--coverage-report/external/ffspart/index-sort-l.html107
-rw-r--r--coverage-report/external/ffspart/index.html107
-rw-r--r--coverage-report/external/ffspart/libflash/blocklevel.c.func-sort-c.html137
-rw-r--r--coverage-report/external/ffspart/libflash/blocklevel.c.func.html137
-rw-r--r--coverage-report/external/ffspart/libflash/blocklevel.c.gcov.html826
-rw-r--r--coverage-report/external/ffspart/libflash/ecc.c.func-sort-c.html105
-rw-r--r--coverage-report/external/ffspart/libflash/ecc.c.func.html105
-rw-r--r--coverage-report/external/ffspart/libflash/ecc.c.gcov.html534
-rw-r--r--coverage-report/external/ffspart/libflash/ecc.h.func-sort-c.html81
-rw-r--r--coverage-report/external/ffspart/libflash/ecc.h.func.html81
-rw-r--r--coverage-report/external/ffspart/libflash/ecc.h.gcov.html149
-rw-r--r--coverage-report/external/ffspart/libflash/file.c.func-sort-c.html133
-rw-r--r--coverage-report/external/ffspart/libflash/file.c.func.html133
-rw-r--r--coverage-report/external/ffspart/libflash/file.c.gcov.html471
-rw-r--r--coverage-report/external/ffspart/libflash/index-sort-b.html167
-rw-r--r--coverage-report/external/ffspart/libflash/index-sort-f.html167
-rw-r--r--coverage-report/external/ffspart/libflash/index-sort-l.html167
-rw-r--r--coverage-report/external/ffspart/libflash/index.html167
-rw-r--r--coverage-report/external/ffspart/libflash/libffs.c.func-sort-c.html193
-rw-r--r--coverage-report/external/ffspart/libflash/libffs.c.func.html193
-rw-r--r--coverage-report/external/ffspart/libflash/libffs.c.gcov.html927
-rw-r--r--coverage-report/external/ffspart/libflash/libflash.c.func-sort-c.html177
-rw-r--r--coverage-report/external/ffspart/libflash/libflash.c.func.html177
-rw-r--r--coverage-report/external/ffspart/libflash/libflash.c.gcov.html949
-rw-r--r--coverage-report/external/gard/ccan/endian/endian.h.func-sort-c.html89
-rw-r--r--coverage-report/external/gard/ccan/endian/endian.h.func.html89
-rw-r--r--coverage-report/external/gard/ccan/endian/endian.h.gcov.html440
-rw-r--r--coverage-report/external/gard/ccan/endian/index-sort-b.html107
-rw-r--r--coverage-report/external/gard/ccan/endian/index-sort-f.html107
-rw-r--r--coverage-report/external/gard/ccan/endian/index-sort-l.html107
-rw-r--r--coverage-report/external/gard/ccan/endian/index.html107
-rw-r--r--coverage-report/external/gard/ccan/list/index-sort-b.html107
-rw-r--r--coverage-report/external/gard/ccan/list/index-sort-f.html107
-rw-r--r--coverage-report/external/gard/ccan/list/index-sort-l.html107
-rw-r--r--coverage-report/external/gard/ccan/list/index.html107
-rw-r--r--coverage-report/external/gard/ccan/list/list.c.func-sort-c.html93
-rw-r--r--coverage-report/external/gard/ccan/list/list.c.func.html93
-rw-r--r--coverage-report/external/gard/ccan/list/list.c.gcov.html128
-rw-r--r--coverage-report/external/gard/common/arch_flash_common.c.func-sort-c.html97
-rw-r--r--coverage-report/external/gard/common/arch_flash_common.c.func.html97
-rw-r--r--coverage-report/external/gard/common/arch_flash_common.c.gcov.html135
-rw-r--r--coverage-report/external/gard/common/arch_flash_unknown.c.func-sort-c.html89
-rw-r--r--coverage-report/external/gard/common/arch_flash_unknown.c.func.html89
-rw-r--r--coverage-report/external/gard/common/arch_flash_unknown.c.gcov.html127
-rw-r--r--coverage-report/external/gard/common/index-sort-b.html119
-rw-r--r--coverage-report/external/gard/common/index-sort-f.html119
-rw-r--r--coverage-report/external/gard/common/index-sort-l.html119
-rw-r--r--coverage-report/external/gard/common/index.html119
-rw-r--r--coverage-report/external/gard/gard.c.func-sort-c.html173
-rw-r--r--coverage-report/external/gard/gard.c.func.html173
-rw-r--r--coverage-report/external/gard/gard.c.gcov.html1093
-rw-r--r--coverage-report/external/gard/index-sort-b.html107
-rw-r--r--coverage-report/external/gard/index-sort-f.html107
-rw-r--r--coverage-report/external/gard/index-sort-l.html107
-rw-r--r--coverage-report/external/gard/index.html107
-rw-r--r--coverage-report/external/gard/libflash/blocklevel.c.func-sort-c.html137
-rw-r--r--coverage-report/external/gard/libflash/blocklevel.c.func.html137
-rw-r--r--coverage-report/external/gard/libflash/blocklevel.c.gcov.html826
-rw-r--r--coverage-report/external/gard/libflash/ecc.c.func-sort-c.html105
-rw-r--r--coverage-report/external/gard/libflash/ecc.c.func.html105
-rw-r--r--coverage-report/external/gard/libflash/ecc.c.gcov.html534
-rw-r--r--coverage-report/external/gard/libflash/ecc.h.func-sort-c.html81
-rw-r--r--coverage-report/external/gard/libflash/ecc.h.func.html81
-rw-r--r--coverage-report/external/gard/libflash/ecc.h.gcov.html149
-rw-r--r--coverage-report/external/gard/libflash/file.c.func-sort-c.html133
-rw-r--r--coverage-report/external/gard/libflash/file.c.func.html133
-rw-r--r--coverage-report/external/gard/libflash/file.c.gcov.html471
-rw-r--r--coverage-report/external/gard/libflash/index-sort-b.html167
-rw-r--r--coverage-report/external/gard/libflash/index-sort-f.html167
-rw-r--r--coverage-report/external/gard/libflash/index-sort-l.html167
-rw-r--r--coverage-report/external/gard/libflash/index.html167
-rw-r--r--coverage-report/external/gard/libflash/libffs.c.func-sort-c.html193
-rw-r--r--coverage-report/external/gard/libflash/libffs.c.func.html193
-rw-r--r--coverage-report/external/gard/libflash/libffs.c.gcov.html927
-rw-r--r--coverage-report/external/gard/libflash/libflash.c.func-sort-c.html177
-rw-r--r--coverage-report/external/gard/libflash/libflash.c.func.html177
-rw-r--r--coverage-report/external/gard/libflash/libflash.c.gcov.html949
-rw-r--r--coverage-report/external/pflash/ccan/endian/endian.h.func-sort-c.html89
-rw-r--r--coverage-report/external/pflash/ccan/endian/endian.h.func.html89
-rw-r--r--coverage-report/external/pflash/ccan/endian/endian.h.gcov.html440
-rw-r--r--coverage-report/external/pflash/ccan/endian/index-sort-b.html107
-rw-r--r--coverage-report/external/pflash/ccan/endian/index-sort-f.html107
-rw-r--r--coverage-report/external/pflash/ccan/endian/index-sort-l.html107
-rw-r--r--coverage-report/external/pflash/ccan/endian/index.html107
-rw-r--r--coverage-report/external/pflash/ccan/list/index-sort-b.html107
-rw-r--r--coverage-report/external/pflash/ccan/list/index-sort-f.html107
-rw-r--r--coverage-report/external/pflash/ccan/list/index-sort-l.html107
-rw-r--r--coverage-report/external/pflash/ccan/list/index.html107
-rw-r--r--coverage-report/external/pflash/ccan/list/list.c.func-sort-c.html93
-rw-r--r--coverage-report/external/pflash/ccan/list/list.c.func.html93
-rw-r--r--coverage-report/external/pflash/ccan/list/list.c.gcov.html128
-rw-r--r--coverage-report/external/pflash/common/arch_flash_common.c.func-sort-c.html97
-rw-r--r--coverage-report/external/pflash/common/arch_flash_common.c.func.html97
-rw-r--r--coverage-report/external/pflash/common/arch_flash_common.c.gcov.html135
-rw-r--r--coverage-report/external/pflash/common/arch_flash_unknown.c.func-sort-c.html89
-rw-r--r--coverage-report/external/pflash/common/arch_flash_unknown.c.func.html89
-rw-r--r--coverage-report/external/pflash/common/arch_flash_unknown.c.gcov.html127
-rw-r--r--coverage-report/external/pflash/common/index-sort-b.html119
-rw-r--r--coverage-report/external/pflash/common/index-sort-f.html119
-rw-r--r--coverage-report/external/pflash/common/index-sort-l.html119
-rw-r--r--coverage-report/external/pflash/common/index.html119
-rw-r--r--coverage-report/external/pflash/index-sort-b.html119
-rw-r--r--coverage-report/external/pflash/index-sort-f.html119
-rw-r--r--coverage-report/external/pflash/index-sort-l.html119
-rw-r--r--coverage-report/external/pflash/index.html119
-rw-r--r--coverage-report/external/pflash/libflash/blocklevel.c.func-sort-c.html137
-rw-r--r--coverage-report/external/pflash/libflash/blocklevel.c.func.html137
-rw-r--r--coverage-report/external/pflash/libflash/blocklevel.c.gcov.html826
-rw-r--r--coverage-report/external/pflash/libflash/ecc.c.func-sort-c.html105
-rw-r--r--coverage-report/external/pflash/libflash/ecc.c.func.html105
-rw-r--r--coverage-report/external/pflash/libflash/ecc.c.gcov.html534
-rw-r--r--coverage-report/external/pflash/libflash/ecc.h.func-sort-c.html81
-rw-r--r--coverage-report/external/pflash/libflash/ecc.h.func.html81
-rw-r--r--coverage-report/external/pflash/libflash/ecc.h.gcov.html149
-rw-r--r--coverage-report/external/pflash/libflash/file.c.func-sort-c.html133
-rw-r--r--coverage-report/external/pflash/libflash/file.c.func.html133
-rw-r--r--coverage-report/external/pflash/libflash/file.c.gcov.html471
-rw-r--r--coverage-report/external/pflash/libflash/index-sort-b.html167
-rw-r--r--coverage-report/external/pflash/libflash/index-sort-f.html167
-rw-r--r--coverage-report/external/pflash/libflash/index-sort-l.html167
-rw-r--r--coverage-report/external/pflash/libflash/index.html167
-rw-r--r--coverage-report/external/pflash/libflash/libffs.c.func-sort-c.html193
-rw-r--r--coverage-report/external/pflash/libflash/libffs.c.func.html193
-rw-r--r--coverage-report/external/pflash/libflash/libffs.c.gcov.html927
-rw-r--r--coverage-report/external/pflash/libflash/libflash.c.func-sort-c.html177
-rw-r--r--coverage-report/external/pflash/libflash/libflash.c.func.html177
-rw-r--r--coverage-report/external/pflash/libflash/libflash.c.gcov.html949
-rw-r--r--coverage-report/external/pflash/pflash.c.func-sort-c.html145
-rw-r--r--coverage-report/external/pflash/pflash.c.func.html145
-rw-r--r--coverage-report/external/pflash/pflash.c.gcov.html1315
-rw-r--r--coverage-report/external/pflash/progress.c.func-sort-c.html93
-rw-r--r--coverage-report/external/pflash/progress.c.func.html93
-rw-r--r--coverage-report/external/pflash/progress.c.gcov.html177
-rw-r--r--coverage-report/external/trace/index-sort-b.html107
-rw-r--r--coverage-report/external/trace/index-sort-f.html107
-rw-r--r--coverage-report/external/trace/index-sort-l.html107
-rw-r--r--coverage-report/external/trace/index.html107
-rw-r--r--coverage-report/external/trace/trace.c.func-sort-c.html89
-rw-r--r--coverage-report/external/trace/trace.c.func.html89
-rw-r--r--coverage-report/external/trace/trace.c.gcov.html195
-rw-r--r--coverage-report/gcov.css519
-rw-r--r--coverage-report/glass.pngbin0 -> 167 bytes
-rw-r--r--coverage-report/hdata/cpu-common.c.func-sort-c.html113
-rw-r--r--coverage-report/hdata/cpu-common.c.func.html113
-rw-r--r--coverage-report/hdata/cpu-common.c.gcov.html421
-rw-r--r--coverage-report/hdata/fsp.c.func-sort-c.html125
-rw-r--r--coverage-report/hdata/fsp.c.func.html125
-rw-r--r--coverage-report/hdata/fsp.c.gcov.html637
-rw-r--r--coverage-report/hdata/hdif.c.func-sort-c.html109
-rw-r--r--coverage-report/hdata/hdif.c.func.html109
-rw-r--r--coverage-report/hdata/hdif.c.gcov.html290
-rw-r--r--coverage-report/hdata/hdif.h.func-sort-c.html85
-rw-r--r--coverage-report/hdata/hdif.h.func.html85
-rw-r--r--coverage-report/hdata/hdif.h.gcov.html231
-rw-r--r--coverage-report/hdata/hostservices.c.func-sort-c.html93
-rw-r--r--coverage-report/hdata/hostservices.c.func.html93
-rw-r--r--coverage-report/hdata/hostservices.c.gcov.html169
-rw-r--r--coverage-report/hdata/i2c.c.func-sort-c.html105
-rw-r--r--coverage-report/hdata/i2c.c.func.html105
-rw-r--r--coverage-report/hdata/i2c.c.gcov.html445
-rw-r--r--coverage-report/hdata/index-sort-b.html275
-rw-r--r--coverage-report/hdata/index-sort-f.html275
-rw-r--r--coverage-report/hdata/index-sort-l.html275
-rw-r--r--coverage-report/hdata/index.html275
-rw-r--r--coverage-report/hdata/iohub.c.func-sort-c.html161
-rw-r--r--coverage-report/hdata/iohub.c.func.html161
-rw-r--r--coverage-report/hdata/iohub.c.gcov.html971
-rw-r--r--coverage-report/hdata/memory.c.func-sort-c.html157
-rw-r--r--coverage-report/hdata/memory.c.func.html157
-rw-r--r--coverage-report/hdata/memory.c.gcov.html1041
-rw-r--r--coverage-report/hdata/pcia.c.func-sort-c.html101
-rw-r--r--coverage-report/hdata/pcia.c.func.html101
-rw-r--r--coverage-report/hdata/pcia.c.gcov.html311
-rw-r--r--coverage-report/hdata/slca.c.func-sort-c.html105
-rw-r--r--coverage-report/hdata/slca.c.func.html105
-rw-r--r--coverage-report/hdata/slca.c.gcov.html245
-rw-r--r--coverage-report/hdata/spira.c.func-sort-c.html221
-rw-r--r--coverage-report/hdata/spira.c.func.html221
-rw-r--r--coverage-report/hdata/spira.c.gcov.html1889
-rw-r--r--coverage-report/hdata/spira.h.func-sort-c.html85
-rw-r--r--coverage-report/hdata/spira.h.func.html85
-rw-r--r--coverage-report/hdata/spira.h.gcov.html1321
-rw-r--r--coverage-report/hdata/test/hdata_to_dt.c.func-sort-c.html137
-rw-r--r--coverage-report/hdata/test/hdata_to_dt.c.func.html137
-rw-r--r--coverage-report/hdata/test/hdata_to_dt.c.gcov.html520
-rw-r--r--coverage-report/hdata/test/index-sort-b.html107
-rw-r--r--coverage-report/hdata/test/index-sort-f.html107
-rw-r--r--coverage-report/hdata/test/index-sort-l.html107
-rw-r--r--coverage-report/hdata/test/index.html107
-rw-r--r--coverage-report/hdata/tpmrel.c.func-sort-c.html101
-rw-r--r--coverage-report/hdata/tpmrel.c.func.html101
-rw-r--r--coverage-report/hdata/tpmrel.c.gcov.html305
-rw-r--r--coverage-report/hdata/vpd-common.c.func-sort-c.html85
-rw-r--r--coverage-report/hdata/vpd-common.c.func.html85
-rw-r--r--coverage-report/hdata/vpd-common.c.gcov.html110
-rw-r--r--coverage-report/hdata/vpd.c.func-sort-c.html157
-rw-r--r--coverage-report/hdata/vpd.c.func.html157
-rw-r--r--coverage-report/hdata/vpd.c.gcov.html851
-rw-r--r--coverage-report/hw/index-sort-b.html119
-rw-r--r--coverage-report/hw/index-sort-f.html119
-rw-r--r--coverage-report/hw/index-sort-l.html119
-rw-r--r--coverage-report/hw/index.html119
-rw-r--r--coverage-report/hw/ipmi/index-sort-b.html107
-rw-r--r--coverage-report/hw/ipmi/index-sort-f.html107
-rw-r--r--coverage-report/hw/ipmi/index-sort-l.html107
-rw-r--r--coverage-report/hw/ipmi/index.html107
-rw-r--r--coverage-report/hw/ipmi/ipmi-fru.c.func-sort-c.html109
-rw-r--r--coverage-report/hw/ipmi/ipmi-fru.c.func.html109
-rw-r--r--coverage-report/hw/ipmi/ipmi-fru.c.gcov.html316
-rw-r--r--coverage-report/hw/ipmi/test/index-sort-b.html107
-rw-r--r--coverage-report/hw/ipmi/test/index-sort-f.html107
-rw-r--r--coverage-report/hw/ipmi/test/index-sort-l.html107
-rw-r--r--coverage-report/hw/ipmi/test/index.html107
-rw-r--r--coverage-report/hw/ipmi/test/run-fru.c.func-sort-c.html105
-rw-r--r--coverage-report/hw/ipmi/test/run-fru.c.func.html105
-rw-r--r--coverage-report/hw/ipmi/test/run-fru.c.gcov.html201
-rw-r--r--coverage-report/hw/lpc-port80h.c.func-sort-c.html93
-rw-r--r--coverage-report/hw/lpc-port80h.c.func.html93
-rw-r--r--coverage-report/hw/lpc-port80h.c.gcov.html258
-rw-r--r--coverage-report/hw/phys-map.c.func-sort-c.html93
-rw-r--r--coverage-report/hw/phys-map.c.func.html93
-rw-r--r--coverage-report/hw/phys-map.c.gcov.html431
-rw-r--r--coverage-report/hw/test/index-sort-b.html119
-rw-r--r--coverage-report/hw/test/index-sort-f.html119
-rw-r--r--coverage-report/hw/test/index-sort-l.html119
-rw-r--r--coverage-report/hw/test/index.html119
-rw-r--r--coverage-report/hw/test/phys-map-test.c.func-sort-c.html101
-rw-r--r--coverage-report/hw/test/phys-map-test.c.func.html101
-rw-r--r--coverage-report/hw/test/phys-map-test.c.gcov.html271
-rw-r--r--coverage-report/hw/test/run-port80h.c.func-sort-c.html89
-rw-r--r--coverage-report/hw/test/run-port80h.c.func.html89
-rw-r--r--coverage-report/hw/test/run-port80h.c.gcov.html184
-rw-r--r--coverage-report/include/bitmap.h.func-sort-c.html93
-rw-r--r--coverage-report/include/bitmap.h.func.html93
-rw-r--r--coverage-report/include/bitmap.h.gcov.html141
-rw-r--r--coverage-report/include/chip.h.func-sort-c.html85
-rw-r--r--coverage-report/include/chip.h.func.html85
-rw-r--r--coverage-report/include/chip.h.gcov.html365
-rw-r--r--coverage-report/include/compiler.h.func-sort-c.html85
-rw-r--r--coverage-report/include/compiler.h.func.html85
-rw-r--r--coverage-report/include/compiler.h.gcov.html126
-rw-r--r--coverage-report/include/device.h.func-sort-c.html97
-rw-r--r--coverage-report/include/device.h.func.html97
-rw-r--r--coverage-report/include/device.h.gcov.html353
-rw-r--r--coverage-report/include/index-sort-b.html227
-rw-r--r--coverage-report/include/index-sort-f.html227
-rw-r--r--coverage-report/include/index-sort-l.html227
-rw-r--r--coverage-report/include/index.html227
-rw-r--r--coverage-report/include/lock.h.func-sort-c.html85
-rw-r--r--coverage-report/include/lock.h.func.html85
-rw-r--r--coverage-report/include/lock.h.gcov.html191
-rw-r--r--coverage-report/include/opal-internal.h.func-sort-c.html85
-rw-r--r--coverage-report/include/opal-internal.h.func.html85
-rw-r--r--coverage-report/include/opal-internal.h.gcov.html191
-rw-r--r--coverage-report/include/pci.h.func-sort-c.html85
-rw-r--r--coverage-report/include/pci.h.func.html85
-rw-r--r--coverage-report/include/pci.h.gcov.html591
-rw-r--r--coverage-report/include/processor.h.func-sort-c.html89
-rw-r--r--coverage-report/include/processor.h.func.html89
-rw-r--r--coverage-report/include/processor.h.gcov.html504
-rw-r--r--coverage-report/include/skiboot.h.func-sort-c.html89
-rw-r--r--coverage-report/include/skiboot.h.func.html89
-rw-r--r--coverage-report/include/skiboot.h.gcov.html433
-rw-r--r--coverage-report/include/time-utils.h.func-sort-c.html93
-rw-r--r--coverage-report/include/time-utils.h.func.html93
-rw-r--r--coverage-report/include/time-utils.h.gcov.html116
-rw-r--r--coverage-report/include/timebase.h.func-sort-c.html113
-rw-r--r--coverage-report/include/timebase.h.func.html113
-rw-r--r--coverage-report/include/timebase.h.gcov.html181
-rw-r--r--coverage-report/index-sort-b.html767
-rw-r--r--coverage-report/index-sort-f.html767
-rw-r--r--coverage-report/index-sort-l.html767
-rw-r--r--coverage-report/index.html767
-rw-r--r--coverage-report/libc/ctype/index-sort-b.html167
-rw-r--r--coverage-report/libc/ctype/index-sort-f.html167
-rw-r--r--coverage-report/libc/ctype/index-sort-l.html167
-rw-r--r--coverage-report/libc/ctype/index.html167
-rw-r--r--coverage-report/libc/ctype/isdigit.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/ctype/isdigit.c.func.html85
-rw-r--r--coverage-report/libc/ctype/isdigit.c.gcov.html111
-rw-r--r--coverage-report/libc/ctype/isprint.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/ctype/isprint.c.func.html85
-rw-r--r--coverage-report/libc/ctype/isprint.c.gcov.html104
-rw-r--r--coverage-report/libc/ctype/isspace.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/ctype/isspace.c.func.html85
-rw-r--r--coverage-report/libc/ctype/isspace.c.gcov.html115
-rw-r--r--coverage-report/libc/ctype/isxdigit.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/ctype/isxdigit.c.func.html85
-rw-r--r--coverage-report/libc/ctype/isxdigit.c.gcov.html107
-rw-r--r--coverage-report/libc/ctype/tolower.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/ctype/tolower.c.func.html85
-rw-r--r--coverage-report/libc/ctype/tolower.c.gcov.html104
-rw-r--r--coverage-report/libc/ctype/toupper.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/ctype/toupper.c.func.html85
-rw-r--r--coverage-report/libc/ctype/toupper.c.gcov.html106
-rw-r--r--coverage-report/libc/index-sort-b.html107
-rw-r--r--coverage-report/libc/index-sort-f.html107
-rw-r--r--coverage-report/libc/index-sort-l.html107
-rw-r--r--coverage-report/libc/index.html107
-rw-r--r--coverage-report/libc/stdio/index-sort-b.html119
-rw-r--r--coverage-report/libc/stdio/index-sort-f.html119
-rw-r--r--coverage-report/libc/stdio/index-sort-l.html119
-rw-r--r--coverage-report/libc/stdio/index.html119
-rw-r--r--coverage-report/libc/stdio/snprintf.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/stdio/snprintf.c.func.html85
-rw-r--r--coverage-report/libc/stdio/snprintf.c.gcov.html115
-rw-r--r--coverage-report/libc/stdio/vsnprintf.c.func-sort-c.html109
-rw-r--r--coverage-report/libc/stdio/vsnprintf.c.func.html109
-rw-r--r--coverage-report/libc/stdio/vsnprintf.c.gcov.html385
-rw-r--r--coverage-report/libc/stdlib/atoi.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/stdlib/atoi.c.func.html85
-rw-r--r--coverage-report/libc/stdlib/atoi.c.gcov.html103
-rw-r--r--coverage-report/libc/stdlib/atol.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/stdlib/atol.c.func.html85
-rw-r--r--coverage-report/libc/stdlib/atol.c.gcov.html103
-rw-r--r--coverage-report/libc/stdlib/index-sort-b.html155
-rw-r--r--coverage-report/libc/stdlib/index-sort-f.html155
-rw-r--r--coverage-report/libc/stdlib/index-sort-l.html155
-rw-r--r--coverage-report/libc/stdlib/index.html155
-rw-r--r--coverage-report/libc/stdlib/rand.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/stdlib/rand.c.func.html85
-rw-r--r--coverage-report/libc/stdlib/rand.c.gcov.html109
-rw-r--r--coverage-report/libc/stdlib/strtol.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/stdlib/strtol.c.func.html85
-rw-r--r--coverage-report/libc/stdlib/strtol.c.gcov.html198
-rw-r--r--coverage-report/libc/stdlib/strtoul.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/stdlib/strtoul.c.func.html85
-rw-r--r--coverage-report/libc/stdlib/strtoul.c.gcov.html188
-rw-r--r--coverage-report/libc/string/index-sort-b.html311
-rw-r--r--coverage-report/libc/string/index-sort-f.html311
-rw-r--r--coverage-report/libc/string/index-sort-l.html311
-rw-r--r--coverage-report/libc/string/index.html311
-rw-r--r--coverage-report/libc/string/memchr.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/memchr.c.func.html85
-rw-r--r--coverage-report/libc/string/memchr.c.gcov.html113
-rw-r--r--coverage-report/libc/string/memcmp.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/memcmp.c.func.html85
-rw-r--r--coverage-report/libc/string/memcmp.c.gcov.html114
-rw-r--r--coverage-report/libc/string/memcpy.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/memcpy.c.func.html85
-rw-r--r--coverage-report/libc/string/memcpy.c.gcov.html121
-rw-r--r--coverage-report/libc/string/memmove.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/memmove.c.func.html85
-rw-r--r--coverage-report/libc/string/memmove.c.gcov.html121
-rw-r--r--coverage-report/libc/string/memset.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/memset.c.func.html85
-rw-r--r--coverage-report/libc/string/memset.c.gcov.html139
-rw-r--r--coverage-report/libc/string/strcasecmp.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strcasecmp.c.func.html85
-rw-r--r--coverage-report/libc/string/strcasecmp.c.gcov.html112
-rw-r--r--coverage-report/libc/string/strcat.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strcat.c.func.html85
-rw-r--r--coverage-report/libc/string/strcat.c.gcov.html111
-rw-r--r--coverage-report/libc/string/strchr.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strchr.c.func.html85
-rw-r--r--coverage-report/libc/string/strchr.c.gcov.html113
-rw-r--r--coverage-report/libc/string/strcmp.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strcmp.c.func.html85
-rw-r--r--coverage-report/libc/string/strcmp.c.gcov.html110
-rw-r--r--coverage-report/libc/string/strcpy.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strcpy.c.func.html85
-rw-r--r--coverage-report/libc/string/strcpy.c.gcov.html108
-rw-r--r--coverage-report/libc/string/strdup.c.func-sort-c.html81
-rw-r--r--coverage-report/libc/string/strdup.c.func.html81
-rw-r--r--coverage-report/libc/string/strdup.c.gcov.html112
-rw-r--r--coverage-report/libc/string/strlen.c.func-sort-c.html89
-rw-r--r--coverage-report/libc/string/strlen.c.func.html89
-rw-r--r--coverage-report/libc/string/strlen.c.gcov.html125
-rw-r--r--coverage-report/libc/string/strncasecmp.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strncasecmp.c.func.html85
-rw-r--r--coverage-report/libc/string/strncasecmp.c.gcov.html115
-rw-r--r--coverage-report/libc/string/strncmp.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strncmp.c.func.html85
-rw-r--r--coverage-report/libc/string/strncmp.c.gcov.html115
-rw-r--r--coverage-report/libc/string/strncpy.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strncpy.c.func.html85
-rw-r--r--coverage-report/libc/string/strncpy.c.gcov.html118
-rw-r--r--coverage-report/libc/string/strrchr.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strrchr.c.func.html85
-rw-r--r--coverage-report/libc/string/strrchr.c.gcov.html113
-rw-r--r--coverage-report/libc/string/strstr.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strstr.c.func.html85
-rw-r--r--coverage-report/libc/string/strstr.c.gcov.html124
-rw-r--r--coverage-report/libc/string/strtok.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/string/strtok.c.func.html85
-rw-r--r--coverage-report/libc/string/strtok.c.gcov.html133
-rw-r--r--coverage-report/libc/test/index-sort-b.html191
-rw-r--r--coverage-report/libc/test/index-sort-f.html191
-rw-r--r--coverage-report/libc/test/index-sort-l.html191
-rw-r--r--coverage-report/libc/test/index.html191
-rw-r--r--coverage-report/libc/test/run-ctype-test.c.func-sort-c.html105
-rw-r--r--coverage-report/libc/test/run-ctype-test.c.func.html105
-rw-r--r--coverage-report/libc/test/run-ctype-test.c.gcov.html141
-rw-r--r--coverage-report/libc/test/run-ctype.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/test/run-ctype.c.func.html85
-rw-r--r--coverage-report/libc/test/run-ctype.c.gcov.html180
-rw-r--r--coverage-report/libc/test/run-memops-test.c.func-sort-c.html117
-rw-r--r--coverage-report/libc/test/run-memops-test.c.func.html117
-rw-r--r--coverage-report/libc/test/run-memops-test.c.gcov.html182
-rw-r--r--coverage-report/libc/test/run-memops.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/test/run-memops.c.func.html85
-rw-r--r--coverage-report/libc/test/run-memops.c.gcov.html183
-rw-r--r--coverage-report/libc/test/run-snprintf-test.c.func-sort-c.html89
-rw-r--r--coverage-report/libc/test/run-snprintf-test.c.func.html89
-rw-r--r--coverage-report/libc/test/run-snprintf-test.c.gcov.html127
-rw-r--r--coverage-report/libc/test/run-snprintf.c.func-sort-c.html121
-rw-r--r--coverage-report/libc/test/run-snprintf.c.func.html121
-rw-r--r--coverage-report/libc/test/run-snprintf.c.gcov.html331
-rw-r--r--coverage-report/libc/test/run-stdlib.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/test/run-stdlib.c.func.html85
-rw-r--r--coverage-report/libc/test/run-stdlib.c.gcov.html170
-rw-r--r--coverage-report/libc/test/run-time.c.func-sort-c.html85
-rw-r--r--coverage-report/libc/test/run-time.c.func.html85
-rw-r--r--coverage-report/libc/test/run-time.c.gcov.html171
-rw-r--r--coverage-report/libc/time.c.func-sort-c.html101
-rw-r--r--coverage-report/libc/time.c.func.html101
-rw-r--r--coverage-report/libc/time.c.gcov.html227
-rw-r--r--coverage-report/libfdt/fdt.c.func-sort-c.html137
-rw-r--r--coverage-report/libfdt/fdt.c.func.html137
-rw-r--r--coverage-report/libfdt/fdt.c.gcov.html416
-rw-r--r--coverage-report/libfdt/fdt_ro.c.func-sort-c.html245
-rw-r--r--coverage-report/libfdt/fdt_ro.c.func.html245
-rw-r--r--coverage-report/libfdt/fdt_ro.c.gcov.html1027
-rw-r--r--coverage-report/libfdt/fdt_strerror.c.func-sort-c.html85
-rw-r--r--coverage-report/libfdt/fdt_strerror.c.func.html85
-rw-r--r--coverage-report/libfdt/fdt_strerror.c.gcov.html188
-rw-r--r--coverage-report/libfdt/fdt_sw.c.func-sort-c.html153
-rw-r--r--coverage-report/libfdt/fdt_sw.c.func.html153
-rw-r--r--coverage-report/libfdt/fdt_sw.c.gcov.html506
-rw-r--r--coverage-report/libfdt/index-sort-b.html179
-rw-r--r--coverage-report/libfdt/index-sort-f.html179
-rw-r--r--coverage-report/libfdt/index-sort-l.html179
-rw-r--r--coverage-report/libfdt/index.html179
-rw-r--r--coverage-report/libfdt/libfdt.h.func-sort-c.html137
-rw-r--r--coverage-report/libfdt/libfdt.h.func.html137
-rw-r--r--coverage-report/libfdt/libfdt.h.gcov.html2201
-rw-r--r--coverage-report/libfdt/libfdt_env.h.func-sort-c.html97
-rw-r--r--coverage-report/libfdt/libfdt_env.h.func.html97
-rw-r--r--coverage-report/libfdt/libfdt_env.h.gcov.html226
-rw-r--r--coverage-report/libfdt/libfdt_internal.h.func-sort-c.html93
-rw-r--r--coverage-report/libfdt/libfdt_internal.h.func.html93
-rw-r--r--coverage-report/libfdt/libfdt_internal.h.gcov.html181
-rw-r--r--coverage-report/libflash/blocklevel.c.func-sort-c.html141
-rw-r--r--coverage-report/libflash/blocklevel.c.func.html141
-rw-r--r--coverage-report/libflash/blocklevel.c.gcov.html826
-rw-r--r--coverage-report/libflash/ecc.c.func-sort-c.html133
-rw-r--r--coverage-report/libflash/ecc.c.func.html133
-rw-r--r--coverage-report/libflash/ecc.c.gcov.html534
-rw-r--r--coverage-report/libflash/ecc.h.func-sort-c.html97
-rw-r--r--coverage-report/libflash/ecc.h.func.html97
-rw-r--r--coverage-report/libflash/ecc.h.gcov.html149
-rw-r--r--coverage-report/libflash/file.c.func-sort-c.html133
-rw-r--r--coverage-report/libflash/file.c.func.html133
-rw-r--r--coverage-report/libflash/file.c.gcov.html471
-rw-r--r--coverage-report/libflash/index-sort-b.html191
-rw-r--r--coverage-report/libflash/index-sort-f.html191
-rw-r--r--coverage-report/libflash/index-sort-l.html191
-rw-r--r--coverage-report/libflash/index.html191
-rw-r--r--coverage-report/libflash/ipmi-hiomap.c.func-sort-c.html185
-rw-r--r--coverage-report/libflash/ipmi-hiomap.c.func.html185
-rw-r--r--coverage-report/libflash/ipmi-hiomap.c.gcov.html1097
-rw-r--r--coverage-report/libflash/libffs.c.func-sort-c.html193
-rw-r--r--coverage-report/libflash/libffs.c.func.html193
-rw-r--r--coverage-report/libflash/libffs.c.gcov.html927
-rw-r--r--coverage-report/libflash/libflash.c.func-sort-c.html177
-rw-r--r--coverage-report/libflash/libflash.c.func.html177
-rw-r--r--coverage-report/libflash/libflash.c.gcov.html949
-rw-r--r--coverage-report/libflash/mbox-flash.c.func-sort-c.html273
-rw-r--r--coverage-report/libflash/mbox-flash.c.func.html273
-rw-r--r--coverage-report/libflash/mbox-flash.c.gcov.html1284
-rw-r--r--coverage-report/libflash/test/index-sort-b.html179
-rw-r--r--coverage-report/libflash/test/index-sort-f.html179
-rw-r--r--coverage-report/libflash/test/index-sort-l.html179
-rw-r--r--coverage-report/libflash/test/index.html179
-rw-r--r--coverage-report/libflash/test/mbox-server.c.func-sort-c.html157
-rw-r--r--coverage-report/libflash/test/mbox-server.c.func.html157
-rw-r--r--coverage-report/libflash/test/mbox-server.c.gcov.html599
-rw-r--r--coverage-report/libflash/test/stubs.c.func-sort-c.html129
-rw-r--r--coverage-report/libflash/test/stubs.c.func.html129
-rw-r--r--coverage-report/libflash/test/stubs.c.gcov.html187
-rw-r--r--coverage-report/libflash/test/test-blocklevel.c.func-sort-c.html121
-rw-r--r--coverage-report/libflash/test/test-blocklevel.c.func.html121
-rw-r--r--coverage-report/libflash/test/test-blocklevel.c.gcov.html749
-rw-r--r--coverage-report/libflash/test/test-ecc.c.func-sort-c.html85
-rw-r--r--coverage-report/libflash/test/test-ecc.c.func.html85
-rw-r--r--coverage-report/libflash/test/test-ecc.c.gcov.html595
-rw-r--r--coverage-report/libflash/test/test-flash.c.func-sort-c.html125
-rw-r--r--coverage-report/libflash/test/test-flash.c.func.html125
-rw-r--r--coverage-report/libflash/test/test-flash.c.gcov.html533
-rw-r--r--coverage-report/libflash/test/test-ipmi-hiomap.c.func-sort-c.html357
-rw-r--r--coverage-report/libflash/test/test-ipmi-hiomap.c.func.html357
-rw-r--r--coverage-report/libflash/test/test-ipmi-hiomap.c.gcov.html3473
-rw-r--r--coverage-report/libflash/test/test-mbox.c.func-sort-c.html93
-rw-r--r--coverage-report/libflash/test/test-mbox.c.func.html93
-rw-r--r--coverage-report/libflash/test/test-mbox.c.gcov.html418
-rw-r--r--coverage-report/libstb/container.c.func-sort-c.html105
-rw-r--r--coverage-report/libstb/container.c.func.html105
-rw-r--r--coverage-report/libstb/container.c.gcov.html167
-rw-r--r--coverage-report/libstb/crypto/pkcs7/index-sort-b.html107
-rw-r--r--coverage-report/libstb/crypto/pkcs7/index-sort-f.html107
-rw-r--r--coverage-report/libstb/crypto/pkcs7/index-sort-l.html107
-rw-r--r--coverage-report/libstb/crypto/pkcs7/index.html107
-rw-r--r--coverage-report/libstb/crypto/pkcs7/pkcs7.c.func-sort-c.html137
-rw-r--r--coverage-report/libstb/crypto/pkcs7/pkcs7.c.func.html137
-rw-r--r--coverage-report/libstb/crypto/pkcs7/pkcs7.c.gcov.html681
-rw-r--r--coverage-report/libstb/index-sort-b.html107
-rw-r--r--coverage-report/libstb/index-sort-f.html107
-rw-r--r--coverage-report/libstb/index-sort-l.html107
-rw-r--r--coverage-report/libstb/index.html107
-rw-r--r--coverage-report/libstb/secvar/backend/edk2-compat-process.c.func-sort-c.html161
-rw-r--r--coverage-report/libstb/secvar/backend/edk2-compat-process.c.func.html161
-rw-r--r--coverage-report/libstb/secvar/backend/edk2-compat-process.c.gcov.html850
-rw-r--r--coverage-report/libstb/secvar/backend/edk2-compat.c.func-sort-c.html97
-rw-r--r--coverage-report/libstb/secvar/backend/edk2-compat.c.func.html97
-rw-r--r--coverage-report/libstb/secvar/backend/edk2-compat.c.gcov.html381
-rw-r--r--coverage-report/libstb/secvar/backend/index-sort-b.html119
-rw-r--r--coverage-report/libstb/secvar/backend/index-sort-f.html119
-rw-r--r--coverage-report/libstb/secvar/backend/index-sort-l.html119
-rw-r--r--coverage-report/libstb/secvar/backend/index.html119
-rw-r--r--coverage-report/libstb/secvar/index-sort-b.html119
-rw-r--r--coverage-report/libstb/secvar/index-sort-f.html119
-rw-r--r--coverage-report/libstb/secvar/index-sort-l.html119
-rw-r--r--coverage-report/libstb/secvar/index.html119
-rw-r--r--coverage-report/libstb/secvar/secvar_api.c.func-sort-c.html93
-rw-r--r--coverage-report/libstb/secvar/secvar_api.c.func.html93
-rw-r--r--coverage-report/libstb/secvar/secvar_api.c.gcov.html242
-rw-r--r--coverage-report/libstb/secvar/secvar_util.c.func-sort-c.html117
-rw-r--r--coverage-report/libstb/secvar/secvar_util.c.func.html117
-rw-r--r--coverage-report/libstb/secvar/secvar_util.c.gcov.html243
-rw-r--r--coverage-report/libstb/secvar/storage/fakenv_ops.c.func-sort-c.html117
-rw-r--r--coverage-report/libstb/secvar/storage/fakenv_ops.c.func.html117
-rw-r--r--coverage-report/libstb/secvar/storage/fakenv_ops.c.gcov.html260
-rw-r--r--coverage-report/libstb/secvar/storage/index-sort-b.html119
-rw-r--r--coverage-report/libstb/secvar/storage/index-sort-f.html119
-rw-r--r--coverage-report/libstb/secvar/storage/index-sort-l.html119
-rw-r--r--coverage-report/libstb/secvar/storage/index.html119
-rw-r--r--coverage-report/libstb/secvar/storage/secboot_tpm.c.func-sort-c.html153
-rw-r--r--coverage-report/libstb/secvar/storage/secboot_tpm.c.func.html153
-rw-r--r--coverage-report/libstb/secvar/storage/secboot_tpm.c.gcov.html822
-rw-r--r--coverage-report/libstb/secvar/test/index-sort-b.html179
-rw-r--r--coverage-report/libstb/secvar/test/index-sort-f.html179
-rw-r--r--coverage-report/libstb/secvar/test/index-sort-l.html179
-rw-r--r--coverage-report/libstb/secvar/test/index.html179
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func-sort-c.html109
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func.html109
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.gcov.html565
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func-sort-c.html89
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func.html89
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-enqueue.c.gcov.html233
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-getvar.c.func-sort-c.html85
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-getvar.c.func.html85
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-getvar.c.gcov.html174
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func-sort-c.html85
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func.html85
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-nextvar.c.gcov.html191
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func-sort-c.html105
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func.html105
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.gcov.html226
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-void.c.func-sort-c.html85
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-void.c.func.html85
-rw-r--r--coverage-report/libstb/secvar/test/secvar-test-void.c.gcov.html97
-rw-r--r--coverage-report/libstb/secvar/test/secvar_api_test.c.func-sort-c.html97
-rw-r--r--coverage-report/libstb/secvar/test/secvar_api_test.c.func.html97
-rw-r--r--coverage-report/libstb/secvar/test/secvar_api_test.c.gcov.html163
-rw-r--r--coverage-report/libstb/test/index-sort-b.html107
-rw-r--r--coverage-report/libstb/test/index-sort-f.html107
-rw-r--r--coverage-report/libstb/test/index-sort-l.html107
-rw-r--r--coverage-report/libstb/test/index.html107
-rw-r--r--coverage-report/libstb/test/run-stb-container.c.func-sort-c.html85
-rw-r--r--coverage-report/libstb/test/run-stb-container.c.func.html85
-rw-r--r--coverage-report/libstb/test/run-stb-container.c.gcov.html106
-rw-r--r--coverage-report/ruby.pngbin0 -> 141 bytes
-rw-r--r--coverage-report/snow.pngbin0 -> 141 bytes
-rw-r--r--coverage-report/test/dt_common.c.func-sort-c.html93
-rw-r--r--coverage-report/test/dt_common.c.func.html93
-rw-r--r--coverage-report/test/dt_common.c.gcov.html144
-rw-r--r--coverage-report/test/index-sort-b.html107
-rw-r--r--coverage-report/test/index-sort-f.html107
-rw-r--r--coverage-report/test/index-sort-l.html107
-rw-r--r--coverage-report/test/index.html107
-rw-r--r--coverage-report/updown.pngbin0 -> 117 bytes
-rw-r--r--coverage-report/usr/include/bits/byteswap.h.func-sort-c.html85
-rw-r--r--coverage-report/usr/include/bits/byteswap.h.func.html85
-rw-r--r--coverage-report/usr/include/bits/byteswap.h.gcov.html164
-rw-r--r--coverage-report/usr/include/bits/index-sort-b.html119
-rw-r--r--coverage-report/usr/include/bits/index-sort-f.html119
-rw-r--r--coverage-report/usr/include/bits/index-sort-l.html119
-rw-r--r--coverage-report/usr/include/bits/index.html119
-rw-r--r--coverage-report/usr/include/bits/stdio.h.func-sort-c.html81
-rw-r--r--coverage-report/usr/include/bits/stdio.h.func.html81
-rw-r--r--coverage-report/usr/include/bits/stdio.h.gcov.html280
-rw-r--r--coverage-report/usr/include/sys/index-sort-b.html107
-rw-r--r--coverage-report/usr/include/sys/index-sort-f.html107
-rw-r--r--coverage-report/usr/include/sys/index-sort-l.html107
-rw-r--r--coverage-report/usr/include/sys/index.html107
-rw-r--r--coverage-report/usr/include/sys/stat.h.func-sort-c.html81
-rw-r--r--coverage-report/usr/include/sys/stat.h.func.html81
-rw-r--r--coverage-report/usr/include/sys/stat.h.gcov.html622
895 files changed, 164676 insertions, 0 deletions
diff --git a/coverage-report/amber.png b/coverage-report/amber.png
new file mode 100644
index 0000000..2cab170
--- /dev/null
+++ b/coverage-report/amber.png
Binary files differ
diff --git a/coverage-report/ccan/array_size/test/index-sort-b.html b/coverage-report/ccan/array_size/test/index-sort-b.html
new file mode 100644
index 0000000..719cd7c
--- /dev/null
+++ b/coverage-report/ccan/array_size/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/array_size/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/array_size/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/array_size/test/index-sort-f.html b/coverage-report/ccan/array_size/test/index-sort-f.html
new file mode 100644
index 0000000..007ceb9
--- /dev/null
+++ b/coverage-report/ccan/array_size/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/array_size/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/array_size/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/array_size/test/index-sort-l.html b/coverage-report/ccan/array_size/test/index-sort-l.html
new file mode 100644
index 0000000..ee9281b
--- /dev/null
+++ b/coverage-report/ccan/array_size/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/array_size/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/array_size/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/array_size/test/index.html b/coverage-report/ccan/array_size/test/index.html
new file mode 100644
index 0000000..53f333d
--- /dev/null
+++ b/coverage-report/ccan/array_size/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/array_size/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/array_size/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/array_size/test/run.c.func-sort-c.html b/coverage-report/ccan/array_size/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..7f653e0
--- /dev/null
+++ b/coverage-report/ccan/array_size/test/run.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/array_size/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/array_size/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#17">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/array_size/test/run.c.func.html b/coverage-report/ccan/array_size/test/run.c.func.html
new file mode 100644
index 0000000..6246f7c
--- /dev/null
+++ b/coverage-report/ccan/array_size/test/run.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/array_size/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/array_size/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#17">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/array_size/test/run.c.gcov.html b/coverage-report/ccan/array_size/test/run.c.gcov.html
new file mode 100644
index 0000000..8fd783a
--- /dev/null
+++ b/coverage-report/ccan/array_size/test/run.c.gcov.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/array_size/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/array_size/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/array_size/array_size.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : static char array1[1];</a>
+<a name="5"><span class="lineNum"> 5 </span> : : static int array2[2];</a>
+<a name="6"><span class="lineNum"> 6 </span> : : static unsigned long array3[3][5];</a>
+<a name="7"><span class="lineNum"> 7 </span> : : struct foo {</a>
+<a name="8"><span class="lineNum"> 8 </span> : : unsigned int a, b;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : char string[100];</a>
+<a name="10"><span class="lineNum"> 10 </span> : : };</a>
+<a name="11"><span class="lineNum"> 11 </span> : : static struct foo array4[4];</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : /* Make sure they can be used in initializers. */</a>
+<a name="14"><span class="lineNum"> 14 </span> : : static int array1_size = ARRAY_SIZE(array1);</a>
+<a name="15"><span class="lineNum"> 15 </span> : : static int array2_size = ARRAY_SIZE(array2);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : static int array3_size = ARRAY_SIZE(array3);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : static int array4_size = ARRAY_SIZE(array4);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 2 : int __attribute__((const)) main(int argc, char *argv[])</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> : : (void)argc;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : (void)argv;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : plan_tests(8);</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 2 : ok1(array1_size == 1);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 2 : ok1(array2_size == 2);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 2 : ok1(array3_size == 3);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 2 : ok1(array4_size == 4);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : ok1(ARRAY_SIZE(array1) == 1);</a>
+<a name="31"><span class="lineNum"> 31 </span> : : ok1(ARRAY_SIZE(array2) == 2);</a>
+<a name="32"><span class="lineNum"> 32 </span> : : ok1(ARRAY_SIZE(array3) == 3);</a>
+<a name="33"><span class="lineNum"> 33 </span> : : ok1(ARRAY_SIZE(array4) == 4);</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 2 : return exit_status();</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/build_assert/test/index-sort-b.html b/coverage-report/ccan/build_assert/test/index-sort-b.html
new file mode 100644
index 0000000..f5c17a0
--- /dev/null
+++ b/coverage-report/ccan/build_assert/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/build_assert/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/build_assert/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html">run-BUILD_ASSERT_OR_ZERO.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/build_assert/test/index-sort-f.html b/coverage-report/ccan/build_assert/test/index-sort-f.html
new file mode 100644
index 0000000..e4fbb8d
--- /dev/null
+++ b/coverage-report/ccan/build_assert/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/build_assert/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/build_assert/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html">run-BUILD_ASSERT_OR_ZERO.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/build_assert/test/index-sort-l.html b/coverage-report/ccan/build_assert/test/index-sort-l.html
new file mode 100644
index 0000000..4419b80
--- /dev/null
+++ b/coverage-report/ccan/build_assert/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/build_assert/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/build_assert/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html">run-BUILD_ASSERT_OR_ZERO.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/build_assert/test/index.html b/coverage-report/ccan/build_assert/test/index.html
new file mode 100644
index 0000000..97ae82e
--- /dev/null
+++ b/coverage-report/ccan/build_assert/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/build_assert/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/build_assert/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html">run-BUILD_ASSERT_OR_ZERO.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func-sort-c.html b/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func-sort-c.html
new file mode 100644
index 0000000..5127fff
--- /dev/null
+++ b/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/build_assert/test</a> - run-BUILD_ASSERT_OR_ZERO.c<span style="font-size: 80%;"> (<a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-BUILD_ASSERT_OR_ZERO.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html#2">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func.html b/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func.html
new file mode 100644
index 0000000..c499b2d
--- /dev/null
+++ b/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/build_assert/test</a> - run-BUILD_ASSERT_OR_ZERO.c<span style="font-size: 80%;"> (<a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-BUILD_ASSERT_OR_ZERO.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-BUILD_ASSERT_OR_ZERO.c.gcov.html#2">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.gcov.html b/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.gcov.html
new file mode 100644
index 0000000..f6c7245
--- /dev/null
+++ b/coverage-report/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c.gcov.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/build_assert/test</a> - run-BUILD_ASSERT_OR_ZERO.c<span style="font-size: 80%;"> (source / <a href="run-BUILD_ASSERT_OR_ZERO.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/build_assert/build_assert.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> :<span class="lineCov"> 2 : int __attribute__((const)) main(int argc, char *argv[])</span></a>
+<a name="5"><span class="lineNum"> 5 </span> : : {</a>
+<a name="6"><span class="lineNum"> 6 </span> : : (void)argc;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : (void)argv;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : plan_tests(1);</a>
+<a name="10"><span class="lineNum"> 10 </span> : : ok1(BUILD_ASSERT_OR_ZERO(1 == 1) == 0);</a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineCov"> 2 : return exit_status();</span></a>
+<a name="12"><span class="lineNum"> 12 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/check_type/test/index-sort-b.html b/coverage-report/ccan/check_type/test/index-sort-b.html
new file mode 100644
index 0000000..b90b38f
--- /dev/null
+++ b/coverage-report/ccan/check_type/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/check_type/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/check_type/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/check_type/test/index-sort-f.html b/coverage-report/ccan/check_type/test/index-sort-f.html
new file mode 100644
index 0000000..9898adb
--- /dev/null
+++ b/coverage-report/ccan/check_type/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/check_type/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/check_type/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/check_type/test/index-sort-l.html b/coverage-report/ccan/check_type/test/index-sort-l.html
new file mode 100644
index 0000000..9d9ae65
--- /dev/null
+++ b/coverage-report/ccan/check_type/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/check_type/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/check_type/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/check_type/test/index.html b/coverage-report/ccan/check_type/test/index.html
new file mode 100644
index 0000000..0c13451
--- /dev/null
+++ b/coverage-report/ccan/check_type/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/check_type/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/check_type/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/check_type/test/run.c.func-sort-c.html b/coverage-report/ccan/check_type/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..2091337
--- /dev/null
+++ b/coverage-report/ccan/check_type/test/run.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/check_type/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/check_type/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#2">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/check_type/test/run.c.func.html b/coverage-report/ccan/check_type/test/run.c.func.html
new file mode 100644
index 0000000..70c531f
--- /dev/null
+++ b/coverage-report/ccan/check_type/test/run.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/check_type/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/check_type/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#2">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/check_type/test/run.c.gcov.html b/coverage-report/ccan/check_type/test/run.c.gcov.html
new file mode 100644
index 0000000..490d914
--- /dev/null
+++ b/coverage-report/ccan/check_type/test/run.c.gcov.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/check_type/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/check_type/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/check_type/check_type.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> :<span class="lineCov"> 2 : int __attribute__((const)) main(int argc, char *argv[])</span></a>
+<a name="5"><span class="lineNum"> 5 </span> : : {</a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineCov"> 2 : int x = 0, y = 0;</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : (void)argc;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : (void)argv;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : plan_tests(9);</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : ok1(check_type(argc, int) == 0);</a>
+<a name="14"><span class="lineNum"> 14 </span> : : ok1(check_type(&amp;argc, int *) == 0);</a>
+<a name="15"><span class="lineNum"> 15 </span> : : ok1(check_types_match(argc, argc) == 0);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : ok1(check_types_match(argc, x) == 0);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : ok1(check_types_match(&amp;argc, &amp;x) == 0);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : ok1(check_type(x++, int) == 0);</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 2 : ok(x == 0, &quot;check_type does not evaluate expression&quot;);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : ok1(check_types_match(x++, y++) == 0);</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 2 : ok(x == 0 &amp;&amp; y == 0, &quot;check_types_match does not evaluate expressions&quot;);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 2 : return exit_status();</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/container_of/test/index-sort-b.html b/coverage-report/ccan/container_of/test/index-sort-b.html
new file mode 100644
index 0000000..0dc3d76
--- /dev/null
+++ b/coverage-report/ccan/container_of/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/container_of/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/container_of/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/container_of/test/index-sort-f.html b/coverage-report/ccan/container_of/test/index-sort-f.html
new file mode 100644
index 0000000..49ed54c
--- /dev/null
+++ b/coverage-report/ccan/container_of/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/container_of/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/container_of/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/container_of/test/index-sort-l.html b/coverage-report/ccan/container_of/test/index-sort-l.html
new file mode 100644
index 0000000..3f496d1
--- /dev/null
+++ b/coverage-report/ccan/container_of/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/container_of/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/container_of/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/container_of/test/index.html b/coverage-report/ccan/container_of/test/index.html
new file mode 100644
index 0000000..3cdf228
--- /dev/null
+++ b/coverage-report/ccan/container_of/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/container_of/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/container_of/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/container_of/test/run.c.func-sort-c.html b/coverage-report/ccan/container_of/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..d98edf5
--- /dev/null
+++ b/coverage-report/ccan/container_of/test/run.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/container_of/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/container_of/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#7">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/container_of/test/run.c.func.html b/coverage-report/ccan/container_of/test/run.c.func.html
new file mode 100644
index 0000000..6832868
--- /dev/null
+++ b/coverage-report/ccan/container_of/test/run.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/container_of/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/container_of/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#7">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/container_of/test/run.c.gcov.html b/coverage-report/ccan/container_of/test/run.c.gcov.html
new file mode 100644
index 0000000..a71e939
--- /dev/null
+++ b/coverage-report/ccan/container_of/test/run.c.gcov.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/container_of/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/container_of/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : struct foo {</a>
+<a name="5"><span class="lineNum"> 5 </span> : : int a;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : char b;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : };</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> :<span class="lineCov"> 2 : int __attribute__((const)) main(int argc, char *argv[])</span></a>
+<a name="10"><span class="lineNum"> 10 </span> : : {</a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineCov"> 2 : struct foo foo = { .a = 1, .b = 2 };</span></a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 2 : int *intp = &amp;foo.a;</span></a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 2 : char *charp = &amp;foo.b;</span></a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : (void)argc;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : (void)argv;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : plan_tests(6);</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 2 : ok1(container_of(intp, struct foo, a) == &amp;foo);</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 2 : ok1(container_of(charp, struct foo, b) == &amp;foo);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 2 : ok1(container_of_var(intp, &amp;foo, a) == &amp;foo);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 2 : ok1(container_of_var(charp, &amp;foo, b) == &amp;foo);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : ok1(container_off(struct foo, a) == 0);</a>
+<a name="25"><span class="lineNum"> 25 </span> : : ok1(container_off(struct foo, b) == offsetof(struct foo, b));</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 2 : return exit_status();</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/endian.h.func-sort-c.html b/coverage-report/ccan/endian/endian.h.func-sort-c.html
new file mode 100644
index 0000000..efc0929
--- /dev/null
+++ b/coverage-report/ccan/endian/endian.h.func-sort-c.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="endian.h.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#69">bswap_16</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#82">bswap_32</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#98">bswap_64</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#233">cpu_to_le64</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#260">le64_to_cpu</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#242">cpu_to_le32</a></td>
+ <td class="coverFnHi">37</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#269">le32_to_cpu</a></td>
+ <td class="coverFnHi">324</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#251">cpu_to_le16</a></td>
+ <td class="coverFnHi">1070</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#278">le16_to_cpu</a></td>
+ <td class="coverFnHi">2165</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#305">cpu_to_be16</a></td>
+ <td class="coverFnHi">13235752</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnHi">15006234</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#332">be16_to_cpu</a></td>
+ <td class="coverFnHi">19986278</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#296">cpu_to_be32</a></td>
+ <td class="coverFnHi">28693593</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#323">be32_to_cpu</a></td>
+ <td class="coverFnHi">36809977</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnHi">116071949</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/endian.h.func.html b/coverage-report/ccan/endian/endian.h.func.html
new file mode 100644
index 0000000..5023fd9
--- /dev/null
+++ b/coverage-report/ccan/endian/endian.h.func.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="endian.h.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#332">be16_to_cpu</a></td>
+ <td class="coverFnHi">19986278</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#323">be32_to_cpu</a></td>
+ <td class="coverFnHi">36809977</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnHi">116071949</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#69">bswap_16</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#82">bswap_32</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#98">bswap_64</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#305">cpu_to_be16</a></td>
+ <td class="coverFnHi">13235752</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#296">cpu_to_be32</a></td>
+ <td class="coverFnHi">28693593</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnHi">15006234</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#251">cpu_to_le16</a></td>
+ <td class="coverFnHi">1070</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#242">cpu_to_le32</a></td>
+ <td class="coverFnHi">37</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#233">cpu_to_le64</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#278">le16_to_cpu</a></td>
+ <td class="coverFnHi">2165</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#269">le32_to_cpu</a></td>
+ <td class="coverFnHi">324</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#260">le64_to_cpu</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/endian.h.gcov.html b/coverage-report/ccan/endian/endian.h.gcov.html
new file mode 100644
index 0000000..eb2ca28
--- /dev/null
+++ b/coverage-report/ccan/endian/endian.h.gcov.html
@@ -0,0 +1,440 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/endian.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/endian</a> - endian.h<span style="font-size: 80%;"> (source / <a href="endian.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* CC0 (Public domain) - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #ifndef CCAN_ENDIAN_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #define CCAN_ENDIAN_H</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;config.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : /**</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * BSWAP_16 - reverse bytes in a constant uint16_t value.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : *</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * Example:</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * struct mystruct {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * char buf[BSWAP_16(0x1234)];</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define BSWAP_16(val) \</a>
+<a name="19"><span class="lineNum"> 19 </span> : : ((((uint16_t)(val) &amp; 0x00ff) &lt;&lt; 8) \</a>
+<a name="20"><span class="lineNum"> 20 </span> : : | (((uint16_t)(val) &amp; 0xff00) &gt;&gt; 8))</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : /**</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * BSWAP_32 - reverse bytes in a constant uint32_t value.</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="25"><span class="lineNum"> 25 </span> : : *</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="27"><span class="lineNum"> 27 </span> : : *</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Example:</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * struct mystruct {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * char buf[BSWAP_32(0xff000000)];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #define BSWAP_32(val) \</a>
+<a name="34"><span class="lineNum"> 34 </span> : : ((((uint32_t)(val) &amp; 0x000000ff) &lt;&lt; 24) \</a>
+<a name="35"><span class="lineNum"> 35 </span> : : | (((uint32_t)(val) &amp; 0x0000ff00) &lt;&lt; 8) \</a>
+<a name="36"><span class="lineNum"> 36 </span> : : | (((uint32_t)(val) &amp; 0x00ff0000) &gt;&gt; 8) \</a>
+<a name="37"><span class="lineNum"> 37 </span> : : | (((uint32_t)(val) &amp; 0xff000000) &gt;&gt; 24))</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /**</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * BSWAP_64 - reverse bytes in a constant uint64_t value.</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * @val: constantvalue whose bytes to swap.</a>
+<a name="42"><span class="lineNum"> 42 </span> : : *</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * Example:</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * struct mystruct {</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * char buf[BSWAP_64(0xff00000000000000ULL)];</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * };</a>
+<a name="49"><span class="lineNum"> 49 </span> : : */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #define BSWAP_64(val) \</a>
+<a name="51"><span class="lineNum"> 51 </span> : : ((((uint64_t)(val) &amp; 0x00000000000000ffULL) &lt;&lt; 56) \</a>
+<a name="52"><span class="lineNum"> 52 </span> : : | (((uint64_t)(val) &amp; 0x000000000000ff00ULL) &lt;&lt; 40) \</a>
+<a name="53"><span class="lineNum"> 53 </span> : : | (((uint64_t)(val) &amp; 0x0000000000ff0000ULL) &lt;&lt; 24) \</a>
+<a name="54"><span class="lineNum"> 54 </span> : : | (((uint64_t)(val) &amp; 0x00000000ff000000ULL) &lt;&lt; 8) \</a>
+<a name="55"><span class="lineNum"> 55 </span> : : | (((uint64_t)(val) &amp; 0x000000ff00000000ULL) &gt;&gt; 8) \</a>
+<a name="56"><span class="lineNum"> 56 </span> : : | (((uint64_t)(val) &amp; 0x0000ff0000000000ULL) &gt;&gt; 24) \</a>
+<a name="57"><span class="lineNum"> 57 </span> : : | (((uint64_t)(val) &amp; 0x00ff000000000000ULL) &gt;&gt; 40) \</a>
+<a name="58"><span class="lineNum"> 58 </span> : : | (((uint64_t)(val) &amp; 0xff00000000000000ULL) &gt;&gt; 56))</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : #if HAVE_BYTESWAP_H</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #include &lt;byteswap.h&gt;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #else</a>
+<a name="63"><span class="lineNum"> 63 </span> : : /**</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * bswap_16 - reverse bytes in a uint16_t value.</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * @val: value whose bytes to swap.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * Example:</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * // Output contains &quot;1024 is 4 as two bytes reversed&quot;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * printf(&quot;1024 is %u as two bytes reversed\n&quot;, bswap_16(1024));</a>
+<a name="70"><span class="lineNum"> 70 </span> : : */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 2 : static inline uint16_t bswap_16(uint16_t val)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 2 : return BSWAP_16(val);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : }</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : /**</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * bswap_32 - reverse bytes in a uint32_t value.</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * @val: value whose bytes to swap.</a>
+<a name="79"><span class="lineNum"> 79 </span> : : *</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * Example:</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * // Output contains &quot;1024 is 262144 as four bytes reversed&quot;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * printf(&quot;1024 is %u as four bytes reversed\n&quot;, bswap_32(1024));</a>
+<a name="83"><span class="lineNum"> 83 </span> : : */</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : static inline uint32_t bswap_32(uint32_t val)</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 2 : return BSWAP_32(val);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : #endif /* !HAVE_BYTESWAP_H */</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : #if !HAVE_BSWAP_64</a>
+<a name="91"><span class="lineNum"> 91 </span> : : /**</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * bswap_64 - reverse bytes in a uint64_t value.</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * @val: value whose bytes to swap.</a>
+<a name="94"><span class="lineNum"> 94 </span> : : *</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * Example:</a>
+<a name="96"><span class="lineNum"> 96 </span> : : * // Output contains &quot;1024 is 1125899906842624 as eight bytes reversed&quot;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * printf(&quot;1024 is %llu as eight bytes reversed\n&quot;,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : * (unsigned long long)bswap_64(1024));</a>
+<a name="99"><span class="lineNum"> 99 </span> : : */</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 2 : static inline uint64_t bswap_64(uint64_t val)</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 2 : return BSWAP_64(val);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : #endif</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : /* Needed for Glibc like endiness check */</a>
+<a name="107"><span class="lineNum"> 107 </span> : : #define __LITTLE_ENDIAN 1234</a>
+<a name="108"><span class="lineNum"> 108 </span> : : #define __BIG_ENDIAN 4321</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Sanity check the defines. We don't handle weird endianness. */</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #if !HAVE_LITTLE_ENDIAN &amp;&amp; !HAVE_BIG_ENDIAN</a>
+<a name="112"><span class="lineNum"> 112 </span> : : #error &quot;Unknown endian&quot;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : #elif HAVE_LITTLE_ENDIAN &amp;&amp; HAVE_BIG_ENDIAN</a>
+<a name="114"><span class="lineNum"> 114 </span> : : #error &quot;Can't compile for both big and little endian.&quot;</a>
+<a name="115"><span class="lineNum"> 115 </span> : : #elif HAVE_LITTLE_ENDIAN</a>
+<a name="116"><span class="lineNum"> 116 </span> : : #define __BYTE_ORDER __LITTLE_ENDIAN</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #elif HAVE_BIG_ENDIAN</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #define __BYTE_ORDER __BIG_ENDIAN</a>
+<a name="119"><span class="lineNum"> 119 </span> : : #endif</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : #ifdef __CHECKER__</a>
+<a name="123"><span class="lineNum"> 123 </span> : : /* sparse needs forcing to remove bitwise attribute from ccan/short_types */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : #define ENDIAN_CAST __attribute__((force))</a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define ENDIAN_TYPE __attribute__((bitwise))</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #else</a>
+<a name="127"><span class="lineNum"> 127 </span> : : #define ENDIAN_CAST</a>
+<a name="128"><span class="lineNum"> 128 </span> : : #define ENDIAN_TYPE</a>
+<a name="129"><span class="lineNum"> 129 </span> : : #endif</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : typedef uint64_t ENDIAN_TYPE leint64_t;</a>
+<a name="132"><span class="lineNum"> 132 </span> : : typedef uint64_t ENDIAN_TYPE beint64_t;</a>
+<a name="133"><span class="lineNum"> 133 </span> : : typedef uint32_t ENDIAN_TYPE leint32_t;</a>
+<a name="134"><span class="lineNum"> 134 </span> : : typedef uint32_t ENDIAN_TYPE beint32_t;</a>
+<a name="135"><span class="lineNum"> 135 </span> : : typedef uint16_t ENDIAN_TYPE leint16_t;</a>
+<a name="136"><span class="lineNum"> 136 </span> : : typedef uint16_t ENDIAN_TYPE beint16_t;</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : #if HAVE_LITTLE_ENDIAN</a>
+<a name="139"><span class="lineNum"> 139 </span> : : /**</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * CPU_TO_LE64 - convert a constant uint64_t value to little-endian</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * @native: constant to convert</a>
+<a name="142"><span class="lineNum"> 142 </span> : : */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)(native))</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /**</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * CPU_TO_LE32 - convert a constant uint32_t value to little-endian</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * @native: constant to convert</a>
+<a name="148"><span class="lineNum"> 148 </span> : : */</a>
+<a name="149"><span class="lineNum"> 149 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)(native))</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /**</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * CPU_TO_LE16 - convert a constant uint16_t value to little-endian</a>
+<a name="153"><span class="lineNum"> 153 </span> : : * @native: constant to convert</a>
+<a name="154"><span class="lineNum"> 154 </span> : : */</a>
+<a name="155"><span class="lineNum"> 155 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)(native))</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /**</a>
+<a name="158"><span class="lineNum"> 158 </span> : : * LE64_TO_CPU - convert a little-endian uint64_t constant</a>
+<a name="159"><span class="lineNum"> 159 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="160"><span class="lineNum"> 160 </span> : : */</a>
+<a name="161"><span class="lineNum"> 161 </span> : : #define LE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : /**</a>
+<a name="164"><span class="lineNum"> 164 </span> : : * LE32_TO_CPU - convert a little-endian uint32_t constant</a>
+<a name="165"><span class="lineNum"> 165 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="166"><span class="lineNum"> 166 </span> : : */</a>
+<a name="167"><span class="lineNum"> 167 </span> : : #define LE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : /**</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * LE16_TO_CPU - convert a little-endian uint16_t constant</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="172"><span class="lineNum"> 172 </span> : : */</a>
+<a name="173"><span class="lineNum"> 173 </span> : : #define LE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> : : #else /* ... HAVE_BIG_ENDIAN */</a>
+<a name="176"><span class="lineNum"> 176 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)BSWAP_64(native))</a>
+<a name="177"><span class="lineNum"> 177 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)BSWAP_32(native))</a>
+<a name="178"><span class="lineNum"> 178 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)BSWAP_16(native))</a>
+<a name="179"><span class="lineNum"> 179 </span> : : #define LE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="180"><span class="lineNum"> 180 </span> : : #define LE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="181"><span class="lineNum"> 181 </span> : : #define LE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="182"><span class="lineNum"> 182 </span> : : #endif /* HAVE_BIG_ENDIAN */</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : #if HAVE_BIG_ENDIAN</a>
+<a name="185"><span class="lineNum"> 185 </span> : : /**</a>
+<a name="186"><span class="lineNum"> 186 </span> : : * CPU_TO_BE64 - convert a constant uint64_t value to big-endian</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * @native: constant to convert</a>
+<a name="188"><span class="lineNum"> 188 </span> : : */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)(native))</a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> : : /**</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * CPU_TO_BE32 - convert a constant uint32_t value to big-endian</a>
+<a name="193"><span class="lineNum"> 193 </span> : : * @native: constant to convert</a>
+<a name="194"><span class="lineNum"> 194 </span> : : */</a>
+<a name="195"><span class="lineNum"> 195 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)(native))</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> : : /**</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * CPU_TO_BE16 - convert a constant uint16_t value to big-endian</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @native: constant to convert</a>
+<a name="200"><span class="lineNum"> 200 </span> : : */</a>
+<a name="201"><span class="lineNum"> 201 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)(native))</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : /**</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * BE64_TO_CPU - convert a big-endian uint64_t constant</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> : : #define BE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> : : /**</a>
+<a name="210"><span class="lineNum"> 210 </span> : : * BE32_TO_CPU - convert a big-endian uint32_t constant</a>
+<a name="211"><span class="lineNum"> 211 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="212"><span class="lineNum"> 212 </span> : : */</a>
+<a name="213"><span class="lineNum"> 213 </span> : : #define BE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> : : /**</a>
+<a name="216"><span class="lineNum"> 216 </span> : : * BE16_TO_CPU - convert a big-endian uint16_t constant</a>
+<a name="217"><span class="lineNum"> 217 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="218"><span class="lineNum"> 218 </span> : : */</a>
+<a name="219"><span class="lineNum"> 219 </span> : : #define BE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : #else /* ... HAVE_LITTLE_ENDIAN */</a>
+<a name="222"><span class="lineNum"> 222 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)BSWAP_64(native))</a>
+<a name="223"><span class="lineNum"> 223 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)BSWAP_32(native))</a>
+<a name="224"><span class="lineNum"> 224 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)BSWAP_16(native))</a>
+<a name="225"><span class="lineNum"> 225 </span> : : #define BE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="226"><span class="lineNum"> 226 </span> : : #define BE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="227"><span class="lineNum"> 227 </span> : : #define BE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="228"><span class="lineNum"> 228 </span> : : #endif /* HAVE_LITTE_ENDIAN */</a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * cpu_to_le64 - convert a uint64_t value to little-endian</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * @native: value to convert</a>
+<a name="234"><span class="lineNum"> 234 </span> : : */</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 2 : static inline leint64_t cpu_to_le64(uint64_t native)</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : {</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 2 : return CPU_TO_LE64(native);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /**</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * cpu_to_le32 - convert a uint32_t value to little-endian</a>
+<a name="242"><span class="lineNum"> 242 </span> : : * @native: value to convert</a>
+<a name="243"><span class="lineNum"> 243 </span> : : */</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 37 : static inline leint32_t cpu_to_le32(uint32_t native)</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : {</a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 37 : return CPU_TO_LE32(native);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : }</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> : : /**</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * cpu_to_le16 - convert a uint16_t value to little-endian</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * @native: value to convert</a>
+<a name="252"><span class="lineNum"> 252 </span> : : */</a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 1070 : static inline leint16_t cpu_to_le16(uint16_t native)</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : {</a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 1070 : return CPU_TO_LE16(native);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : }</a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> : : /**</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * le64_to_cpu - convert a little-endian uint64_t value</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @le_val: little-endian value to convert</a>
+<a name="261"><span class="lineNum"> 261 </span> : : */</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 2 : static inline uint64_t le64_to_cpu(leint64_t le_val)</span></a>
+<a name="263"><span class="lineNum"> 263 </span> : : {</a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 2 : return LE64_TO_CPU(le_val);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : /**</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * le32_to_cpu - convert a little-endian uint32_t value</a>
+<a name="269"><span class="lineNum"> 269 </span> : : * @le_val: little-endian value to convert</a>
+<a name="270"><span class="lineNum"> 270 </span> : : */</a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 324 : static inline uint32_t le32_to_cpu(leint32_t le_val)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : {</a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 324 : return LE32_TO_CPU(le_val);</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /**</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * le16_to_cpu - convert a little-endian uint16_t value</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * @le_val: little-endian value to convert</a>
+<a name="279"><span class="lineNum"> 279 </span> : : */</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 2165 : static inline uint16_t le16_to_cpu(leint16_t le_val)</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 2165 : return LE16_TO_CPU(le_val);</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> : : /**</a>
+<a name="286"><span class="lineNum"> 286 </span> : : * cpu_to_be64 - convert a uint64_t value to big endian.</a>
+<a name="287"><span class="lineNum"> 287 </span> : : * @native: value to convert</a>
+<a name="288"><span class="lineNum"> 288 </span> : : */</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 15006234 : static inline beint64_t cpu_to_be64(uint64_t native)</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : {</a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 15006234 : return CPU_TO_BE64(native);</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : }</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : /**</a>
+<a name="295"><span class="lineNum"> 295 </span> : : * cpu_to_be32 - convert a uint32_t value to big endian.</a>
+<a name="296"><span class="lineNum"> 296 </span> : : * @native: value to convert</a>
+<a name="297"><span class="lineNum"> 297 </span> : : */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 28693594 : static inline beint32_t cpu_to_be32(uint32_t native)</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : {</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 28693594 : return CPU_TO_BE32(native);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : }</a>
+<a name="302"><span class="lineNum"> 302 </span> : : </a>
+<a name="303"><span class="lineNum"> 303 </span> : : /**</a>
+<a name="304"><span class="lineNum"> 304 </span> : : * cpu_to_be16 - convert a uint16_t value to big endian.</a>
+<a name="305"><span class="lineNum"> 305 </span> : : * @native: value to convert</a>
+<a name="306"><span class="lineNum"> 306 </span> : : */</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 13235753 : static inline beint16_t cpu_to_be16(uint16_t native)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : {</a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 13235753 : return CPU_TO_BE16(native);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> : : /**</a>
+<a name="313"><span class="lineNum"> 313 </span> : : * be64_to_cpu - convert a big-endian uint64_t value</a>
+<a name="314"><span class="lineNum"> 314 </span> : : * @be_val: big-endian value to convert</a>
+<a name="315"><span class="lineNum"> 315 </span> : : */</a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 116071949 : static inline uint64_t be64_to_cpu(beint64_t be_val)</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 116071949 : return BE64_TO_CPU(be_val);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /**</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * be32_to_cpu - convert a big-endian uint32_t value</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * @be_val: big-endian value to convert</a>
+<a name="324"><span class="lineNum"> 324 </span> : : */</a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 36810081 : static inline uint32_t be32_to_cpu(beint32_t be_val)</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 36810054 : return BE32_TO_CPU(be_val);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : }</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> : : /**</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * be16_to_cpu - convert a big-endian uint16_t value</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * @be_val: big-endian value to convert</a>
+<a name="333"><span class="lineNum"> 333 </span> : : */</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 19986337 : static inline uint16_t be16_to_cpu(beint16_t be_val)</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : {</a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 19986337 : return BE16_TO_CPU(be_val);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : }</a>
+<a name="338"><span class="lineNum"> 338 </span> : : </a>
+<a name="339"><span class="lineNum"> 339 </span> : : /* Whichever they include first, they get these definitions. */</a>
+<a name="340"><span class="lineNum"> 340 </span> : : #ifdef CCAN_SHORT_TYPES_H</a>
+<a name="341"><span class="lineNum"> 341 </span> : : /**</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * be64/be32/be16 - 64/32/16 bit big-endian representation.</a>
+<a name="343"><span class="lineNum"> 343 </span> : : */</a>
+<a name="344"><span class="lineNum"> 344 </span> : : typedef beint64_t be64;</a>
+<a name="345"><span class="lineNum"> 345 </span> : : typedef beint32_t be32;</a>
+<a name="346"><span class="lineNum"> 346 </span> : : typedef beint16_t be16;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /**</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * le64/le32/le16 - 64/32/16 bit little-endian representation.</a>
+<a name="350"><span class="lineNum"> 350 </span> : : */</a>
+<a name="351"><span class="lineNum"> 351 </span> : : typedef leint64_t le64;</a>
+<a name="352"><span class="lineNum"> 352 </span> : : typedef leint32_t le32;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : typedef leint16_t le16;</a>
+<a name="354"><span class="lineNum"> 354 </span> : : #endif</a>
+<a name="355"><span class="lineNum"> 355 </span> : : #endif /* CCAN_ENDIAN_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/index-sort-b.html b/coverage-report/ccan/endian/index-sort-b.html
new file mode 100644
index 0000000..7726f64
--- /dev/null
+++ b/coverage-report/ccan/endian/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/index-sort-f.html b/coverage-report/ccan/endian/index-sort-f.html
new file mode 100644
index 0000000..91aef21
--- /dev/null
+++ b/coverage-report/ccan/endian/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/index-sort-l.html b/coverage-report/ccan/endian/index-sort-l.html
new file mode 100644
index 0000000..4cefe34
--- /dev/null
+++ b/coverage-report/ccan/endian/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/index.html b/coverage-report/ccan/endian/index.html
new file mode 100644
index 0000000..75e8d21
--- /dev/null
+++ b/coverage-report/ccan/endian/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/test/index-sort-b.html b/coverage-report/ccan/endian/test/index-sort-b.html
new file mode 100644
index 0000000..1534844
--- /dev/null
+++ b/coverage-report/ccan/endian/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/endian/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/test/index-sort-f.html b/coverage-report/ccan/endian/test/index-sort-f.html
new file mode 100644
index 0000000..e9d1c60
--- /dev/null
+++ b/coverage-report/ccan/endian/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/endian/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/test/index-sort-l.html b/coverage-report/ccan/endian/test/index-sort-l.html
new file mode 100644
index 0000000..000a34b
--- /dev/null
+++ b/coverage-report/ccan/endian/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/endian/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/test/index.html b/coverage-report/ccan/endian/test/index.html
new file mode 100644
index 0000000..b464d6a
--- /dev/null
+++ b/coverage-report/ccan/endian/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/endian/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/test/run.c.func-sort-c.html b/coverage-report/ccan/endian/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..c57009b
--- /dev/null
+++ b/coverage-report/ccan/endian/test/run.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/endian/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#4">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/test/run.c.func.html b/coverage-report/ccan/endian/test/run.c.func.html
new file mode 100644
index 0000000..a60222ec
--- /dev/null
+++ b/coverage-report/ccan/endian/test/run.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/endian/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#4">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/endian/test/run.c.gcov.html b/coverage-report/ccan/endian/test/run.c.gcov.html
new file mode 100644
index 0000000..47cfb89
--- /dev/null
+++ b/coverage-report/ccan/endian/test/run.c.gcov.html
@@ -0,0 +1,194 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/endian/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/endian/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineCov"> 2 : int main(int argc, char *argv[])</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : {</a>
+<a name="8"><span class="lineNum"> 8 </span> : : union {</a>
+<a name="9"><span class="lineNum"> 9 </span> : : uint64_t u64;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : unsigned char u64_bytes[8];</a>
+<a name="11"><span class="lineNum"> 11 </span> : : } u64;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : union {</a>
+<a name="13"><span class="lineNum"> 13 </span> : : uint32_t u32;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : unsigned char u32_bytes[4];</a>
+<a name="15"><span class="lineNum"> 15 </span> : : } u32;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : union {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : uint16_t u16;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : unsigned char u16_bytes[2];</a>
+<a name="19"><span class="lineNum"> 19 </span> : : } u16;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : (void)argc;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : (void)argv;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : plan_tests(48);</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : /* Straight swap tests. */</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 2 : u64.u64_bytes[0] = 0x00;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 2 : u64.u64_bytes[1] = 0x11;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 2 : u64.u64_bytes[2] = 0x22;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 2 : u64.u64_bytes[3] = 0x33;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 2 : u64.u64_bytes[4] = 0x44;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 2 : u64.u64_bytes[5] = 0x55;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 2 : u64.u64_bytes[6] = 0x66;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 2 : u64.u64_bytes[7] = 0x77;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 2 : u64.u64 = bswap_64(u64.u64);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[7] == 0x00);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[6] == 0x11);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[5] == 0x22);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[4] == 0x33);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[3] == 0x44);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[2] == 0x55);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[1] == 0x66);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[0] == 0x77);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 2 : u32.u32_bytes[0] = 0x00;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 2 : u32.u32_bytes[1] = 0x11;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 2 : u32.u32_bytes[2] = 0x22;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 2 : u32.u32_bytes[3] = 0x33;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 2 : u32.u32 = bswap_32(u32.u32);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[3] == 0x00);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[2] == 0x11);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[1] == 0x22);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[0] == 0x33);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 2 : u16.u16_bytes[0] = 0x00;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 2 : u16.u16_bytes[1] = 0x11;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 2 : u16.u16 = bswap_16(u16.u16);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 2 : ok1(u16.u16_bytes[1] == 0x00);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 2 : ok1(u16.u16_bytes[0] == 0x11);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /* Endian tests. */</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 2 : u64.u64 = cpu_to_le64(0x0011223344556677ULL);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[0] == 0x77);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[1] == 0x66);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[2] == 0x55);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[3] == 0x44);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[4] == 0x33);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[5] == 0x22);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[6] == 0x11);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[7] == 0x00);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 2 : ok1(le64_to_cpu(u64.u64) == 0x0011223344556677ULL);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 2 : u64.u64 = cpu_to_be64(0x0011223344556677ULL);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[7] == 0x77);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[6] == 0x66);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[5] == 0x55);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[4] == 0x44);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[3] == 0x33);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[2] == 0x22);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[1] == 0x11);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 2 : ok1(u64.u64_bytes[0] == 0x00);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 2 : ok1(be64_to_cpu(u64.u64) == 0x0011223344556677ULL);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : u32.u32 = cpu_to_le32(0x00112233);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[0] == 0x33);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[1] == 0x22);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[2] == 0x11);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[3] == 0x00);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 2 : ok1(le32_to_cpu(u32.u32) == 0x00112233);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 2 : u32.u32 = cpu_to_be32(0x00112233);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[3] == 0x33);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[2] == 0x22);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[1] == 0x11);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 2 : ok1(u32.u32_bytes[0] == 0x00);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 2 : ok1(be32_to_cpu(u32.u32) == 0x00112233);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 2 : u16.u16 = cpu_to_le16(0x0011);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 2 : ok1(u16.u16_bytes[0] == 0x11);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 2 : ok1(u16.u16_bytes[1] == 0x00);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 2 : ok1(le16_to_cpu(u16.u16) == 0x0011);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 2 : u16.u16 = cpu_to_be16(0x0011);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 2 : ok1(u16.u16_bytes[1] == 0x11);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 2 : ok1(u16.u16_bytes[0] == 0x00);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 2 : ok1(be16_to_cpu(u16.u16) == 0x0011);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 2 : exit(exit_status());</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/heap.c.func-sort-c.html b/coverage-report/ccan/heap/heap.c.func-sort-c.html
new file mode 100644
index 0000000..d2bc109
--- /dev/null
+++ b/coverage-report/ccan/heap/heap.c.func-sort-c.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/heap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/heap</a> - heap.c<span style="font-size: 80%;"> (<a href="heap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntryHi">95.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="heap.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#113">heap_free</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#92">heap_init</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#102">heap_ify</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#19">__up</a></td>
+ <td class="coverFnHi">10068</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#72">heap_pop</a></td>
+ <td class="coverFnHi">10068</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#35">heap_push</a></td>
+ <td class="coverFnHi">10068</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#49">__down</a></td>
+ <td class="coverFnHi">20094</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#11">swap</a></td>
+ <td class="coverFnHi">140194</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/heap.c.func.html b/coverage-report/ccan/heap/heap.c.func.html
new file mode 100644
index 0000000..d5298dc
--- /dev/null
+++ b/coverage-report/ccan/heap/heap.c.func.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/heap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/heap</a> - heap.c<span style="font-size: 80%;"> (<a href="heap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntryHi">95.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="heap.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#49">__down</a></td>
+ <td class="coverFnHi">20094</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#19">__up</a></td>
+ <td class="coverFnHi">10068</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#113">heap_free</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#102">heap_ify</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#92">heap_init</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#72">heap_pop</a></td>
+ <td class="coverFnHi">10068</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#35">heap_push</a></td>
+ <td class="coverFnHi">10068</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="heap.c.gcov.html#11">swap</a></td>
+ <td class="coverFnHi">140194</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/heap.c.gcov.html b/coverage-report/ccan/heap/heap.c.gcov.html
new file mode 100644
index 0000000..07f82d0
--- /dev/null
+++ b/coverage-report/ccan/heap/heap.c.gcov.html
@@ -0,0 +1,204 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/heap.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/heap</a> - heap.c<span style="font-size: 80%;"> (source / <a href="heap.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntryHi">95.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Licensed under BSD-MIT - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/heap/heap.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : /*</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Allocating memory in chunks greater than needed does not yield measurable</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * speedups of the test program when linking against glibc 2.15.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * When the data array has to be shrunk though, limiting calls to realloc</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * does help a little bit (~7% speedup), hence the following parameter.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : */</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define HEAP_MEM_HYSTERESIS 4096</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 140194 : static inline void swap(struct heap *h, size_t i, size_t j)</span></a>
+<a name="14"><span class="lineNum"> 14 </span> : : {</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 140194 : void *foo = h-&gt;data[i];</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 140194 : h-&gt;data[i] = h-&gt;data[j];</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 140194 : h-&gt;data[j] = foo;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 140194 : }</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 10068 : static void __up(struct heap *h, size_t j)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : size_t i; /* parent */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 23256 : while (j) {</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 23224 : i = (j - 1) / 2;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 23224 : if (h-&gt;less(h-&gt;data[j], h-&gt;data[i])) {</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 13188 : swap(h, i, j);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 13188 : j = i;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : } else {</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 10036 : break;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 10068 : }</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 10068 : int heap_push(struct heap *h, void *data)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : {</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 10068 : if (h-&gt;len == h-&gt;cap) {</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 10068 : void *m = realloc(h-&gt;data, (h-&gt;cap + 1) * sizeof(void *));</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 10068 : if (m == NULL)</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 10068 : h-&gt;data = m;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 10068 : h-&gt;cap++;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : }</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 10068 : h-&gt;data[h-&gt;len++] = data;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 10068 : __up(h, h-&gt;len - 1);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 10068 : return 0;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : }</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 137032 : static void __down(struct heap *h, size_t i)</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : {</a>
+<a name="53"><span class="lineNum"> 53 </span> : : size_t l, r, j; /* left, right, min child */</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : while (1) {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 137032 : l = 2 * i + 1;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 137032 : if (l &gt;= h-&gt;len)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 18554 : break;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 118478 : r = l + 1;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 118478 : if (r &gt;= h-&gt;len)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 50 : j = l;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : else</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 118428 : j = h-&gt;less(h-&gt;data[l], h-&gt;data[r]) ? l : r;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 118478 : if (h-&gt;less(h-&gt;data[j], h-&gt;data[i])) {</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 116938 : swap(h, i, j);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 116938 : i = j;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : } else {</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1540 : break;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : }</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 20094 : }</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 10068 : void *heap_pop(struct heap *h)</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : {</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 10068 : void *ret = h-&gt;data[0];</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : void *m;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 10068 : swap(h, 0, --h-&gt;len);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 10068 : if (h-&gt;len) {</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 10062 : __down(h, 0);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 10062 : if (h-&gt;len == h-&gt;cap - HEAP_MEM_HYSTERESIS) {</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 2 : m = realloc(h-&gt;data, h-&gt;len * sizeof(void *));</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : if (m == NULL)</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 2 : h-&gt;data = m;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 2 : h-&gt;cap = h-&gt;len;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : }</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 10068 : return ret;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 6 : struct heap *heap_init(heap_less_func_t less)</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : {</a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 6 : struct heap *heap = calloc(1, sizeof(*heap));</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 6 : if (heap == NULL)</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 6 : heap-&gt;less = less;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 6 : return heap;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : }</a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 10 : void heap_ify(struct heap *h, heap_less_func_t less)</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : {</a>
+<a name="106"><span class="lineNum"> 106 </span> : : int i;</a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 10 : if (less)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 8 : h-&gt;less = less;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 10042 : for (i = h-&gt;len / 2 - 1; i &gt;= 0; i--)</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 10032 : __down(h, i);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 6 : void heap_free(struct heap *heap)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : {</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 6 : free(heap-&gt;data);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 6 : free(heap);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 6 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/index-sort-b.html b/coverage-report/ccan/heap/index-sort-b.html
new file mode 100644
index 0000000..fc78a98
--- /dev/null
+++ b/coverage-report/ccan/heap/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/heap</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntryHi">95.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="heap.c.gcov.html">heap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="95.3%"><img src="../../snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/index-sort-f.html b/coverage-report/ccan/heap/index-sort-f.html
new file mode 100644
index 0000000..9f6a959
--- /dev/null
+++ b/coverage-report/ccan/heap/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/heap</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntryHi">95.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="heap.c.gcov.html">heap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="95.3%"><img src="../../snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/index-sort-l.html b/coverage-report/ccan/heap/index-sort-l.html
new file mode 100644
index 0000000..6de54c9
--- /dev/null
+++ b/coverage-report/ccan/heap/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/heap</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntryHi">95.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="heap.c.gcov.html">heap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="95.3%"><img src="../../snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/index.html b/coverage-report/ccan/heap/index.html
new file mode 100644
index 0000000..2edfed8
--- /dev/null
+++ b/coverage-report/ccan/heap/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/heap</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntryHi">95.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="heap.c.gcov.html">heap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="95.3%"><img src="../../snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/test/index-sort-b.html b/coverage-report/ccan/heap/test/index-sort-b.html
new file mode 100644
index 0000000..c6b0113
--- /dev/null
+++ b/coverage-report/ccan/heap/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/heap/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryMed">75.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=76 height=10 alt="75.7%"><img src="../../../snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/test/index-sort-f.html b/coverage-report/ccan/heap/test/index-sort-f.html
new file mode 100644
index 0000000..ffed1c8
--- /dev/null
+++ b/coverage-report/ccan/heap/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/heap/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryMed">75.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=76 height=10 alt="75.7%"><img src="../../../snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/test/index-sort-l.html b/coverage-report/ccan/heap/test/index-sort-l.html
new file mode 100644
index 0000000..a00a096
--- /dev/null
+++ b/coverage-report/ccan/heap/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/heap/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryMed">75.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=76 height=10 alt="75.7%"><img src="../../../snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/test/index.html b/coverage-report/ccan/heap/test/index.html
new file mode 100644
index 0000000..ddbc273
--- /dev/null
+++ b/coverage-report/ccan/heap/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/heap/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryMed">75.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=76 height=10 alt="75.7%"><img src="../../../snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/test/run.c.func-sort-c.html b/coverage-report/ccan/heap/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..1bb919c
--- /dev/null
+++ b/coverage-report/ccan/heap/test/run.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/heap/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryMed">75.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#122">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#58">some_test</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#53">__more</a></td>
+ <td class="coverFnHi">32620</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#48">more</a></td>
+ <td class="coverFnHi">32684</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#12">heap_ok</a></td>
+ <td class="coverFnHi">50022256</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#43">__less</a></td>
+ <td class="coverFnHi">50229620</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#38">less</a></td>
+ <td class="coverFnHi">50239618</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/test/run.c.func.html b/coverage-report/ccan/heap/test/run.c.func.html
new file mode 100644
index 0000000..7748bc8
--- /dev/null
+++ b/coverage-report/ccan/heap/test/run.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/heap/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryMed">75.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#43">__less</a></td>
+ <td class="coverFnHi">50229620</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#53">__more</a></td>
+ <td class="coverFnHi">32620</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#12">heap_ok</a></td>
+ <td class="coverFnHi">50022256</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#38">less</a></td>
+ <td class="coverFnHi">50239618</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#122">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#48">more</a></td>
+ <td class="coverFnHi">32684</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#58">some_test</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/heap/test/run.c.gcov.html b/coverage-report/ccan/heap/test/run.c.gcov.html
new file mode 100644
index 0000000..7d76036
--- /dev/null
+++ b/coverage-report/ccan/heap/test/run.c.gcov.html
@@ -0,0 +1,218 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/heap/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/heap/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryMed">75.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;ccan/heap/heap.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : /* Include the C files directly. */</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;ccan/heap/heap.c&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : struct item {</a>
+<a name="10"><span class="lineNum"> 10 </span> : : void *foobar;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : int v;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : };</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 50022256 : static bool heap_ok(const struct heap *h, heap_less_func_t less, int i)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> : : int l, r;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 50022256 : l = 2 * i + 1;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 50022256 : r = l + 1;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 50022256 : if (l &lt; h-&gt;len) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 25006088 : if (less(h-&gt;data[l], h-&gt;data[i])) {</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;heap property violation\n&quot;);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 25006088 : if (!heap_ok(h, less, l))</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 50022256 : if (r &lt; h-&gt;len) {</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 24996022 : if (less(h-&gt;data[r], h-&gt;data[i])) {</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;heap property violation\n&quot;);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 24996022 : if (!heap_ok(h, less, r))</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 50022256 : return true;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 50239618 : static bool less(const struct item *a, const struct item *b)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 50239618 : return a-&gt;v &lt; b-&gt;v;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 50229620 : static bool __less(const void *a, const void *b)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 50229620 : return less(a, b);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : }</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 32684 : static bool more(const struct item *a, const struct item *b)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 32684 : return a-&gt;v &gt; b-&gt;v;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 32620 : static bool __more(const void *a, const void *b)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 32620 : return more(a, b);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 6 : static bool some_test(size_t n, bool is_less)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 6 : struct item *items = calloc(n, sizeof(*items));</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : struct item *item, *prev;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : struct heap *h;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : int i;</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 6 : if (items == NULL) {</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : perror(&quot;items&quot;);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : exit(EXIT_FAILURE);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 6 : if (is_less)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 4 : h = heap_init(__less);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : else</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 2 : h = heap_init(__more);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 6 : if (h == NULL) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : perror(&quot;heap_init&quot;);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : exit(EXIT_FAILURE);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 10074 : for (i = 0; i &lt; n; i++) {</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 10068 : item = &amp;items[i];</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 10068 : item-&gt;v = rand();</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : /* printf(&quot;pushing %d\n&quot;, item-&gt;v); */</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 10068 : heap_push(h, item);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 10068 : if (!heap_ok(h, is_less ? __less : __more, 0))</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : }</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 6 : if (is_less) {</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 4 : heap_ify(h, __more);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 4 : if (!heap_ok(h, __more, 0))</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 4 : heap_ify(h, __less);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 4 : if (!heap_ok(h, __less, 0))</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : } else {</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 2 : heap_ify(h, NULL);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 2 : if (!heap_ok(h, __more, 0))</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 10074 : for (i = 0; i &lt; n; i++) {</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 10068 : item = heap_pop(h);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 10068 : if (!heap_ok(h, is_less ? __less : __more, 0))</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* printf(&quot;popped %d\n&quot;, item-&gt;v); */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 10068 : if (i &gt; 0) {</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 10062 : if (is_less) {</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 9998 : if (less(item, prev))</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : } else {</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 64 : if (more(item, prev))</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : }</a>
+<a name="116"><span class="lineNum"> 116 </span> : : }</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 10068 : prev = item;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : }</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 6 : heap_free(h);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 6 : free(items);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 6 : return true;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 2 : int main(void)</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : {</a>
+<a name="126"><span class="lineNum"> 126 </span> : : plan_tests(3);</a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 2 : ok1(some_test(5000, true));</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 2 : ok1(some_test(1, true));</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 2 : ok1(some_test(33, false));</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 2 : return exit_status();</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/index-sort-b.html b/coverage-report/ccan/list/index-sort-b.html
new file mode 100644
index 0000000..a4cd31c
--- /dev/null
+++ b/coverage-report/ccan/list/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntryHi">98.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.h.gcov.html">list.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">72 / 72</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/index-sort-f.html b/coverage-report/ccan/list/index-sort-f.html
new file mode 100644
index 0000000..95358ae
--- /dev/null
+++ b/coverage-report/ccan/list/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntryHi">98.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.h.gcov.html">list.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">72 / 72</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/index-sort-l.html b/coverage-report/ccan/list/index-sort-l.html
new file mode 100644
index 0000000..bd2391e
--- /dev/null
+++ b/coverage-report/ccan/list/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntryHi">98.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.h.gcov.html">list.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">72 / 72</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/index.html b/coverage-report/ccan/list/index.html
new file mode 100644
index 0000000..f85a60f
--- /dev/null
+++ b/coverage-report/ccan/list/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntryHi">98.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.h.gcov.html">list.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">72 / 72</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/list.c.func-sort-c.html b/coverage-report/ccan/list/list.c.func-sort-c.html
new file mode 100644
index 0000000..fe252d3
--- /dev/null
+++ b/coverage-report/ccan/list/list.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/list.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/list</a> - list.c<span style="font-size: 80%;"> (<a href="list.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">94.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="list.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#4">corrupt</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#36">list_check</a></td>
+ <td class="coverFnHi">690</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#18">list_check_node</a></td>
+ <td class="coverFnHi">858</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/list.c.func.html b/coverage-report/ccan/list/list.c.func.html
new file mode 100644
index 0000000..9f8dbec
--- /dev/null
+++ b/coverage-report/ccan/list/list.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/list.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/list</a> - list.c<span style="font-size: 80%;"> (<a href="list.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">94.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="list.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#4">corrupt</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#36">list_check</a></td>
+ <td class="coverFnHi">690</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#18">list_check_node</a></td>
+ <td class="coverFnHi">858</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/list.c.gcov.html b/coverage-report/ccan/list/list.c.gcov.html
new file mode 100644
index 0000000..ca37e1b
--- /dev/null
+++ b/coverage-report/ccan/list/list.c.gcov.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/list.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/list</a> - list.c<span style="font-size: 80%;"> (source / <a href="list.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">94.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Licensed under BSD-MIT - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;list.h&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineCov"> 36 : static void *corrupt(const char *abortstr,</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : const struct list_node *head,</a>
+<a name="8"><span class="lineNum"> 8 </span> : : const struct list_node *node,</a>
+<a name="9"><span class="lineNum"> 9 </span> : : unsigned int count)</a>
+<a name="10"><span class="lineNum"> 10 </span> : : {</a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineCov"> 36 : if (abortstr) {</span></a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 18 : fprintf(stderr,</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : &quot;%s: prev corrupt in node %p (%u) of %p\n&quot;,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : abortstr, node, count, head);</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 18 : abort();</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : }</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 18 : return NULL;</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 858 : struct list_node *list_check_node(const struct list_node *node,</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : const char *abortstr)</a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : const struct list_node *p, *n;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 858 : int count = 0;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 2172 : for (p = node, n = node-&gt;next; n != node; p = n, n = n-&gt;next) {</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1326 : count++;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1326 : if (n-&gt;prev != p)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 12 : return corrupt(abortstr, node, n, count);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* Check prev on head node. */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 846 : if (node-&gt;prev != p)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 24 : return corrupt(abortstr, node, node, 0);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 822 : return (struct list_node *)node;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 690 : struct list_head *list_check(const struct list_head *h, const char *abortstr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 690 : if (!list_check_node(&amp;h-&gt;n, abortstr))</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 12 : return NULL;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 666 : return (struct list_head *)h;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/list.h.func-sort-c.html b/coverage-report/ccan/list/list.h.func-sort-c.html
new file mode 100644
index 0000000..dd4a604
--- /dev/null
+++ b/coverage-report/ccan/list/list.h.func-sort-c.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/list.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/list</a> - list.h<span style="font-size: 80%;"> (<a href="list.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">72</td>
+ <td class="headerCovTableEntry">72</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="list.h.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#552">list_entry_or_null</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#192">list_add_after</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#382">list_tail_</a></td>
+ <td class="coverFnHi">217</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#173">list_add_before</a></td>
+ <td class="coverFnHi">948</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#138">list_head_init</a></td>
+ <td class="coverFnHi">1866</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#213">list_add_tail</a></td>
+ <td class="coverFnHi">4901</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#354">list_pop_</a></td>
+ <td class="coverFnHi">5429</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#156">list_add</a></td>
+ <td class="coverFnHi">14471</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#291">list_del_from</a></td>
+ <td class="coverFnHi">15170</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#266">list_del</a></td>
+ <td class="coverFnHi">20070</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#247">list_empty_nocheck</a></td>
+ <td class="coverFnHi">130932</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#339">list_top_</a></td>
+ <td class="coverFnHi">133431</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#231">list_empty</a></td>
+ <td class="coverFnHi">163970</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#525">list_node_to_off_</a></td>
+ <td class="coverFnHi">376883</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#529">list_node_from_off_</a></td>
+ <td class="coverFnHi">603699</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/list.h.func.html b/coverage-report/ccan/list/list.h.func.html
new file mode 100644
index 0000000..3d7daaf
--- /dev/null
+++ b/coverage-report/ccan/list/list.h.func.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/list.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/list</a> - list.h<span style="font-size: 80%;"> (<a href="list.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">72</td>
+ <td class="headerCovTableEntry">72</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="list.h.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#156">list_add</a></td>
+ <td class="coverFnHi">14471</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#192">list_add_after</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#173">list_add_before</a></td>
+ <td class="coverFnHi">948</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#213">list_add_tail</a></td>
+ <td class="coverFnHi">4901</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#266">list_del</a></td>
+ <td class="coverFnHi">20070</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#291">list_del_from</a></td>
+ <td class="coverFnHi">15170</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#231">list_empty</a></td>
+ <td class="coverFnHi">163970</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#247">list_empty_nocheck</a></td>
+ <td class="coverFnHi">130932</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#552">list_entry_or_null</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#138">list_head_init</a></td>
+ <td class="coverFnHi">1866</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#529">list_node_from_off_</a></td>
+ <td class="coverFnHi">603699</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#525">list_node_to_off_</a></td>
+ <td class="coverFnHi">376883</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#354">list_pop_</a></td>
+ <td class="coverFnHi">5429</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#382">list_tail_</a></td>
+ <td class="coverFnHi">217</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.h.gcov.html#339">list_top_</a></td>
+ <td class="coverFnHi">133431</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/list.h.gcov.html b/coverage-report/ccan/list/list.h.gcov.html
new file mode 100644
index 0000000..342e63f
--- /dev/null
+++ b/coverage-report/ccan/list/list.h.gcov.html
@@ -0,0 +1,668 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/list.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/list</a> - list.h<span style="font-size: 80%;"> (source / <a href="list.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">72</td>
+ <td class="headerCovTableEntry">72</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Licensed under BSD-MIT - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #ifndef CCAN_LIST_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #define CCAN_LIST_H</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;assert.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;ccan/check_type/check_type.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : /**</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * struct list_node - an entry in a doubly-linked list</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * @next: next entry (self if empty)</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * @prev: previous entry (self if empty)</a>
+<a name="13"><span class="lineNum"> 13 </span> : : *</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * This is used as an entry in a linked list.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * Example:</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * struct child {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * const char *name;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * // Linked list of all us children.</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * struct list_node list;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * };</a>
+<a name="21"><span class="lineNum"> 21 </span> : : */</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct list_node</a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct list_node *next, *prev;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : };</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /**</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * struct list_head - the head of a doubly-linked list</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * @h: the list_head (containing next and prev pointers)</a>
+<a name="30"><span class="lineNum"> 30 </span> : : *</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * This is used as the head of a linked list.</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * Example:</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * struct parent {</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * const char *name;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * struct list_head children;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * unsigned int num_children;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * };</a>
+<a name="38"><span class="lineNum"> 38 </span> : : */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct list_head</a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> : : struct list_node n;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : };</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : /**</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * list_check - check head of a list for consistency</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * @h: the list_head</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * @abortstr: the location to print on aborting, or NULL.</a>
+<a name="48"><span class="lineNum"> 48 </span> : : *</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * Because list_nodes have redundant information, consistency checking between</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * the back and forward links can be done. This is useful as a debugging check.</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * If @abortstr is non-NULL, that will be printed in a diagnostic if the list</a>
+<a name="52"><span class="lineNum"> 52 </span> : : * is inconsistent, and the function will abort.</a>
+<a name="53"><span class="lineNum"> 53 </span> : : *</a>
+<a name="54"><span class="lineNum"> 54 </span> : : * Returns the list head if the list is consistent, NULL if not (it</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * can never return NULL if @abortstr is set).</a>
+<a name="56"><span class="lineNum"> 56 </span> : : *</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * See also: list_check_node()</a>
+<a name="58"><span class="lineNum"> 58 </span> : : *</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * Example:</a>
+<a name="60"><span class="lineNum"> 60 </span> : : * static void dump_parent(struct parent *p)</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * {</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * struct child *c;</a>
+<a name="63"><span class="lineNum"> 63 </span> : : *</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * printf(&quot;%s (%u children):\n&quot;, p-&gt;name, p-&gt;num_children);</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * list_check(&amp;p-&gt;children, &quot;bad child list&quot;);</a>
+<a name="66"><span class="lineNum"> 66 </span> : : * list_for_each(&amp;p-&gt;children, c, list)</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * printf(&quot; -&gt; %s\n&quot;, c-&gt;name);</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : */</a>
+<a name="70"><span class="lineNum"> 70 </span> : : struct list_head *list_check(const struct list_head *h, const char *abortstr);</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : /**</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * list_check_node - check node of a list for consistency</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * @n: the list_node</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * @abortstr: the location to print on aborting, or NULL.</a>
+<a name="76"><span class="lineNum"> 76 </span> : : *</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * Check consistency of the list node is in (it must be in one).</a>
+<a name="78"><span class="lineNum"> 78 </span> : : *</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * See also: list_check()</a>
+<a name="80"><span class="lineNum"> 80 </span> : : *</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * Example:</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * static void dump_child(const struct child *c)</a>
+<a name="83"><span class="lineNum"> 83 </span> : : * {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : * list_check_node(&amp;c-&gt;list, &quot;bad child list&quot;);</a>
+<a name="85"><span class="lineNum"> 85 </span> : : * printf(&quot;%s\n&quot;, c-&gt;name);</a>
+<a name="86"><span class="lineNum"> 86 </span> : : * }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : */</a>
+<a name="88"><span class="lineNum"> 88 </span> : : struct list_node *list_check_node(const struct list_node *n,</a>
+<a name="89"><span class="lineNum"> 89 </span> : : const char *abortstr);</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : #ifdef CCAN_LIST_DEBUG</a>
+<a name="92"><span class="lineNum"> 92 </span> : : #define list_debug(h) list_check((h), __func__)</a>
+<a name="93"><span class="lineNum"> 93 </span> : : #define list_debug_node(n) list_check_node((n), __func__)</a>
+<a name="94"><span class="lineNum"> 94 </span> : : #else</a>
+<a name="95"><span class="lineNum"> 95 </span> : : #define list_debug(h) (h)</a>
+<a name="96"><span class="lineNum"> 96 </span> : : #define list_debug_node(n) (n)</a>
+<a name="97"><span class="lineNum"> 97 </span> : : #endif</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /**</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * LIST_HEAD_INIT - initializer for an empty list_head</a>
+<a name="101"><span class="lineNum"> 101 </span> : : * @name: the name of the list.</a>
+<a name="102"><span class="lineNum"> 102 </span> : : *</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Explicit initializer for an empty list.</a>
+<a name="104"><span class="lineNum"> 104 </span> : : *</a>
+<a name="105"><span class="lineNum"> 105 </span> : : * See also:</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * LIST_HEAD, list_head_init()</a>
+<a name="107"><span class="lineNum"> 107 </span> : : *</a>
+<a name="108"><span class="lineNum"> 108 </span> : : * Example:</a>
+<a name="109"><span class="lineNum"> 109 </span> : : * static struct list_head my_list = LIST_HEAD_INIT(my_list);</a>
+<a name="110"><span class="lineNum"> 110 </span> : : */</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #define LIST_HEAD_INIT(name) { { &amp;name.n, &amp;name.n } }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : /**</a>
+<a name="114"><span class="lineNum"> 114 </span> : : * LIST_HEAD - define and initialize an empty list_head</a>
+<a name="115"><span class="lineNum"> 115 </span> : : * @name: the name of the list.</a>
+<a name="116"><span class="lineNum"> 116 </span> : : *</a>
+<a name="117"><span class="lineNum"> 117 </span> : : * The LIST_HEAD macro defines a list_head and initializes it to an empty</a>
+<a name="118"><span class="lineNum"> 118 </span> : : * list. It can be prepended by &quot;static&quot; to define a static list_head.</a>
+<a name="119"><span class="lineNum"> 119 </span> : : *</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * See also:</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * LIST_HEAD_INIT, list_head_init()</a>
+<a name="122"><span class="lineNum"> 122 </span> : : *</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * Example:</a>
+<a name="124"><span class="lineNum"> 124 </span> : : * static LIST_HEAD(my_global_list);</a>
+<a name="125"><span class="lineNum"> 125 </span> : : */</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #define LIST_HEAD(name) \</a>
+<a name="127"><span class="lineNum"> 127 </span> : : struct list_head name = LIST_HEAD_INIT(name)</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> : : /**</a>
+<a name="130"><span class="lineNum"> 130 </span> : : * list_head_init - initialize a list_head</a>
+<a name="131"><span class="lineNum"> 131 </span> : : * @h: the list_head to set to the empty list</a>
+<a name="132"><span class="lineNum"> 132 </span> : : *</a>
+<a name="133"><span class="lineNum"> 133 </span> : : * Example:</a>
+<a name="134"><span class="lineNum"> 134 </span> : : * ...</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * struct parent *parent = malloc(sizeof(*parent));</a>
+<a name="136"><span class="lineNum"> 136 </span> : : *</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * list_head_init(&amp;parent-&gt;children);</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * parent-&gt;num_children = 0;</a>
+<a name="139"><span class="lineNum"> 139 </span> : : */</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1866 : static inline void list_head_init(struct list_head *h)</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : {</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1866 : h-&gt;n.next = h-&gt;n.prev = &amp;h-&gt;n;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 1866 : }</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /**</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * list_add - add an entry at the start of a linked list.</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * @h: the list_head to add the node to</a>
+<a name="148"><span class="lineNum"> 148 </span> : : * @n: the list_node to add to the list.</a>
+<a name="149"><span class="lineNum"> 149 </span> : : *</a>
+<a name="150"><span class="lineNum"> 150 </span> : : * The list_node does not need to be initialized; it will be overwritten.</a>
+<a name="151"><span class="lineNum"> 151 </span> : : * Example:</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * struct child *child = malloc(sizeof(*child));</a>
+<a name="153"><span class="lineNum"> 153 </span> : : *</a>
+<a name="154"><span class="lineNum"> 154 </span> : : * child-&gt;name = &quot;marvin&quot;;</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * list_add(&amp;parent-&gt;children, &amp;child-&gt;list);</a>
+<a name="156"><span class="lineNum"> 156 </span> : : * parent-&gt;num_children++;</a>
+<a name="157"><span class="lineNum"> 157 </span> : : */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 14471 : static inline void list_add(struct list_head *h, struct list_node *n)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : {</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 14471 : n-&gt;next = h-&gt;n.next;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 14471 : n-&gt;prev = &amp;h-&gt;n;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 14471 : h-&gt;n.next-&gt;prev = n;</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 14471 : h-&gt;n.next = n;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 14471 : (void)list_debug(h);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 14471 : }</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : </a>
+<a name="167"><span class="lineNum"> 167 </span> : : /**</a>
+<a name="168"><span class="lineNum"> 168 </span> : : * list_add_before - add an entry before another entry.</a>
+<a name="169"><span class="lineNum"> 169 </span> : : * @h: the list_head to add the node to (we use it for debug purposes, can be NULL)</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * @n: the list_node to add to the list.</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * @p: the list_node of the other entry</a>
+<a name="172"><span class="lineNum"> 172 </span> : : *</a>
+<a name="173"><span class="lineNum"> 173 </span> : : * The list_node does not need to be initialized; it will be overwritten.</a>
+<a name="174"><span class="lineNum"> 174 </span> : : */</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 948 : static inline void list_add_before(struct list_head *h, struct list_node *n,</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : struct list_node *p)</a>
+<a name="177"><span class="lineNum"> 177 </span> : : {</a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 948 : n-&gt;next = p;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 948 : n-&gt;prev = p-&gt;prev;</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 948 : p-&gt;prev = n;</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 948 : n-&gt;prev-&gt;next = n;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 948 : if (h)</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 948 : (void)list_debug(h);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 948 : }</span></a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> : : /**</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * list_add_after - add an entry after another entry.</a>
+<a name="188"><span class="lineNum"> 188 </span> : : * @h: the list_head to add the node to (we use it for debug purposes, can be NULL)</a>
+<a name="189"><span class="lineNum"> 189 </span> : : * @n: the list_node to add to the list.</a>
+<a name="190"><span class="lineNum"> 190 </span> : : * @p: the list_node of the other entry</a>
+<a name="191"><span class="lineNum"> 191 </span> : : *</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * The list_node does not need to be initialized; it will be overwritten.</a>
+<a name="193"><span class="lineNum"> 193 </span> : : */</a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 40 : static inline void list_add_after(struct list_head *h, struct list_node *n,</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : struct list_node *p)</a>
+<a name="196"><span class="lineNum"> 196 </span> : : {</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 40 : n-&gt;next = p-&gt;next;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 40 : n-&gt;prev = p;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 40 : p-&gt;next = n;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 40 : n-&gt;next-&gt;prev = n;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 40 : if (h)</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 40 : (void)list_debug(h);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 40 : }</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> : : /**</a>
+<a name="206"><span class="lineNum"> 206 </span> : : * list_add_tail - add an entry at the end of a linked list.</a>
+<a name="207"><span class="lineNum"> 207 </span> : : * @h: the list_head to add the node to</a>
+<a name="208"><span class="lineNum"> 208 </span> : : * @n: the list_node to add to the list.</a>
+<a name="209"><span class="lineNum"> 209 </span> : : *</a>
+<a name="210"><span class="lineNum"> 210 </span> : : * The list_node does not need to be initialized; it will be overwritten.</a>
+<a name="211"><span class="lineNum"> 211 </span> : : * Example:</a>
+<a name="212"><span class="lineNum"> 212 </span> : : * list_add_tail(&amp;parent-&gt;children, &amp;child-&gt;list);</a>
+<a name="213"><span class="lineNum"> 213 </span> : : * parent-&gt;num_children++;</a>
+<a name="214"><span class="lineNum"> 214 </span> : : */</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 4901 : static inline void list_add_tail(struct list_head *h, struct list_node *n)</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 4901 : n-&gt;next = &amp;h-&gt;n;</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 4901 : n-&gt;prev = h-&gt;n.prev;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 4901 : h-&gt;n.prev-&gt;next = n;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 4901 : h-&gt;n.prev = n;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 4901 : (void)list_debug(h);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 4901 : }</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> : : /**</a>
+<a name="225"><span class="lineNum"> 225 </span> : : * list_empty - is a list empty?</a>
+<a name="226"><span class="lineNum"> 226 </span> : : * @h: the list_head</a>
+<a name="227"><span class="lineNum"> 227 </span> : : *</a>
+<a name="228"><span class="lineNum"> 228 </span> : : * If the list is empty, returns true.</a>
+<a name="229"><span class="lineNum"> 229 </span> : : *</a>
+<a name="230"><span class="lineNum"> 230 </span> : : * Example:</a>
+<a name="231"><span class="lineNum"> 231 </span> : : * assert(list_empty(&amp;parent-&gt;children) == (parent-&gt;num_children == 0));</a>
+<a name="232"><span class="lineNum"> 232 </span> : : */</a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 163970 : static inline bool list_empty(const struct list_head *h)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : {</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 163970 : (void)list_debug(h);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 163970 : return h-&gt;n.next == &amp;h-&gt;n;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : }</a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> : : /**</a>
+<a name="240"><span class="lineNum"> 240 </span> : : * list_empty_nocheck - is a list empty?</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * @h: the list_head</a>
+<a name="242"><span class="lineNum"> 242 </span> : : *</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * If the list is empty, returns true. This doesn't perform any</a>
+<a name="244"><span class="lineNum"> 244 </span> : : * debug check for list consistency, so it can be called without</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * locks, racing with the list being modified. This is ok for</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * checks where an incorrect result is not an issue (optimized</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * bail out path for example).</a>
+<a name="248"><span class="lineNum"> 248 </span> : : */</a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 130932 : static inline bool list_empty_nocheck(const struct list_head *h)</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : {</a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 130932 : return h-&gt;n.next == &amp;h-&gt;n;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : }</a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> : : /**</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * list_del - delete an entry from an (unknown) linked list.</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * @n: the list_node to delete from the list.</a>
+<a name="257"><span class="lineNum"> 257 </span> : : *</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * Note that this leaves @n in an undefined state; it can be added to</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * another list, but not deleted again.</a>
+<a name="260"><span class="lineNum"> 260 </span> : : *</a>
+<a name="261"><span class="lineNum"> 261 </span> : : * See also:</a>
+<a name="262"><span class="lineNum"> 262 </span> : : * list_del_from()</a>
+<a name="263"><span class="lineNum"> 263 </span> : : *</a>
+<a name="264"><span class="lineNum"> 264 </span> : : * Example:</a>
+<a name="265"><span class="lineNum"> 265 </span> : : * list_del(&amp;child-&gt;list);</a>
+<a name="266"><span class="lineNum"> 266 </span> : : * parent-&gt;num_children--;</a>
+<a name="267"><span class="lineNum"> 267 </span> : : */</a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 20070 : static inline void list_del(struct list_node *n)</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 20070 : (void)list_debug_node(n);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 20070 : n-&gt;next-&gt;prev = n-&gt;prev;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 20070 : n-&gt;prev-&gt;next = n-&gt;next;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : #ifdef CCAN_LIST_DEBUG</a>
+<a name="274"><span class="lineNum"> 274 </span> : : /* Catch use-after-del. */</a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 20070 : n-&gt;next = n-&gt;prev = NULL;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : #endif</a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 20070 : }</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> : : /**</a>
+<a name="280"><span class="lineNum"> 280 </span> : : * list_del_from - delete an entry from a known linked list.</a>
+<a name="281"><span class="lineNum"> 281 </span> : : * @h: the list_head the node is in.</a>
+<a name="282"><span class="lineNum"> 282 </span> : : * @n: the list_node to delete from the list.</a>
+<a name="283"><span class="lineNum"> 283 </span> : : *</a>
+<a name="284"><span class="lineNum"> 284 </span> : : * This explicitly indicates which list a node is expected to be in,</a>
+<a name="285"><span class="lineNum"> 285 </span> : : * which is better documentation and can catch more bugs.</a>
+<a name="286"><span class="lineNum"> 286 </span> : : *</a>
+<a name="287"><span class="lineNum"> 287 </span> : : * See also: list_del()</a>
+<a name="288"><span class="lineNum"> 288 </span> : : *</a>
+<a name="289"><span class="lineNum"> 289 </span> : : * Example:</a>
+<a name="290"><span class="lineNum"> 290 </span> : : * list_del_from(&amp;parent-&gt;children, &amp;child-&gt;list);</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * parent-&gt;num_children--;</a>
+<a name="292"><span class="lineNum"> 292 </span> : : */</a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 15170 : static inline void list_del_from(struct list_head *h, struct list_node *n)</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : {</a>
+<a name="295"><span class="lineNum"> 295 </span> : : #ifdef CCAN_LIST_DEBUG</a>
+<a name="296"><span class="lineNum"> 296 </span> : : {</a>
+<a name="297"><span class="lineNum"> 297 </span> : : /* Thorough check: make sure it was in list! */</a>
+<a name="298"><span class="lineNum"> 298 </span> : : struct list_node *i;</a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 16867 : for (i = h-&gt;n.next; i != n; i = i-&gt;next)</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 1697 : assert(i != &amp;h-&gt;n);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : }</a>
+<a name="302"><span class="lineNum"> 302 </span> : : #endif /* CCAN_LIST_DEBUG */</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> : : /* Quick test that catches a surprising number of bugs. */</a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 15170 : assert(!list_empty(h));</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 15170 : list_del(n);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 15170 : }</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : </a>
+<a name="309"><span class="lineNum"> 309 </span> : : /**</a>
+<a name="310"><span class="lineNum"> 310 </span> : : * list_entry - convert a list_node back into the structure containing it.</a>
+<a name="311"><span class="lineNum"> 311 </span> : : * @n: the list_node</a>
+<a name="312"><span class="lineNum"> 312 </span> : : * @type: the type of the entry</a>
+<a name="313"><span class="lineNum"> 313 </span> : : * @member: the list_node member of the type</a>
+<a name="314"><span class="lineNum"> 314 </span> : : *</a>
+<a name="315"><span class="lineNum"> 315 </span> : : * Example:</a>
+<a name="316"><span class="lineNum"> 316 </span> : : * // First list entry is children.next; convert back to child.</a>
+<a name="317"><span class="lineNum"> 317 </span> : : * child = list_entry(parent-&gt;children.n.next, struct child, list);</a>
+<a name="318"><span class="lineNum"> 318 </span> : : *</a>
+<a name="319"><span class="lineNum"> 319 </span> : : * See Also:</a>
+<a name="320"><span class="lineNum"> 320 </span> : : * list_top(), list_for_each()</a>
+<a name="321"><span class="lineNum"> 321 </span> : : */</a>
+<a name="322"><span class="lineNum"> 322 </span> : : #define list_entry(n, type, member) container_of(n, type, member)</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> : : /**</a>
+<a name="325"><span class="lineNum"> 325 </span> : : * list_top - get the first entry in a list</a>
+<a name="326"><span class="lineNum"> 326 </span> : : * @h: the list_head</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * @type: the type of the entry</a>
+<a name="328"><span class="lineNum"> 328 </span> : : * @member: the list_node member of the type</a>
+<a name="329"><span class="lineNum"> 329 </span> : : *</a>
+<a name="330"><span class="lineNum"> 330 </span> : : * If the list is empty, returns NULL.</a>
+<a name="331"><span class="lineNum"> 331 </span> : : *</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * Example:</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * struct child *first;</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * first = list_top(&amp;parent-&gt;children, struct child, list);</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * if (!first)</a>
+<a name="336"><span class="lineNum"> 336 </span> : : * printf(&quot;Empty list!\n&quot;);</a>
+<a name="337"><span class="lineNum"> 337 </span> : : */</a>
+<a name="338"><span class="lineNum"> 338 </span> : : #define list_top(h, type, member) \</a>
+<a name="339"><span class="lineNum"> 339 </span> : : ((type *)list_top_((h), list_off_(type, member)))</a>
+<a name="340"><span class="lineNum"> 340 </span> : : </a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 133431 : static inline const void *list_top_(const struct list_head *h, size_t off)</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : {</a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 133431 : if (list_empty(h))</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 66360 : return NULL;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 67071 : return (const char *)h-&gt;n.next - off;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : }</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /**</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * list_pop - get the first entry in a list and dequeue it</a>
+<a name="350"><span class="lineNum"> 350 </span> : : * @h: the list_head</a>
+<a name="351"><span class="lineNum"> 351 </span> : : * @type: the type of the entry</a>
+<a name="352"><span class="lineNum"> 352 </span> : : * @member: the list_node member of the type</a>
+<a name="353"><span class="lineNum"> 353 </span> : : */</a>
+<a name="354"><span class="lineNum"> 354 </span> : : #define list_pop(h, type, member) \</a>
+<a name="355"><span class="lineNum"> 355 </span> : : ((type *)list_pop_((h), list_off_(type, member)))</a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 5429 : static inline const void *list_pop_(struct list_head *h, size_t off)</span></a>
+<a name="357"><span class="lineNum"> 357 </span> : : {</a>
+<a name="358"><span class="lineNum"> 358 </span> : : struct list_node *n;</a>
+<a name="359"><span class="lineNum"> 359 </span> : : </a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 5429 : if (list_empty(h))</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 861 : return NULL;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 4568 : n = h-&gt;n.next;</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 4568 : list_del(n);</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 4568 : return (const char *)n - off;</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : }</a>
+<a name="366"><span class="lineNum"> 366 </span> : : </a>
+<a name="367"><span class="lineNum"> 367 </span> : : /**</a>
+<a name="368"><span class="lineNum"> 368 </span> : : * list_tail - get the last entry in a list</a>
+<a name="369"><span class="lineNum"> 369 </span> : : * @h: the list_head</a>
+<a name="370"><span class="lineNum"> 370 </span> : : * @type: the type of the entry</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * @member: the list_node member of the type</a>
+<a name="372"><span class="lineNum"> 372 </span> : : *</a>
+<a name="373"><span class="lineNum"> 373 </span> : : * If the list is empty, returns NULL.</a>
+<a name="374"><span class="lineNum"> 374 </span> : : *</a>
+<a name="375"><span class="lineNum"> 375 </span> : : * Example:</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * struct child *last;</a>
+<a name="377"><span class="lineNum"> 377 </span> : : * last = list_tail(&amp;parent-&gt;children, struct child, list);</a>
+<a name="378"><span class="lineNum"> 378 </span> : : * if (!last)</a>
+<a name="379"><span class="lineNum"> 379 </span> : : * printf(&quot;Empty list!\n&quot;);</a>
+<a name="380"><span class="lineNum"> 380 </span> : : */</a>
+<a name="381"><span class="lineNum"> 381 </span> : : #define list_tail(h, type, member) \</a>
+<a name="382"><span class="lineNum"> 382 </span> : : ((type *)list_tail_((h), list_off_(type, member)))</a>
+<a name="383"><span class="lineNum"> 383 </span> : : </a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 217 : static inline const void *list_tail_(const struct list_head *h, size_t off)</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : {</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 217 : if (list_empty(h))</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 144 : return NULL;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineCov"> 73 : return (const char *)h-&gt;n.prev - off;</span></a>
+<a name="389"><span class="lineNum"> 389 </span> : : }</a>
+<a name="390"><span class="lineNum"> 390 </span> : : </a>
+<a name="391"><span class="lineNum"> 391 </span> : : /**</a>
+<a name="392"><span class="lineNum"> 392 </span> : : * list_for_each - iterate through a list.</a>
+<a name="393"><span class="lineNum"> 393 </span> : : * @h: the list_head (warning: evaluated multiple times!)</a>
+<a name="394"><span class="lineNum"> 394 </span> : : * @i: the structure containing the list_node</a>
+<a name="395"><span class="lineNum"> 395 </span> : : * @member: the list_node member of the structure</a>
+<a name="396"><span class="lineNum"> 396 </span> : : *</a>
+<a name="397"><span class="lineNum"> 397 </span> : : * This is a convenient wrapper to iterate @i over the entire list. It's</a>
+<a name="398"><span class="lineNum"> 398 </span> : : * a for loop, so you can break and continue as normal.</a>
+<a name="399"><span class="lineNum"> 399 </span> : : *</a>
+<a name="400"><span class="lineNum"> 400 </span> : : * Example:</a>
+<a name="401"><span class="lineNum"> 401 </span> : : * list_for_each(&amp;parent-&gt;children, child, list)</a>
+<a name="402"><span class="lineNum"> 402 </span> : : * printf(&quot;Name: %s\n&quot;, child-&gt;name);</a>
+<a name="403"><span class="lineNum"> 403 </span> : : */</a>
+<a name="404"><span class="lineNum"> 404 </span> : : #define list_for_each(h, i, member) \</a>
+<a name="405"><span class="lineNum"> 405 </span> : : list_for_each_off(h, i, list_off_var_(i, member))</a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> : : /**</a>
+<a name="408"><span class="lineNum"> 408 </span> : : * list_for_each_rev - iterate through a list backwards.</a>
+<a name="409"><span class="lineNum"> 409 </span> : : * @h: the list_head</a>
+<a name="410"><span class="lineNum"> 410 </span> : : * @i: the structure containing the list_node</a>
+<a name="411"><span class="lineNum"> 411 </span> : : * @member: the list_node member of the structure</a>
+<a name="412"><span class="lineNum"> 412 </span> : : *</a>
+<a name="413"><span class="lineNum"> 413 </span> : : * This is a convenient wrapper to iterate @i over the entire list. It's</a>
+<a name="414"><span class="lineNum"> 414 </span> : : * a for loop, so you can break and continue as normal.</a>
+<a name="415"><span class="lineNum"> 415 </span> : : *</a>
+<a name="416"><span class="lineNum"> 416 </span> : : * Example:</a>
+<a name="417"><span class="lineNum"> 417 </span> : : * list_for_each_rev(&amp;parent-&gt;children, child, list)</a>
+<a name="418"><span class="lineNum"> 418 </span> : : * printf(&quot;Name: %s\n&quot;, child-&gt;name);</a>
+<a name="419"><span class="lineNum"> 419 </span> : : */</a>
+<a name="420"><span class="lineNum"> 420 </span> : : #define list_for_each_rev(h, i, member) \</a>
+<a name="421"><span class="lineNum"> 421 </span> : : for (i = container_of_var(list_debug(h)-&gt;n.prev, i, member); \</a>
+<a name="422"><span class="lineNum"> 422 </span> : : &amp;i-&gt;member != &amp;(h)-&gt;n; \</a>
+<a name="423"><span class="lineNum"> 423 </span> : : i = container_of_var(i-&gt;member.prev, i, member))</a>
+<a name="424"><span class="lineNum"> 424 </span> : : </a>
+<a name="425"><span class="lineNum"> 425 </span> : : /**</a>
+<a name="426"><span class="lineNum"> 426 </span> : : * list_for_each_safe - iterate through a list, maybe during deletion</a>
+<a name="427"><span class="lineNum"> 427 </span> : : * @h: the list_head</a>
+<a name="428"><span class="lineNum"> 428 </span> : : * @i: the structure containing the list_node</a>
+<a name="429"><span class="lineNum"> 429 </span> : : * @nxt: the structure containing the list_node</a>
+<a name="430"><span class="lineNum"> 430 </span> : : * @member: the list_node member of the structure</a>
+<a name="431"><span class="lineNum"> 431 </span> : : *</a>
+<a name="432"><span class="lineNum"> 432 </span> : : * This is a convenient wrapper to iterate @i over the entire list. It's</a>
+<a name="433"><span class="lineNum"> 433 </span> : : * a for loop, so you can break and continue as normal. The extra variable</a>
+<a name="434"><span class="lineNum"> 434 </span> : : * @nxt is used to hold the next element, so you can delete @i from the list.</a>
+<a name="435"><span class="lineNum"> 435 </span> : : *</a>
+<a name="436"><span class="lineNum"> 436 </span> : : * Example:</a>
+<a name="437"><span class="lineNum"> 437 </span> : : * struct child *next;</a>
+<a name="438"><span class="lineNum"> 438 </span> : : * list_for_each_safe(&amp;parent-&gt;children, child, next, list) {</a>
+<a name="439"><span class="lineNum"> 439 </span> : : * list_del(&amp;child-&gt;list);</a>
+<a name="440"><span class="lineNum"> 440 </span> : : * parent-&gt;num_children--;</a>
+<a name="441"><span class="lineNum"> 441 </span> : : * }</a>
+<a name="442"><span class="lineNum"> 442 </span> : : */</a>
+<a name="443"><span class="lineNum"> 443 </span> : : #define list_for_each_safe(h, i, nxt, member) \</a>
+<a name="444"><span class="lineNum"> 444 </span> : : list_for_each_safe_off(h, i, nxt, list_off_var_(i, member))</a>
+<a name="445"><span class="lineNum"> 445 </span> : : </a>
+<a name="446"><span class="lineNum"> 446 </span> : : /**</a>
+<a name="447"><span class="lineNum"> 447 </span> : : * list_for_each_off - iterate through a list of memory regions.</a>
+<a name="448"><span class="lineNum"> 448 </span> : : * @h: the list_head</a>
+<a name="449"><span class="lineNum"> 449 </span> : : * @i: the pointer to a memory region which contains list node data.</a>
+<a name="450"><span class="lineNum"> 450 </span> : : * @off: offset(relative to @i) at which list node data resides.</a>
+<a name="451"><span class="lineNum"> 451 </span> : : *</a>
+<a name="452"><span class="lineNum"> 452 </span> : : * This is a low-level wrapper to iterate @i over the entire list, used to</a>
+<a name="453"><span class="lineNum"> 453 </span> : : * implement all oher, more high-level, for-each constructs. It's a for loop,</a>
+<a name="454"><span class="lineNum"> 454 </span> : : * so you can break and continue as normal.</a>
+<a name="455"><span class="lineNum"> 455 </span> : : *</a>
+<a name="456"><span class="lineNum"> 456 </span> : : * WARNING! Being the low-level macro that it is, this wrapper doesn't know</a>
+<a name="457"><span class="lineNum"> 457 </span> : : * nor care about the type of @i. The only assumtion made is that @i points</a>
+<a name="458"><span class="lineNum"> 458 </span> : : * to a chunk of memory that at some @offset, relative to @i, contains a</a>
+<a name="459"><span class="lineNum"> 459 </span> : : * properly filled `struct node_list' which in turn contains pointers to</a>
+<a name="460"><span class="lineNum"> 460 </span> : : * memory chunks and it's turtles all the way down. With all that in mind</a>
+<a name="461"><span class="lineNum"> 461 </span> : : * remember that given the wrong pointer/offset couple this macro will</a>
+<a name="462"><span class="lineNum"> 462 </span> : : * happily churn all you memory until SEGFAULT stops it, in other words</a>
+<a name="463"><span class="lineNum"> 463 </span> : : * caveat emptor.</a>
+<a name="464"><span class="lineNum"> 464 </span> : : *</a>
+<a name="465"><span class="lineNum"> 465 </span> : : * It is worth mentioning that one of legitimate use-cases for that wrapper</a>
+<a name="466"><span class="lineNum"> 466 </span> : : * is operation on opaque types with known offset for `struct list_node'</a>
+<a name="467"><span class="lineNum"> 467 </span> : : * member(preferably 0), because it allows you not to disclose the type of</a>
+<a name="468"><span class="lineNum"> 468 </span> : : * @i.</a>
+<a name="469"><span class="lineNum"> 469 </span> : : *</a>
+<a name="470"><span class="lineNum"> 470 </span> : : * Example:</a>
+<a name="471"><span class="lineNum"> 471 </span> : : * list_for_each_off(&amp;parent-&gt;children, child,</a>
+<a name="472"><span class="lineNum"> 472 </span> : : * offsetof(struct child, list))</a>
+<a name="473"><span class="lineNum"> 473 </span> : : * printf(&quot;Name: %s\n&quot;, child-&gt;name);</a>
+<a name="474"><span class="lineNum"> 474 </span> : : */</a>
+<a name="475"><span class="lineNum"> 475 </span> : : #define list_for_each_off(h, i, off) \</a>
+<a name="476"><span class="lineNum"> 476 </span> : : for (i = list_node_to_off_(list_debug(h)-&gt;n.next, (off)); \</a>
+<a name="477"><span class="lineNum"> 477 </span> : : list_node_from_off_((void *)i, (off)) != &amp;(h)-&gt;n; \</a>
+<a name="478"><span class="lineNum"> 478 </span> : : i = list_node_to_off_(list_node_from_off_((void *)i, (off))-&gt;next, \</a>
+<a name="479"><span class="lineNum"> 479 </span> : : (off)))</a>
+<a name="480"><span class="lineNum"> 480 </span> : : </a>
+<a name="481"><span class="lineNum"> 481 </span> : : /**</a>
+<a name="482"><span class="lineNum"> 482 </span> : : * list_for_each_safe_off - iterate through a list of memory regions, maybe</a>
+<a name="483"><span class="lineNum"> 483 </span> : : * during deletion</a>
+<a name="484"><span class="lineNum"> 484 </span> : : * @h: the list_head</a>
+<a name="485"><span class="lineNum"> 485 </span> : : * @i: the pointer to a memory region which contains list node data.</a>
+<a name="486"><span class="lineNum"> 486 </span> : : * @nxt: the structure containing the list_node</a>
+<a name="487"><span class="lineNum"> 487 </span> : : * @off: offset(relative to @i) at which list node data resides.</a>
+<a name="488"><span class="lineNum"> 488 </span> : : *</a>
+<a name="489"><span class="lineNum"> 489 </span> : : * For details see `list_for_each_off' and `list_for_each_safe'</a>
+<a name="490"><span class="lineNum"> 490 </span> : : * descriptions.</a>
+<a name="491"><span class="lineNum"> 491 </span> : : *</a>
+<a name="492"><span class="lineNum"> 492 </span> : : * Example:</a>
+<a name="493"><span class="lineNum"> 493 </span> : : * list_for_each_safe_off(&amp;parent-&gt;children, child,</a>
+<a name="494"><span class="lineNum"> 494 </span> : : * next, offsetof(struct child, list))</a>
+<a name="495"><span class="lineNum"> 495 </span> : : * printf(&quot;Name: %s\n&quot;, child-&gt;name);</a>
+<a name="496"><span class="lineNum"> 496 </span> : : */</a>
+<a name="497"><span class="lineNum"> 497 </span> : : #define list_for_each_safe_off(h, i, nxt, off) \</a>
+<a name="498"><span class="lineNum"> 498 </span> : : for (i = list_node_to_off_(list_debug(h)-&gt;n.next, (off)), \</a>
+<a name="499"><span class="lineNum"> 499 </span> : : nxt = list_node_to_off_(list_node_from_off_(i, (off))-&gt;next, \</a>
+<a name="500"><span class="lineNum"> 500 </span> : : (off)); \</a>
+<a name="501"><span class="lineNum"> 501 </span> : : list_node_from_off_(i, (off)) != &amp;(h)-&gt;n; \</a>
+<a name="502"><span class="lineNum"> 502 </span> : : i = nxt, \</a>
+<a name="503"><span class="lineNum"> 503 </span> : : nxt = list_node_to_off_(list_node_from_off_(i, (off))-&gt;next, \</a>
+<a name="504"><span class="lineNum"> 504 </span> : : (off)))</a>
+<a name="505"><span class="lineNum"> 505 </span> : : </a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> : : /* Other -off variants. */</a>
+<a name="508"><span class="lineNum"> 508 </span> : : #define list_entry_off(n, type, off) \</a>
+<a name="509"><span class="lineNum"> 509 </span> : : ((type *)list_node_from_off_((n), (off)))</a>
+<a name="510"><span class="lineNum"> 510 </span> : : </a>
+<a name="511"><span class="lineNum"> 511 </span> : : #define list_head_off(h, type, off) \</a>
+<a name="512"><span class="lineNum"> 512 </span> : : ((type *)list_head_off((h), (off)))</a>
+<a name="513"><span class="lineNum"> 513 </span> : : </a>
+<a name="514"><span class="lineNum"> 514 </span> : : #define list_tail_off(h, type, off) \</a>
+<a name="515"><span class="lineNum"> 515 </span> : : ((type *)list_tail_((h), (off)))</a>
+<a name="516"><span class="lineNum"> 516 </span> : : </a>
+<a name="517"><span class="lineNum"> 517 </span> : : #define list_add_off(h, n, off) \</a>
+<a name="518"><span class="lineNum"> 518 </span> : : list_add((h), list_node_from_off_((n), (off)))</a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> : : #define list_del_off(n, off) \</a>
+<a name="521"><span class="lineNum"> 521 </span> : : list_del(list_node_from_off_((n), (off)))</a>
+<a name="522"><span class="lineNum"> 522 </span> : : </a>
+<a name="523"><span class="lineNum"> 523 </span> : : #define list_del_from_off(h, n, off) \</a>
+<a name="524"><span class="lineNum"> 524 </span> : : list_del_from(h, list_node_from_off_((n), (off)))</a>
+<a name="525"><span class="lineNum"> 525 </span> : : </a>
+<a name="526"><span class="lineNum"> 526 </span> : : /* Offset helper functions so we only single-evaluate. */</a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 376883 : static inline void *list_node_to_off_(struct list_node *node, size_t off)</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : {</a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 376883 : return (void *)((char *)node - off);</span></a>
+<a name="530"><span class="lineNum"> 530 </span> : : }</a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 603699 : static inline struct list_node *list_node_from_off_(void *ptr, size_t off)</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : {</a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineCov"> 603699 : return (struct list_node *)((char *)ptr + off);</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : }</a>
+<a name="535"><span class="lineNum"> 535 </span> : : </a>
+<a name="536"><span class="lineNum"> 536 </span> : : /* Get the offset of the member, but make sure it's a list_node. */</a>
+<a name="537"><span class="lineNum"> 537 </span> : : #define list_off_(type, member) \</a>
+<a name="538"><span class="lineNum"> 538 </span> : : (container_off(type, member) + \</a>
+<a name="539"><span class="lineNum"> 539 </span> : : check_type(((type *)0)-&gt;member, struct list_node))</a>
+<a name="540"><span class="lineNum"> 540 </span> : : </a>
+<a name="541"><span class="lineNum"> 541 </span> : : #define list_off_var_(var, member) \</a>
+<a name="542"><span class="lineNum"> 542 </span> : : (container_off_var(var, member) + \</a>
+<a name="543"><span class="lineNum"> 543 </span> : : check_type(var-&gt;member, struct list_node))</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> : : </a>
+<a name="546"><span class="lineNum"> 546 </span> : : #if HAVE_TYPEOF</a>
+<a name="547"><span class="lineNum"> 547 </span> : : #define list_typeof(var) typeof(var)</a>
+<a name="548"><span class="lineNum"> 548 </span> : : #else</a>
+<a name="549"><span class="lineNum"> 549 </span> : : #define list_typeof(var) void *</a>
+<a name="550"><span class="lineNum"> 550 </span> : : #endif</a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> : : </a>
+<a name="553"><span class="lineNum"> 553 </span> : : /* Returns member, or NULL if at end of list. */</a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineCov"> 3 : static inline void *list_entry_or_null(const struct list_head *h,</span></a>
+<a name="555"><span class="lineNum"> 555 </span> : : const struct list_node *n,</a>
+<a name="556"><span class="lineNum"> 556 </span> : : size_t off)</a>
+<a name="557"><span class="lineNum"> 557 </span> : : {</a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 3 : if (n == &amp;h-&gt;n)</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineCov"> 2 : return (char *)n - off;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : }</a>
+<a name="562"><span class="lineNum"> 562 </span> : : </a>
+<a name="563"><span class="lineNum"> 563 </span> : : /**</a>
+<a name="564"><span class="lineNum"> 564 </span> : : * list_next - get the next entry in a list</a>
+<a name="565"><span class="lineNum"> 565 </span> : : * @h: the list_head</a>
+<a name="566"><span class="lineNum"> 566 </span> : : * @i: a pointer to an entry in the list.</a>
+<a name="567"><span class="lineNum"> 567 </span> : : * @member: the list_node member of the structure</a>
+<a name="568"><span class="lineNum"> 568 </span> : : *</a>
+<a name="569"><span class="lineNum"> 569 </span> : : * If @i was the last entry in the list, returns NULL.</a>
+<a name="570"><span class="lineNum"> 570 </span> : : *</a>
+<a name="571"><span class="lineNum"> 571 </span> : : * Example:</a>
+<a name="572"><span class="lineNum"> 572 </span> : : * struct child *second;</a>
+<a name="573"><span class="lineNum"> 573 </span> : : * second = list_next(&amp;parent-&gt;children, first, list);</a>
+<a name="574"><span class="lineNum"> 574 </span> : : * if (!second)</a>
+<a name="575"><span class="lineNum"> 575 </span> : : * printf(&quot;No second child!\n&quot;);</a>
+<a name="576"><span class="lineNum"> 576 </span> : : */</a>
+<a name="577"><span class="lineNum"> 577 </span> : : #define list_next(h, i, member) \</a>
+<a name="578"><span class="lineNum"> 578 </span> : : ((list_typeof(i))list_entry_or_null(list_debug(h), \</a>
+<a name="579"><span class="lineNum"> 579 </span> : : (i)-&gt;member.next, \</a>
+<a name="580"><span class="lineNum"> 580 </span> : : list_off_var_((i), member)))</a>
+<a name="581"><span class="lineNum"> 581 </span> : : </a>
+<a name="582"><span class="lineNum"> 582 </span> : : </a>
+<a name="583"><span class="lineNum"> 583 </span> : : #endif /* CCAN_LIST_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/helper.c.func-sort-c.html b/coverage-report/ccan/list/test/helper.c.func-sort-c.html
new file mode 100644
index 0000000..14f37c3
--- /dev/null
+++ b/coverage-report/ccan/list/test/helper.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/helper.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - helper.c<span style="font-size: 80%;"> (<a href="helper.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="helper.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="helper.c.gcov.html#17">create_opaque_blob</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="helper.c.gcov.html#49">destroy_opaque_blob</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="helper.c.gcov.html#33">if_blobs_know_the_secret</a></td>
+ <td class="coverFnHi">60</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/helper.c.func.html b/coverage-report/ccan/list/test/helper.c.func.html
new file mode 100644
index 0000000..65170a7
--- /dev/null
+++ b/coverage-report/ccan/list/test/helper.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/helper.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - helper.c<span style="font-size: 80%;"> (<a href="helper.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="helper.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="helper.c.gcov.html#17">create_opaque_blob</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="helper.c.gcov.html#49">destroy_opaque_blob</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="helper.c.gcov.html#33">if_blobs_know_the_secret</a></td>
+ <td class="coverFnHi">60</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/helper.c.gcov.html b/coverage-report/ccan/list/test/helper.c.gcov.html
new file mode 100644
index 0000000..ff2f9d2
--- /dev/null
+++ b/coverage-report/ccan/list/test/helper.c.gcov.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/helper.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - helper.c<span style="font-size: 80%;"> (source / <a href="helper.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;time.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : </a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &quot;helper.h&quot;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING \</a>
+<a name="9"><span class="lineNum"> 9 </span> : : (42)</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : struct opaque {</a>
+<a name="12"><span class="lineNum"> 12 </span> : : struct list_node list;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : size_t secret_offset;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : char secret_drawer[42];</a>
+<a name="15"><span class="lineNum"> 15 </span> : : };</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : static bool not_randomized = true;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 36 : struct opaque *create_opaque_blob(void)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 36 : struct opaque *blob = calloc(1, sizeof(struct opaque));</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 36 : if (not_randomized) {</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 12 : srandom((int)time(NULL));</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 12 : not_randomized = false;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 36 : blob-&gt;secret_offset = random() % (sizeof(blob-&gt;secret_drawer));</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 36 : blob-&gt;secret_drawer[blob-&gt;secret_offset] =</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 36 : return blob;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 60 : bool if_blobs_know_the_secret(struct opaque *blob)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : {</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 60 : bool answer = true;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : int i;</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 2580 : for (i = 0; i &lt; sizeof(blob-&gt;secret_drawer) /</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 2520 : sizeof(blob-&gt;secret_drawer[0]); i++)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 2520 : if (i != blob-&gt;secret_offset)</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 2460 : answer = answer &amp;&amp; (blob-&gt;secret_drawer[i] == 0);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : else</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 120 : answer = answer &amp;&amp;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 60 : (blob-&gt;secret_drawer[blob-&gt;secret_offset] ==</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING);</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 60 : return answer;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : }</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 36 : void destroy_opaque_blob(struct opaque *blob)</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : {</a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 36 : free(blob);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 36 : }</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/index-sort-b.html b/coverage-report/ccan/list/test/index-sort-b.html
new file mode 100644
index 0000000..fd7ced4
--- /dev/null
+++ b/coverage-report/ccan/list/test/index-sort-b.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/list/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">310</td>
+ <td class="headerCovTableEntry">316</td>
+ <td class="headerCovTableEntryHi">98.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="helper.c.gcov.html">helper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-list_del_from-assert.c.gcov.html">run-list_del_from-assert.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=80 height=10 alt="80.0%"><img src="../../../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-check-corrupt.c.gcov.html">run-check-corrupt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=92 height=10 alt="91.7%"><img src="../../../snow.png" width=8 height=10 alt="91.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.7&nbsp;%</td>
+ <td class="coverNumHi">33 / 36</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-single-eval.c.gcov.html">run-single-eval.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">112 / 112</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">133 / 133</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/index-sort-f.html b/coverage-report/ccan/list/test/index-sort-f.html
new file mode 100644
index 0000000..54a28eb
--- /dev/null
+++ b/coverage-report/ccan/list/test/index-sort-f.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/list/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">310</td>
+ <td class="headerCovTableEntry">316</td>
+ <td class="headerCovTableEntryHi">98.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-list_del_from-assert.c.gcov.html">run-list_del_from-assert.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=80 height=10 alt="80.0%"><img src="../../../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-single-eval.c.gcov.html">run-single-eval.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">112 / 112</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">133 / 133</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-check-corrupt.c.gcov.html">run-check-corrupt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=92 height=10 alt="91.7%"><img src="../../../snow.png" width=8 height=10 alt="91.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.7&nbsp;%</td>
+ <td class="coverNumHi">33 / 36</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="helper.c.gcov.html">helper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/index-sort-l.html b/coverage-report/ccan/list/test/index-sort-l.html
new file mode 100644
index 0000000..8da8c41
--- /dev/null
+++ b/coverage-report/ccan/list/test/index-sort-l.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/list/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">310</td>
+ <td class="headerCovTableEntry">316</td>
+ <td class="headerCovTableEntryHi">98.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-list_del_from-assert.c.gcov.html">run-list_del_from-assert.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=80 height=10 alt="80.0%"><img src="../../../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-check-corrupt.c.gcov.html">run-check-corrupt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=92 height=10 alt="91.7%"><img src="../../../snow.png" width=8 height=10 alt="91.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.7&nbsp;%</td>
+ <td class="coverNumHi">33 / 36</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="helper.c.gcov.html">helper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-single-eval.c.gcov.html">run-single-eval.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">112 / 112</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">133 / 133</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/index.html b/coverage-report/ccan/list/test/index.html
new file mode 100644
index 0000000..a605d76
--- /dev/null
+++ b/coverage-report/ccan/list/test/index.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/list/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">310</td>
+ <td class="headerCovTableEntry">316</td>
+ <td class="headerCovTableEntryHi">98.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="helper.c.gcov.html">helper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-check-corrupt.c.gcov.html">run-check-corrupt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=92 height=10 alt="91.7%"><img src="../../../snow.png" width=8 height=10 alt="91.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.7&nbsp;%</td>
+ <td class="coverNumHi">33 / 36</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-list_del_from-assert.c.gcov.html">run-list_del_from-assert.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=80 height=10 alt="80.0%"><img src="../../../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-single-eval.c.gcov.html">run-single-eval.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">112 / 112</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">133 / 133</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-check-corrupt.c.func-sort-c.html b/coverage-report/ccan/list/test/run-check-corrupt.c.func-sort-c.html
new file mode 100644
index 0000000..1fba9f8
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-check-corrupt.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-check-corrupt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-check-corrupt.c<span style="font-size: 80%;"> (<a href="run-check-corrupt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">33</td>
+ <td class="headerCovTableEntry">36</td>
+ <td class="headerCovTableEntryHi">91.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-check-corrupt.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-check-corrupt.c.gcov.html#30">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-check-corrupt.c.gcov.html#13">my_fprintf</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-check-corrupt.c.func.html b/coverage-report/ccan/list/test/run-check-corrupt.c.func.html
new file mode 100644
index 0000000..26b92b5
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-check-corrupt.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-check-corrupt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-check-corrupt.c<span style="font-size: 80%;"> (<a href="run-check-corrupt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">33</td>
+ <td class="headerCovTableEntry">36</td>
+ <td class="headerCovTableEntryHi">91.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-check-corrupt.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-check-corrupt.c.gcov.html#30">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-check-corrupt.c.gcov.html#13">my_fprintf</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-check-corrupt.c.gcov.html b/coverage-report/ccan/list/test/run-check-corrupt.c.gcov.html
new file mode 100644
index 0000000..61823a2
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-check-corrupt.c.gcov.html
@@ -0,0 +1,180 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-check-corrupt.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-check-corrupt.c<span style="font-size: 80%;"> (source / <a href="run-check-corrupt.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">33</td>
+ <td class="headerCovTableEntry">36</td>
+ <td class="headerCovTableEntryHi">91.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;setjmp.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;string.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;err.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : /* We don't actually want it to exit... */</a>
+<a name="9"><span class="lineNum"> 9 </span> : : static jmp_buf aborted;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #define abort() longjmp(aborted, 1)</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define fprintf my_fprintf</a>
+<a name="13"><span class="lineNum"> 13 </span> : : static char printf_buffer[1000];</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 18 : static int my_fprintf(FILE *stream, const char *format, ...)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : va_list ap;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : int ret;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : (void)stream;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 18 : va_start(ap, format);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 18 : ret = vsnprintf(printf_buffer, sizeof(printf_buffer), format, ap);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 18 : va_end(ap);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 18 : return ret;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #include &lt;ccan/list/list.c&gt;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 6 : int main(int argc, char *argv[])</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> : : struct list_head list;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : struct list_node n1;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : char expect[100];</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> : : (void)argc;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : (void)argv;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : plan_tests(9);</a>
+<a name="42"><span class="lineNum"> 42 </span> : : /* Empty list. */</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 6 : list.n.next = &amp;list.n;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 6 : list.n.prev = &amp;list.n;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 6 : ok1(list_check(&amp;list, NULL) == &amp;list);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* Bad back ptr */</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 6 : list.n.prev = &amp;n1;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : /* Non-aborting version. */</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 6 : ok1(list_check(&amp;list, NULL) == NULL);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> : : /* Aborting version. */</a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 6 : sprintf(expect, &quot;test message: prev corrupt in node %p (0) of %p\n&quot;,</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : &amp;list, &amp;list);</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 6 : if (setjmp(aborted) == 0) {</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 6 : list_check(&amp;list, &quot;test message&quot;);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : fail(&quot;list_check on empty with bad back ptr didn't fail!&quot;);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : } else {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 6 : ok1(strcmp(printf_buffer, expect) == 0);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : }</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> : : /* n1 in list. */</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 6 : list.n.next = &amp;n1;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 6 : list.n.prev = &amp;n1;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 6 : n1.prev = &amp;list.n;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 6 : n1.next = &amp;list.n;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 6 : ok1(list_check(&amp;list, NULL) == &amp;list);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 6 : ok1(list_check_node(&amp;n1, NULL) == &amp;n1);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* Bad back ptr */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 6 : n1.prev = &amp;n1;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 6 : ok1(list_check(&amp;list, NULL) == NULL);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 6 : ok1(list_check_node(&amp;n1, NULL) == NULL);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /* Aborting version. */</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 6 : sprintf(expect, &quot;test message: prev corrupt in node %p (1) of %p\n&quot;,</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : &amp;n1, &amp;list);</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 6 : if (setjmp(aborted) == 0) {</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 6 : list_check(&amp;list, &quot;test message&quot;);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : fail(&quot;list_check on n1 bad back ptr didn't fail!&quot;);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : } else {</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 6 : ok1(strcmp(printf_buffer, expect) == 0);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 6 : sprintf(expect, &quot;test message: prev corrupt in node %p (0) of %p\n&quot;,</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : &amp;n1, &amp;n1);</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 6 : if (setjmp(aborted) == 0) {</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 6 : list_check_node(&amp;n1, &quot;test message&quot;);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : fail(&quot;list_check_node on n1 bad back ptr didn't fail!&quot;);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : } else {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 6 : ok1(strcmp(printf_buffer, expect) == 0);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 6 : return exit_status();</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-list_del_from-assert.c.func-sort-c.html b/coverage-report/ccan/list/test/run-list_del_from-assert.c.func-sort-c.html
new file mode 100644
index 0000000..d566b3b
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-list_del_from-assert.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-list_del_from-assert.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-list_del_from-assert.c<span style="font-size: 80%;"> (<a href="run-list_del_from-assert.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-list_del_from-assert.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-list_del_from-assert.c.gcov.html#8">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-list_del_from-assert.c.func.html b/coverage-report/ccan/list/test/run-list_del_from-assert.c.func.html
new file mode 100644
index 0000000..38a5fc9
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-list_del_from-assert.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-list_del_from-assert.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-list_del_from-assert.c<span style="font-size: 80%;"> (<a href="run-list_del_from-assert.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-list_del_from-assert.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-list_del_from-assert.c.gcov.html#8">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-list_del_from-assert.c.gcov.html b/coverage-report/ccan/list/test/run-list_del_from-assert.c.gcov.html
new file mode 100644
index 0000000..a2b9178
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-list_del_from-assert.c.gcov.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-list_del_from-assert.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-list_del_from-assert.c<span style="font-size: 80%;"> (source / <a href="run-list_del_from-assert.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #define CCAN_LIST_DEBUG 1</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;ccan/list/list.c&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;sys/wait.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;signal.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> :<span class="lineCov"> 6 : int main(int argc, char *argv[])</span></a>
+<a name="11"><span class="lineNum"> 11 </span> : : {</a>
+<a name="12"><span class="lineNum"> 12 </span> : : struct list_head list1, list2;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : struct list_node n1, n2, n3;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : pid_t child;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : int status;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : (void)argc;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : (void)argv;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : plan_tests(1);</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 6 : list_head_init(&amp;list1);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 6 : list_head_init(&amp;list2);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 6 : list_add(&amp;list1, &amp;n1);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 6 : list_add(&amp;list2, &amp;n2);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 6 : list_add_tail(&amp;list2, &amp;n3);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 6 : child = fork();</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 6 : if (child) {</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 6 : wait(&amp;status);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : } else {</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : close(2); /* Close stderr so we don't print confusing assert */</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : /* This should abort. */</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : list_del_from(&amp;list1, &amp;n3);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : exit(0);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 6 : ok1(WIFSIGNALED(status) &amp;&amp; WTERMSIG(status) == SIGABRT);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 6 : list_del_from(&amp;list2, &amp;n3);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 6 : return exit_status();</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-single-eval.c.func-sort-c.html b/coverage-report/ccan/list/test/run-single-eval.c.func-sort-c.html
new file mode 100644
index 0000000..311c5ea
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-single-eval.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-single-eval.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-single-eval.c<span style="font-size: 80%;"> (<a href="run-single-eval.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-single-eval.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-single-eval.c.gcov.html#20">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-single-eval.c.func.html b/coverage-report/ccan/list/test/run-single-eval.c.func.html
new file mode 100644
index 0000000..ffafe34
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-single-eval.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-single-eval.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-single-eval.c<span style="font-size: 80%;"> (<a href="run-single-eval.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-single-eval.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-single-eval.c.gcov.html#20">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run-single-eval.c.gcov.html b/coverage-report/ccan/list/test/run-single-eval.c.gcov.html
new file mode 100644
index 0000000..4ad86af
--- /dev/null
+++ b/coverage-report/ccan/list/test/run-single-eval.c.gcov.html
@@ -0,0 +1,256 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run-single-eval.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run-single-eval.c<span style="font-size: 80%;"> (source / <a href="run-single-eval.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Make sure macros only evaluate their args once. */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;ccan/list/list.c&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : struct parent {</a>
+<a name="7"><span class="lineNum"> 7 </span> : : const char *name;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : struct list_head children;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : unsigned int num_children;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : int eval_count;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : };</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : struct child {</a>
+<a name="14"><span class="lineNum"> 14 </span> : : const char *name;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : struct list_node list;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : static LIST_HEAD(static_list);</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define ref(obj, counter) ((counter)++, (obj))</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 6 : int main(int argc, char *argv[])</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct parent parent;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct child c1, c2, c3, *c, *n;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : unsigned int i;</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 6 : unsigned int static_count = 0, parent_count = 0, list_count = 0,</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 6 : node_count = 0;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 6 : struct list_head list = LIST_HEAD_INIT(list);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : (void)argc;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : (void)argv;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : plan_tests(74);</a>
+<a name="35"><span class="lineNum"> 35 </span> : : /* Test LIST_HEAD, LIST_HEAD_INIT, list_empty and check_list */</a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 6 : ok1(list_empty(ref(&amp;static_list, static_count)));</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 6 : ok1(static_count == 1);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 6 : ok1(list_check(ref(&amp;static_list, static_count), NULL));</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 6 : ok1(static_count == 2);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 6 : ok1(list_empty(ref(&amp;list, list_count)));</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 6 : ok1(list_count == 1);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 6 : ok1(list_check(ref(&amp;list, list_count), NULL));</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 6 : ok1(list_count == 2);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 6 : parent.num_children = 0;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 6 : list_head_init(ref(&amp;parent.children, parent_count));</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 6 : ok1(parent_count == 1);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : /* Test list_head_init */</a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 6 : ok1(list_empty(ref(&amp;parent.children, parent_count)));</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 6 : ok1(parent_count == 2);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 6 : ok1(list_check(ref(&amp;parent.children, parent_count), NULL));</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 6 : ok1(parent_count == 3);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 6 : c2.name = &quot;c2&quot;;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 6 : list_add(ref(&amp;parent.children, parent_count), &amp;c2.list);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 6 : ok1(parent_count == 4);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : /* Test list_add and !list_empty. */</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 6 : ok1(!list_empty(ref(&amp;parent.children, parent_count)));</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 6 : ok1(parent_count == 5);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 6 : ok1(c2.list.next == &amp;parent.children.n);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 6 : ok1(c2.list.prev == &amp;parent.children.n);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 6 : ok1(parent.children.n.next == &amp;c2.list);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 6 : ok1(parent.children.n.prev == &amp;c2.list);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* Test list_check */</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 6 : ok1(list_check(ref(&amp;parent.children, parent_count), NULL));</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 6 : ok1(parent_count == 6);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 6 : c1.name = &quot;c1&quot;;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 6 : list_add(ref(&amp;parent.children, parent_count), &amp;c1.list);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 6 : ok1(parent_count == 7);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : /* Test list_add and !list_empty. */</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 6 : ok1(!list_empty(ref(&amp;parent.children, parent_count)));</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 6 : ok1(parent_count == 8);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 6 : ok1(c2.list.next == &amp;parent.children.n);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 6 : ok1(c2.list.prev == &amp;c1.list);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 6 : ok1(parent.children.n.next == &amp;c1.list);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 6 : ok1(parent.children.n.prev == &amp;c2.list);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 6 : ok1(c1.list.next == &amp;c2.list);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 6 : ok1(c1.list.prev == &amp;parent.children.n);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : /* Test list_check */</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 6 : ok1(list_check(ref(&amp;parent.children, parent_count), NULL));</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 6 : ok1(parent_count == 9);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 6 : c3.name = &quot;c3&quot;;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 6 : list_add_tail(ref(&amp;parent.children, parent_count), &amp;c3.list);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 6 : ok1(parent_count == 10);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : /* Test list_add_tail and !list_empty. */</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 6 : ok1(!list_empty(ref(&amp;parent.children, parent_count)));</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 6 : ok1(parent_count == 11);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 6 : ok1(parent.children.n.next == &amp;c1.list);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 6 : ok1(parent.children.n.prev == &amp;c3.list);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 6 : ok1(c1.list.next == &amp;c2.list);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 6 : ok1(c1.list.prev == &amp;parent.children.n);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 6 : ok1(c2.list.next == &amp;c3.list);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 6 : ok1(c2.list.prev == &amp;c1.list);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 6 : ok1(c3.list.next == &amp;parent.children.n);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 6 : ok1(c3.list.prev == &amp;c2.list);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : /* Test list_check */</a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 6 : ok1(list_check(ref(&amp;parent.children, parent_count), NULL));</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 6 : ok1(parent_count == 12);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /* Test list_check_node */</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 6 : ok1(list_check_node(&amp;c1.list, NULL));</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 6 : ok1(list_check_node(&amp;c2.list, NULL));</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 6 : ok1(list_check_node(&amp;c3.list, NULL));</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* Test list_top */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 6 : ok1(list_top(ref(&amp;parent.children, parent_count), struct child, list) == &amp;c1);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 6 : ok1(parent_count == 13);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> : : /* Test list_tail */</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 6 : ok1(list_tail(ref(&amp;parent.children, parent_count), struct child, list) == &amp;c3);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 6 : ok1(parent_count == 14);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> : : /* Test list_for_each. */</a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 6 : i = 0;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 18 : list_for_each(&amp;parent.children, c, list) {</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 18 : switch (i++) {</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 6 : case 0:</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 6 : ok1(c == &amp;c1);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 6 : case 1:</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 6 : ok1(c == &amp;c2);</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 6 : case 2:</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 6 : ok1(c == &amp;c3);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : }</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 18 : if (i &gt; 2)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : }</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 6 : ok1(i == 3);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : /* Test list_for_each_safe, list_del and list_del_from. */</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 6 : i = 0;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 18 : list_for_each_safe(&amp;parent.children, c, n, list) {</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 18 : switch (i++) {</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 6 : case 0:</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 6 : ok1(c == &amp;c1);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 6 : list_del(ref(&amp;c-&gt;list, node_count));</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 6 : ok1(node_count == 1);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 6 : case 1:</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 6 : ok1(c == &amp;c2);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 6 : list_del_from(ref(&amp;parent.children, parent_count),</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 6 : ref(&amp;c-&gt;list, node_count));</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 6 : ok1(node_count == 2);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 6 : case 2:</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 6 : ok1(c == &amp;c3);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 6 : list_del_from(ref(&amp;parent.children, parent_count),</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 6 : ref(&amp;c-&gt;list, node_count));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 6 : ok1(node_count == 3);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : }</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 18 : ok1(list_check(ref(&amp;parent.children, parent_count), NULL));</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 18 : if (i &gt; 2)</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : }</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 6 : ok1(i == 3);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 6 : ok1(parent_count == 19);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 6 : ok1(list_empty(ref(&amp;parent.children, parent_count)));</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 6 : ok1(parent_count == 20);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* Test list_top/list_tail on empty list. */</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 6 : ok1(list_top(ref(&amp;parent.children, parent_count), struct child, list) == NULL);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 6 : ok1(parent_count == 21);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 6 : ok1(list_tail(ref(&amp;parent.children, parent_count), struct child, list) == NULL);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 6 : ok1(parent_count == 22);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 6 : return exit_status();</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run.c.func-sort-c.html b/coverage-report/ccan/list/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..fbea70b
--- /dev/null
+++ b/coverage-report/ccan/list/test/run.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">133</td>
+ <td class="headerCovTableEntry">133</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#18">main</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run.c.func.html b/coverage-report/ccan/list/test/run.c.func.html
new file mode 100644
index 0000000..5e2d756
--- /dev/null
+++ b/coverage-report/ccan/list/test/run.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">133</td>
+ <td class="headerCovTableEntry">133</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#18">main</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/list/test/run.c.gcov.html b/coverage-report/ccan/list/test/run.c.gcov.html
new file mode 100644
index 0000000..584d03e
--- /dev/null
+++ b/coverage-report/ccan/list/test/run.c.gcov.html
@@ -0,0 +1,289 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/list/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/list/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">133</td>
+ <td class="headerCovTableEntry">133</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/list/test/helper.c&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;ccan/list/list.c&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;helper.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : struct parent {</a>
+<a name="8"><span class="lineNum"> 8 </span> : : const char *name;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : struct list_head children;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : unsigned int num_children;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : };</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : struct child {</a>
+<a name="14"><span class="lineNum"> 14 </span> : : const char *name;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : struct list_node list;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : static LIST_HEAD(static_list);</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 12 : int main(int argc, char *argv[])</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct parent parent;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : struct child c1, c2, c3, *c, *n;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : unsigned int i;</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 12 : struct list_head list = LIST_HEAD_INIT(list);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : opaque_t *q, *nq;</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 12 : struct list_head opaque_list = LIST_HEAD_INIT(opaque_list);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : (void)argc;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : (void)argv;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : plan_tests(65);</a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* Test LIST_HEAD, LIST_HEAD_INIT, list_empty and check_list */</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 12 : ok1(list_empty(&amp;static_list));</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 12 : ok1(list_check(&amp;static_list, NULL));</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 12 : ok1(list_empty(&amp;list));</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 12 : ok1(list_check(&amp;list, NULL));</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 12 : parent.num_children = 0;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 12 : list_head_init(&amp;parent.children);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : /* Test list_head_init */</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 12 : ok1(list_empty(&amp;parent.children));</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 12 : ok1(list_check(&amp;parent.children, NULL));</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 12 : c2.name = &quot;c2&quot;;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 12 : list_add(&amp;parent.children, &amp;c2.list);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* Test list_add and !list_empty. */</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 12 : ok1(!list_empty(&amp;parent.children));</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 12 : ok1(c2.list.next == &amp;parent.children.n);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 12 : ok1(c2.list.prev == &amp;parent.children.n);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 12 : ok1(parent.children.n.next == &amp;c2.list);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 12 : ok1(parent.children.n.prev == &amp;c2.list);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : /* Test list_check */</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 12 : ok1(list_check(&amp;parent.children, NULL));</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 12 : c1.name = &quot;c1&quot;;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 12 : list_add(&amp;parent.children, &amp;c1.list);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : /* Test list_add and !list_empty. */</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 12 : ok1(!list_empty(&amp;parent.children));</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 12 : ok1(c2.list.next == &amp;parent.children.n);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 12 : ok1(c2.list.prev == &amp;c1.list);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 12 : ok1(parent.children.n.next == &amp;c1.list);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 12 : ok1(parent.children.n.prev == &amp;c2.list);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 12 : ok1(c1.list.next == &amp;c2.list);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 12 : ok1(c1.list.prev == &amp;parent.children.n);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : /* Test list_check */</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 12 : ok1(list_check(&amp;parent.children, NULL));</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 12 : c3.name = &quot;c3&quot;;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 12 : list_add_tail(&amp;parent.children, &amp;c3.list);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : /* Test list_add_tail and !list_empty. */</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 12 : ok1(!list_empty(&amp;parent.children));</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 12 : ok1(parent.children.n.next == &amp;c1.list);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 12 : ok1(parent.children.n.prev == &amp;c3.list);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 12 : ok1(c1.list.next == &amp;c2.list);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 12 : ok1(c1.list.prev == &amp;parent.children.n);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 12 : ok1(c2.list.next == &amp;c3.list);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 12 : ok1(c2.list.prev == &amp;c1.list);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 12 : ok1(c3.list.next == &amp;parent.children.n);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 12 : ok1(c3.list.prev == &amp;c2.list);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : /* Test list_check */</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 12 : ok1(list_check(&amp;parent.children, NULL));</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : /* Test list_check_node */</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 12 : ok1(list_check_node(&amp;c1.list, NULL));</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 12 : ok1(list_check_node(&amp;c2.list, NULL));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 12 : ok1(list_check_node(&amp;c3.list, NULL));</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* Test list_top */</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 12 : ok1(list_top(&amp;parent.children, struct child, list) == &amp;c1);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : /* Test list_tail */</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 12 : ok1(list_tail(&amp;parent.children, struct child, list) == &amp;c3);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : /* Test list_for_each. */</a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 12 : i = 0;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 36 : list_for_each(&amp;parent.children, c, list) {</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 36 : switch (i++) {</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 12 : case 0:</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c1);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 12 : case 1:</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c2);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 12 : case 2:</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c3);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : }</a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 36 : if (i &gt; 2)</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 12 : ok1(i == 3);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* Test list_for_each_rev. */</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 12 : i = 0;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 36 : list_for_each_rev(&amp;parent.children, c, list) {</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 36 : switch (i++) {</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 12 : case 0:</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c3);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 12 : case 1:</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c2);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 12 : case 2:</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c1);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : }</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 36 : if (i &gt; 2)</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : }</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 12 : ok1(i == 3);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> : : /* Test list_for_each_safe, list_del and list_del_from. */</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 12 : i = 0;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 36 : list_for_each_safe(&amp;parent.children, c, n, list) {</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 36 : switch (i++) {</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 12 : case 0:</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c1); </span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 12 : list_del(&amp;c-&gt;list);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 12 : case 1:</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c2);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 12 : list_del_from(&amp;parent.children, &amp;c-&gt;list);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 12 : case 2:</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c3);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 12 : list_del_from(&amp;parent.children, &amp;c-&gt;list);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : }</a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 36 : ok1(list_check(&amp;parent.children, NULL));</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 36 : if (i &gt; 2)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : }</a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 12 : ok1(i == 3);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 12 : ok1(list_empty(&amp;parent.children));</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* Test list_for_each_off. */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 12 : list_add_tail(&amp;opaque_list,</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 12 : (struct list_node *)create_opaque_blob());</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 12 : list_add_tail(&amp;opaque_list,</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 12 : (struct list_node *)create_opaque_blob());</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 12 : list_add_tail(&amp;opaque_list,</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 12 : (struct list_node *)create_opaque_blob());</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 12 : i = 0;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : </a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 48 : list_for_each_off(&amp;opaque_list, q, 0) {</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 36 : i++;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 36 : ok1(if_blobs_know_the_secret(q));</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 12 : ok1(i == 3);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> : : /* Test list_for_each_safe_off, list_del_off and list_del_from_off. */</a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 12 : i = 0;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 36 : list_for_each_safe_off(&amp;opaque_list, q, nq, 0) {</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 36 : switch (i++) {</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 12 : case 0:</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 12 : ok1(if_blobs_know_the_secret(q));</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 12 : list_del_off(q, 0);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 12 : destroy_opaque_blob(q);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 12 : case 1:</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 12 : ok1(if_blobs_know_the_secret(q));</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 12 : list_del_from_off(&amp;opaque_list, q, 0);</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 12 : destroy_opaque_blob(q);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 12 : case 2:</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 12 : ok1(c == &amp;c3);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 12 : list_del_from_off(&amp;opaque_list, q, 0);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 12 : destroy_opaque_blob(q);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : }</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 36 : ok1(list_check(&amp;opaque_list, NULL));</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 36 : if (i &gt; 2)</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : }</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 12 : ok1(i == 3);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 12 : ok1(list_empty(&amp;opaque_list));</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> : : /* Test list_top/list_tail on empty list. */</a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 12 : ok1(list_top(&amp;parent.children, struct child, list) == NULL);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 12 : ok1(list_tail(&amp;parent.children, struct child, list) == NULL);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 12 : return exit_status();</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/index-sort-b.html b/coverage-report/ccan/short_types/test/index-sort-b.html
new file mode 100644
index 0000000..f39368e
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/short_types/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-endian.c.gcov.html">run-endian.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/index-sort-f.html b/coverage-report/ccan/short_types/test/index-sort-f.html
new file mode 100644
index 0000000..aad13a6
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/short_types/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-endian.c.gcov.html">run-endian.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/index-sort-l.html b/coverage-report/ccan/short_types/test/index-sort-l.html
new file mode 100644
index 0000000..075d174
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/short_types/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-endian.c.gcov.html">run-endian.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/index.html b/coverage-report/ccan/short_types/test/index.html
new file mode 100644
index 0000000..aa707d1
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/short_types/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-endian.c.gcov.html">run-endian.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/run-endian.c.func-sort-c.html b/coverage-report/ccan/short_types/test/run-endian.c.func-sort-c.html
new file mode 100644
index 0000000..e08981b
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/run-endian.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test/run-endian.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/short_types/test</a> - run-endian.c<span style="font-size: 80%;"> (<a href="run-endian.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-endian.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-endian.c.gcov.html#5">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/run-endian.c.func.html b/coverage-report/ccan/short_types/test/run-endian.c.func.html
new file mode 100644
index 0000000..a1eb6a0
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/run-endian.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test/run-endian.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/short_types/test</a> - run-endian.c<span style="font-size: 80%;"> (<a href="run-endian.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-endian.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-endian.c.gcov.html#5">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/run-endian.c.gcov.html b/coverage-report/ccan/short_types/test/run-endian.c.gcov.html
new file mode 100644
index 0000000..93dd7eb
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/run-endian.c.gcov.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test/run-endian.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/short_types/test</a> - run-endian.c<span style="font-size: 80%;"> (source / <a href="run-endian.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/short_types/short_types.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;err.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> :<span class="lineCov"> 3 : int __attribute__((const)) main(void)</span></a>
+<a name="8"><span class="lineNum"> 8 </span> : : {</a>
+<a name="9"><span class="lineNum"> 9 </span> : : plan_tests(6);</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : ok1(sizeof(be64) == 8);</a>
+<a name="12"><span class="lineNum"> 12 </span> : : ok1(sizeof(be32) == 4);</a>
+<a name="13"><span class="lineNum"> 13 </span> : : ok1(sizeof(be16) == 2);</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : ok1(sizeof(le64) == 8);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : ok1(sizeof(le32) == 4);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : ok1(sizeof(le16) == 2);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 3 : return exit_status();</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/run.c.func-sort-c.html b/coverage-report/ccan/short_types/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..47b24e3
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/run.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/short_types/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#4">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/run.c.func.html b/coverage-report/ccan/short_types/test/run.c.func.html
new file mode 100644
index 0000000..fb5deac
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/run.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/short_types/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#4">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/short_types/test/run.c.gcov.html b/coverage-report/ccan/short_types/test/run.c.gcov.html
new file mode 100644
index 0000000..00903fd
--- /dev/null
+++ b/coverage-report/ccan/short_types/test/run.c.gcov.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/short_types/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/short_types/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/short_types/short_types.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;err.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineCov"> 3 : int __attribute__((const)) main(void)</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : {</a>
+<a name="8"><span class="lineNum"> 8 </span> : : plan_tests(16);</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : ok1(sizeof(u64) == 8);</a>
+<a name="11"><span class="lineNum"> 11 </span> : : ok1(sizeof(s64) == 8);</a>
+<a name="12"><span class="lineNum"> 12 </span> : : ok1(sizeof(u32) == 4);</a>
+<a name="13"><span class="lineNum"> 13 </span> : : ok1(sizeof(s32) == 4);</a>
+<a name="14"><span class="lineNum"> 14 </span> : : ok1(sizeof(u16) == 2);</a>
+<a name="15"><span class="lineNum"> 15 </span> : : ok1(sizeof(s16) == 2);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : ok1(sizeof(u8) == 1);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : ok1(sizeof(s8) == 1);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : /* Signedness tests. */</a>
+<a name="20"><span class="lineNum"> 20 </span> : : ok1((u64)-1 &gt; 0);</a>
+<a name="21"><span class="lineNum"> 21 </span> : : ok1((u32)-1 &gt; 0);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : ok1((u16)-1 &gt; 0);</a>
+<a name="23"><span class="lineNum"> 23 </span> : : ok1((u8)-1 &gt; 0);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : ok1((s64)-1 &lt; 0);</a>
+<a name="25"><span class="lineNum"> 25 </span> : : ok1((s32)-1 &lt; 0);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : ok1((s16)-1 &lt; 0);</a>
+<a name="27"><span class="lineNum"> 27 </span> : : ok1((s8)-1 &lt; 0);</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 3 : return exit_status();</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/index-sort-b.html b/coverage-report/ccan/str/index-sort-b.html
new file mode 100644
index 0000000..7b10b8a
--- /dev/null
+++ b/coverage-report/ccan/str/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/str</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.c.gcov.html">str.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.h.gcov.html">str.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/index-sort-f.html b/coverage-report/ccan/str/index-sort-f.html
new file mode 100644
index 0000000..95112cc
--- /dev/null
+++ b/coverage-report/ccan/str/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/str</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.c.gcov.html">str.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.h.gcov.html">str.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/index-sort-l.html b/coverage-report/ccan/str/index-sort-l.html
new file mode 100644
index 0000000..84cc534
--- /dev/null
+++ b/coverage-report/ccan/str/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/str</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.h.gcov.html">str.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.c.gcov.html">str.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/index.html b/coverage-report/ccan/str/index.html
new file mode 100644
index 0000000..330d637
--- /dev/null
+++ b/coverage-report/ccan/str/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - ccan/str</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.c.gcov.html">str.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="str.h.gcov.html">str.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/str.c.func-sort-c.html b/coverage-report/ccan/str/str.c.func-sort-c.html
new file mode 100644
index 0000000..288bec0
--- /dev/null
+++ b/coverage-report/ccan/str/str.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/str.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/str</a> - str.c<span style="font-size: 80%;"> (<a href="str.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="str.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="str.c.gcov.html#2">strcount</a></td>
+ <td class="coverFnHi">149</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/str.c.func.html b/coverage-report/ccan/str/str.c.func.html
new file mode 100644
index 0000000..17c43a3
--- /dev/null
+++ b/coverage-report/ccan/str/str.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/str.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/str</a> - str.c<span style="font-size: 80%;"> (<a href="str.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="str.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="str.c.gcov.html#2">strcount</a></td>
+ <td class="coverFnHi">149</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/str.c.gcov.html b/coverage-report/ccan/str/str.c.gcov.html
new file mode 100644
index 0000000..8760c77
--- /dev/null
+++ b/coverage-report/ccan/str/str.c.gcov.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/str.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/str</a> - str.c<span style="font-size: 80%;"> (source / <a href="str.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* CC0 (Public domain) - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> :<span class="lineCov"> 149 : size_t strcount(const char *haystack, const char *needle)</span></a>
+<a name="5"><span class="lineNum"> 5 </span> : : {</a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineCov"> 149 : size_t i = 0, nlen = strlen(needle);</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> :<span class="lineCov"> 236 : while ((haystack = strstr(haystack, needle)) != NULL) {</span></a>
+<a name="9"><span class="lineNum"> 9 </span> :<span class="lineCov"> 87 : i++;</span></a>
+<a name="10"><span class="lineNum"> 10 </span> :<span class="lineCov"> 87 : haystack += nlen;</span></a>
+<a name="11"><span class="lineNum"> 11 </span> : : }</a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 149 : return i;</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/str.h.func-sort-c.html b/coverage-report/ccan/str/str.h.func-sort-c.html
new file mode 100644
index 0000000..a7168ca
--- /dev/null
+++ b/coverage-report/ccan/str/str.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/str.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/str</a> - str.h<span style="font-size: 80%;"> (<a href="str.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="str.h.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="str.h.gcov.html#41">strends</a></td>
+ <td class="coverFnHi">14406</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/str.h.func.html b/coverage-report/ccan/str/str.h.func.html
new file mode 100644
index 0000000..a5f92e8
--- /dev/null
+++ b/coverage-report/ccan/str/str.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/str.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/str</a> - str.h<span style="font-size: 80%;"> (<a href="str.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="str.h.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="str.h.gcov.html#41">strends</a></td>
+ <td class="coverFnHi">14406</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/str.h.gcov.html b/coverage-report/ccan/str/str.h.gcov.html
new file mode 100644
index 0000000..1e4e4c0
--- /dev/null
+++ b/coverage-report/ccan/str/str.h.gcov.html
@@ -0,0 +1,205 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/str.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">ccan/str</a> - str.h<span style="font-size: 80%;"> (source / <a href="str.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* CC0 (Public domain) - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #ifndef CCAN_STR_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #define CCAN_STR_H</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;config.h&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;string.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;limits.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : /**</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * streq - Are two strings equal?</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * @a: first string</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * @b: first string</a>
+<a name="14"><span class="lineNum"> 14 </span> : : *</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * This macro is arguably more readable than &quot;!strcmp(a, b)&quot;.</a>
+<a name="16"><span class="lineNum"> 16 </span> : : *</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * Example:</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * if (streq(somestring, &quot;&quot;))</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * printf(&quot;String is empty!\n&quot;);</a>
+<a name="20"><span class="lineNum"> 20 </span> : : */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define streq(a,b) (strcmp((a),(b)) == 0)</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : /**</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * strstarts - Does this string start with this prefix?</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * @str: string to test</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * @prefix: prefix to look for at start of str</a>
+<a name="27"><span class="lineNum"> 27 </span> : : *</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Example:</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * if (strstarts(somestring, &quot;foo&quot;))</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * printf(&quot;String %s begins with 'foo'!\n&quot;, somestring);</a>
+<a name="31"><span class="lineNum"> 31 </span> : : */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #define strstarts(str,prefix) (strncmp((str),(prefix),strlen(prefix)) == 0)</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : /**</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * strends - Does this string end with this postfix?</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * @str: string to test</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * @postfix: postfix to look for at end of str</a>
+<a name="38"><span class="lineNum"> 38 </span> : : *</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * Example:</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * if (strends(somestring, &quot;foo&quot;))</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * printf(&quot;String %s end with 'foo'!\n&quot;, somestring);</a>
+<a name="42"><span class="lineNum"> 42 </span> : : */</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 14406 : static inline bool strends(const char *str, const char *postfix)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 14406 : if (strlen(str) &lt; strlen(postfix))</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 5520 : return false;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 8886 : return streq(str + strlen(str) - strlen(postfix), postfix);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : }</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> : : /**</a>
+<a name="52"><span class="lineNum"> 52 </span> : : * stringify - Turn expression into a string literal</a>
+<a name="53"><span class="lineNum"> 53 </span> : : * @expr: any C expression</a>
+<a name="54"><span class="lineNum"> 54 </span> : : *</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * Example:</a>
+<a name="56"><span class="lineNum"> 56 </span> : : * #define PRINT_COND_IF_FALSE(cond) \</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * ((cond) || printf(&quot;%s is false!&quot;, stringify(cond)))</a>
+<a name="58"><span class="lineNum"> 58 </span> : : */</a>
+<a name="59"><span class="lineNum"> 59 </span> : : #define stringify(expr) stringify_1(expr)</a>
+<a name="60"><span class="lineNum"> 60 </span> : : /* Double-indirection required to stringify expansions */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define stringify_1(expr) #expr</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : /**</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * strcount - Count number of (non-overlapping) occurrences of a substring.</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * @haystack: a C string</a>
+<a name="66"><span class="lineNum"> 66 </span> : : * @needle: a substring</a>
+<a name="67"><span class="lineNum"> 67 </span> : : *</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * Example:</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * assert(strcount(&quot;aaa aaa&quot;, &quot;a&quot;) == 6);</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * assert(strcount(&quot;aaa aaa&quot;, &quot;ab&quot;) == 0);</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * assert(strcount(&quot;aaa aaa&quot;, &quot;aa&quot;) == 2);</a>
+<a name="72"><span class="lineNum"> 72 </span> : : */</a>
+<a name="73"><span class="lineNum"> 73 </span> : : size_t strcount(const char *haystack, const char *needle);</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /**</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * STR_MAX_CHARS - Maximum possible size of numeric string for this type.</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * @type_or_expr: a pointer or integer type or expression.</a>
+<a name="78"><span class="lineNum"> 78 </span> : : *</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * This provides enough space for a nul-terminated string which represents the</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * largest possible value for the type or expression.</a>
+<a name="81"><span class="lineNum"> 81 </span> : : *</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * Note: The implementation adds extra space so hex values or negative</a>
+<a name="83"><span class="lineNum"> 83 </span> : : * values will fit (eg. sprintf(... &quot;%p&quot;). )</a>
+<a name="84"><span class="lineNum"> 84 </span> : : *</a>
+<a name="85"><span class="lineNum"> 85 </span> : : * Example:</a>
+<a name="86"><span class="lineNum"> 86 </span> : : * char str[STR_MAX_CHARS(int)];</a>
+<a name="87"><span class="lineNum"> 87 </span> : : *</a>
+<a name="88"><span class="lineNum"> 88 </span> : : * sprintf(str, &quot;%i&quot;, 7);</a>
+<a name="89"><span class="lineNum"> 89 </span> : : */</a>
+<a name="90"><span class="lineNum"> 90 </span> : : #define STR_MAX_CHARS(type_or_expr) \</a>
+<a name="91"><span class="lineNum"> 91 </span> : : ((sizeof(type_or_expr) * CHAR_BIT + 8) / 9 * 3 + 2 \</a>
+<a name="92"><span class="lineNum"> 92 </span> : : + STR_MAX_CHARS_TCHECK_(type_or_expr))</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : #if HAVE_TYPEOF</a>
+<a name="95"><span class="lineNum"> 95 </span> : : /* Only a simple type can have 0 assigned, so test that. */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : #define STR_MAX_CHARS_TCHECK_(type_or_expr) \</a>
+<a name="97"><span class="lineNum"> 97 </span> : : ({ typeof(type_or_expr) x = 0; (void)x; 0; })</a>
+<a name="98"><span class="lineNum"> 98 </span> : : #else</a>
+<a name="99"><span class="lineNum"> 99 </span> : : #define STR_MAX_CHARS_TCHECK_(type_or_expr) 0</a>
+<a name="100"><span class="lineNum"> 100 </span> : : #endif</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /* These checks force things out of line, hence they are under DEBUG. */</a>
+<a name="103"><span class="lineNum"> 103 </span> : : #ifdef CCAN_STR_DEBUG</a>
+<a name="104"><span class="lineNum"> 104 </span> : : #if HAVE_TYPEOF</a>
+<a name="105"><span class="lineNum"> 105 </span> : : /* With GNU magic, we can make const-respecting standard string functions. */</a>
+<a name="106"><span class="lineNum"> 106 </span> : : #undef strstr</a>
+<a name="107"><span class="lineNum"> 107 </span> : : #undef strchr</a>
+<a name="108"><span class="lineNum"> 108 </span> : : #undef strrchr</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* + 0 is needed to decay array into pointer. */</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #define strstr(haystack, needle) \</a>
+<a name="112"><span class="lineNum"> 112 </span> : : ((typeof((haystack) + 0))str_strstr((haystack), (needle)))</a>
+<a name="113"><span class="lineNum"> 113 </span> : : #define strchr(haystack, c) \</a>
+<a name="114"><span class="lineNum"> 114 </span> : : ((typeof((haystack) + 0))str_strchr((haystack), (c)))</a>
+<a name="115"><span class="lineNum"> 115 </span> : : #define strrchr(haystack, c) \</a>
+<a name="116"><span class="lineNum"> 116 </span> : : ((typeof((haystack) + 0))str_strrchr((haystack), (c)))</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #endif</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #endif /* CCAN_STR_DEBUG */</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : #endif /* CCAN_STR_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/index-sort-b.html b/coverage-report/ccan/str/test/index-sort-b.html
new file mode 100644
index 0000000..509e9fc
--- /dev/null
+++ b/coverage-report/ccan/str/test/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/str/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-STR_MAX_CHARS.c.gcov.html">run-STR_MAX_CHARS.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/index-sort-f.html b/coverage-report/ccan/str/test/index-sort-f.html
new file mode 100644
index 0000000..5ca76c9
--- /dev/null
+++ b/coverage-report/ccan/str/test/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/str/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-STR_MAX_CHARS.c.gcov.html">run-STR_MAX_CHARS.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/index-sort-l.html b/coverage-report/ccan/str/test/index-sort-l.html
new file mode 100644
index 0000000..85c8838
--- /dev/null
+++ b/coverage-report/ccan/str/test/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/str/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-STR_MAX_CHARS.c.gcov.html">run-STR_MAX_CHARS.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/index.html b/coverage-report/ccan/str/test/index.html
new file mode 100644
index 0000000..ab71e91
--- /dev/null
+++ b/coverage-report/ccan/str/test/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - ccan/str/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-STR_MAX_CHARS.c.gcov.html">run-STR_MAX_CHARS.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run.c.gcov.html">run.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func-sort-c.html b/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func-sort-c.html
new file mode 100644
index 0000000..72fc602
--- /dev/null
+++ b/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test/run-STR_MAX_CHARS.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/str/test</a> - run-STR_MAX_CHARS.c<span style="font-size: 80%;"> (<a href="run-STR_MAX_CHARS.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-STR_MAX_CHARS.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-STR_MAX_CHARS.c.gcov.html#5">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func.html b/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func.html
new file mode 100644
index 0000000..ff4879f
--- /dev/null
+++ b/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test/run-STR_MAX_CHARS.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/str/test</a> - run-STR_MAX_CHARS.c<span style="font-size: 80%;"> (<a href="run-STR_MAX_CHARS.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-STR_MAX_CHARS.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-STR_MAX_CHARS.c.gcov.html#5">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.gcov.html b/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.gcov.html
new file mode 100644
index 0000000..9ca283c
--- /dev/null
+++ b/coverage-report/ccan/str/test/run-STR_MAX_CHARS.c.gcov.html
@@ -0,0 +1,151 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test/run-STR_MAX_CHARS.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/str/test</a> - run-STR_MAX_CHARS.c<span style="font-size: 80%;"> (source / <a href="run-STR_MAX_CHARS.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> :<span class="lineCov"> 3 : int main(int argc, char *argv[])</span></a>
+<a name="8"><span class="lineNum"> 8 </span> : : {</a>
+<a name="9"><span class="lineNum"> 9 </span> :<span class="lineCov"> 3 : char *str = (char*)malloc(sizeof(char)*1000);</span></a>
+<a name="10"><span class="lineNum"> 10 </span> : : struct {</a>
+<a name="11"><span class="lineNum"> 11 </span> : : uint8_t u1byte;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : int8_t s1byte;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : uint16_t u2byte;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : int16_t s2byte;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : uint32_t u4byte;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : int32_t s4byte;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : uint64_t u8byte;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : int64_t s8byte;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : void *ptr;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : } types;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : (void)argc;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : (void)argv;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 3 : assert(str);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : plan_tests(13);</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 3 : memset(&amp;types, 0xFF, sizeof(types));</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* Hex versions */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;0x%llx&quot;, (unsigned long long)types.u1byte);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u1byte));</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;0x%llx&quot;, (unsigned long long)types.u2byte);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u2byte));</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;0x%llx&quot;, (unsigned long long)types.u4byte);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u4byte));</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;0x%llx&quot;, (unsigned long long)types.u8byte);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u8byte));</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : /* Decimal versions */</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%u&quot;, types.u1byte);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u1byte));</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%d&quot;, types.s1byte);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.s1byte));</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%u&quot;, types.u2byte);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u2byte));</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%d&quot;, types.s2byte);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.s2byte));</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%u&quot;, types.u4byte);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u4byte));</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%d&quot;, types.s4byte);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.s4byte));</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%llu&quot;, (unsigned long long)types.u8byte);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.u8byte));</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%lld&quot;, (long long)types.s8byte);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.s8byte));</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> : : /* Pointer version. */</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 3 : sprintf(str, &quot;%p&quot;, types.ptr);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 3 : ok1(strlen(str) &lt; STR_MAX_CHARS(types.ptr));</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 3 : free(str);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 3 : return exit_status();</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : } </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/run.c.func-sort-c.html b/coverage-report/ccan/str/test/run.c.func-sort-c.html
new file mode 100644
index 0000000..3fdc959
--- /dev/null
+++ b/coverage-report/ccan/str/test/run.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/str/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#22">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#12">strdup_rev</a></td>
+ <td class="coverFnHi">14406</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/run.c.func.html b/coverage-report/ccan/str/test/run.c.func.html
new file mode 100644
index 0000000..8dbe5b9
--- /dev/null
+++ b/coverage-report/ccan/str/test/run.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test/run.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/str/test</a> - run.c<span style="font-size: 80%;"> (<a href="run.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#22">main</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run.c.gcov.html#12">strdup_rev</a></td>
+ <td class="coverFnHi">14406</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ccan/str/test/run.c.gcov.html b/coverage-report/ccan/str/test/run.c.gcov.html
new file mode 100644
index 0000000..6082d7b
--- /dev/null
+++ b/coverage-report/ccan/str/test/run.c.gcov.html
@@ -0,0 +1,194 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - ccan/str/test/run.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">ccan/str/test</a> - run.c<span style="font-size: 80%;"> (source / <a href="run.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;ccan/str/str.c&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;ccan/tap/tap.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : static const char *substrings[] = { &quot;far&quot;, &quot;bar&quot;, &quot;baz&quot;, &quot;b&quot;, &quot;ba&quot;, &quot;z&quot;, &quot;ar&quot;,</a>
+<a name="10"><span class="lineNum"> 10 </span> : : NULL };</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define NUM_SUBSTRINGS (ARRAY_SIZE(substrings) - 1)</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 14406 : static char *strdup_rev(const char *s)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 14406 : char *ret = strdup(s);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : unsigned int i;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 76146 : for (i = 0; i &lt; strlen(s); i++)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 61740 : ret[i] = s[strlen(s) - i - 1];</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 14406 : return ret;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 3 : int main(int argc, char *argv[])</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : unsigned int i, j, n;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : char *strings[NUM_SUBSTRINGS * NUM_SUBSTRINGS];</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : (void)argc;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : (void)argv;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 3 : n = 0;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 24 : for (i = 0; i &lt; NUM_SUBSTRINGS; i++) {</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 168 : for (j = 0; j &lt; NUM_SUBSTRINGS; j++) {</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 147 : strings[n] = malloc(strlen(substrings[i])</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 147 : + strlen(substrings[j]) + 1);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 147 : sprintf(strings[n++], &quot;%s%s&quot;,</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : substrings[i], substrings[j]);</a>
+<a name="39"><span class="lineNum"> 39 </span> : : }</a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : plan_tests(n * n * 5 + 16);</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 150 : for (i = 0; i &lt; n; i++) {</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 7350 : for (j = 0; j &lt; n; j++) {</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 7203 : unsigned int k, identical = 0;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : char *reva, *revb;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : /* Find first difference. */</a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 12957 : for (k = 0; strings[i][k]==strings[j][k]; k++) {</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 5901 : if (k == strlen(strings[i])) {</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 147 : identical = 1;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 147 : break;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 7203 : if (identical) </span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 147 : ok1(streq(strings[i], strings[j]));</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : else</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 7056 : ok1(!streq(strings[i], strings[j]));</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /* Postfix test should be equivalent to prefix</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * test on reversed string. */</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 7203 : reva = strdup_rev(strings[i]);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 7203 : revb = strdup_rev(strings[j]);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 7203 : if (!strings[i][k]) {</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 294 : ok1(strstarts(strings[j], strings[i]));</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 294 : ok1(strends(revb, reva));</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : } else {</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 6909 : ok1(!strstarts(strings[j], strings[i]));</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 6909 : ok1(!strends(revb, reva));</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : }</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 7203 : if (!strings[j][k]) {</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 294 : ok1(strstarts(strings[i], strings[j]));</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 294 : ok1(strends(reva, revb));</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : } else {</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 6909 : ok1(!strstarts(strings[i], strings[j]));</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 6909 : ok1(!strends(reva, revb));</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 7203 : free(reva);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 7203 : free(revb);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 150 : for (i = 0; i &lt; n; i++)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 147 : free(strings[i]);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : ok1(streq(stringify(NUM_SUBSTRINGS),</a>
+<a name="89"><span class="lineNum"> 89 </span> : : &quot;((sizeof(substrings) / sizeof(substrings[0])) - 1)&quot;));</a>
+<a name="90"><span class="lineNum"> 90 </span> : : ok1(streq(stringify(ARRAY_SIZE(substrings)),</a>
+<a name="91"><span class="lineNum"> 91 </span> : : &quot;(sizeof(substrings) / sizeof(substrings[0]))&quot;));</a>
+<a name="92"><span class="lineNum"> 92 </span> : : ok1(streq(stringify(i == 0), &quot;i == 0&quot;));</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaaaaa&quot;, &quot;b&quot;) == 0);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaaaaa&quot;, &quot;a&quot;) == 6);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaaaaa&quot;, &quot;aa&quot;) == 3);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaaaaa&quot;, &quot;aaa&quot;) == 2);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaaaaa&quot;, &quot;aaaa&quot;) == 1);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaaaaa&quot;, &quot;aaaaa&quot;) == 1);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaaaaa&quot;, &quot;aaaaaa&quot;) == 1);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaa aaa&quot;, &quot;b&quot;) == 0);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaa aaa&quot;, &quot;a&quot;) == 6);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaa aaa&quot;, &quot;aa&quot;) == 2);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaa aaa&quot;, &quot;aaa&quot;) == 2);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaa aaa&quot;, &quot;aaaa&quot;) == 0);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 3 : ok1(strcount(&quot;aaa aaa&quot;, &quot;aaaaa&quot;) == 0);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 3 : return exit_status();</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : } </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/bitmap.c.func-sort-c.html b/coverage-report/core/bitmap.c.func-sort-c.html
new file mode 100644
index 0000000..162fd75
--- /dev/null
+++ b/coverage-report/core/bitmap.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/bitmap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - bitmap.c<span style="font-size: 80%;"> (<a href="bitmap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="bitmap.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.c.gcov.html#38">bitmap_find_one_bit</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.c.gcov.html#33">bitmap_find_zero_bit</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.c.gcov.html#4">__bitmap_find_bit</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/bitmap.c.func.html b/coverage-report/core/bitmap.c.func.html
new file mode 100644
index 0000000..2b1a265
--- /dev/null
+++ b/coverage-report/core/bitmap.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/bitmap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - bitmap.c<span style="font-size: 80%;"> (<a href="bitmap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="bitmap.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.c.gcov.html#4">__bitmap_find_bit</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.c.gcov.html#38">bitmap_find_one_bit</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.c.gcov.html#33">bitmap_find_zero_bit</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/bitmap.c.gcov.html b/coverage-report/core/bitmap.c.gcov.html
new file mode 100644
index 0000000..4ca0ffb
--- /dev/null
+++ b/coverage-report/core/bitmap.c.gcov.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/bitmap.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - bitmap.c<span style="font-size: 80%;"> (source / <a href="bitmap.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2016 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;bitmap.h&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineCov"> 19 : static int __bitmap_find_bit(bitmap_t map, unsigned int start, unsigned int count,</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : bool value)</a>
+<a name="8"><span class="lineNum"> 8 </span> : : {</a>
+<a name="9"><span class="lineNum"> 9 </span> : : unsigned int el, first_bit;</a>
+<a name="10"><span class="lineNum"> 10 </span> :<span class="lineCov"> 19 : unsigned int end = start + count;</span></a>
+<a name="11"><span class="lineNum"> 11 </span> : : bitmap_elem_t e, ev;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : int b;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 19 : ev = value ? -1ul : 0;</span></a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 19 : el = BITMAP_ELEM(start);</span></a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 19 : first_bit = BITMAP_BIT(start);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 21 : while (start &lt; end) {</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 19 : e = map[el] ^ ev;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 19 : e |= ((1ul &lt;&lt; first_bit) - 1);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 19 : if (~e)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 17 : break;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 2 : start = (start + BITMAP_ELSZ) &amp; ~(BITMAP_ELSZ - 1);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 2 : first_bit = 0;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 2 : el++;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 214 : for (b = first_bit; b &lt; BITMAP_ELSZ &amp;&amp; start &lt; end; b++,start++) {</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 212 : if ((e &amp; (1ull &lt;&lt; b)) == 0)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 17 : return start;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 2 : return -1;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 17 : int bitmap_find_zero_bit(bitmap_t map, unsigned int start, unsigned int count)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : {</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 17 : return __bitmap_find_bit(map, start, count, false);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 2 : int bitmap_find_one_bit(bitmap_t map, unsigned int start, unsigned int count)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 2 : return __bitmap_find_bit(map, start, count, true);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/buddy.c.func-sort-c.html b/coverage-report/core/buddy.c.func-sort-c.html
new file mode 100644
index 0000000..6c2e8a9
--- /dev/null
+++ b/coverage-report/core/buddy.c.func-sort-c.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/buddy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - buddy.c<span style="font-size: 80%;"> (<a href="buddy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntry">96</td>
+ <td class="headerCovTableEntryHi">99.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="buddy.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#265">buddy_create</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#286">buddy_destroy</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#250">buddy_reset</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#142">buddy_reserve</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#42">buddy_node_to_index</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#75">buddy_alloc</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#197">buddy_free</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#32">buddy_index_to_node</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#57">buddy_check_alloc_down</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#23">buddy_order_start</a></td>
+ <td class="coverFnHi">33</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#18">buddy_map_size</a></td>
+ <td class="coverFnHi">632</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#52">buddy_check_alloc</a></td>
+ <td class="coverFnHi">1592</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/buddy.c.func.html b/coverage-report/core/buddy.c.func.html
new file mode 100644
index 0000000..aa2aa37
--- /dev/null
+++ b/coverage-report/core/buddy.c.func.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/buddy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - buddy.c<span style="font-size: 80%;"> (<a href="buddy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntry">96</td>
+ <td class="headerCovTableEntryHi">99.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="buddy.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#75">buddy_alloc</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#52">buddy_check_alloc</a></td>
+ <td class="coverFnHi">1592</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#57">buddy_check_alloc_down</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#265">buddy_create</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#286">buddy_destroy</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#197">buddy_free</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#32">buddy_index_to_node</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#18">buddy_map_size</a></td>
+ <td class="coverFnHi">632</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#42">buddy_node_to_index</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#23">buddy_order_start</a></td>
+ <td class="coverFnHi">33</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#142">buddy_reserve</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="buddy.c.gcov.html#250">buddy_reset</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/buddy.c.gcov.html b/coverage-report/core/buddy.c.gcov.html
new file mode 100644
index 0000000..4916a40
--- /dev/null
+++ b/coverage-report/core/buddy.c.gcov.html
@@ -0,0 +1,377 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/buddy.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - buddy.c<span style="font-size: 80%;"> (source / <a href="buddy.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntry">96</td>
+ <td class="headerCovTableEntryHi">99.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2016-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;assert.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;string.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;buddy.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define BUDDY_DEBUG</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #undef BUDDY_VERBOSE</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #ifdef BUDDY_VERBOSE</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define BUDDY_NOISE(fmt...) printf(fmt)</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #else</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define BUDDY_NOISE(fmt...) do { } while(0)</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #endif</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 632 : static inline unsigned int buddy_map_size(struct buddy *b)</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 632 : return 1u &lt;&lt; (b-&gt;max_order + 1);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 33 : static inline unsigned int buddy_order_start(struct buddy *b,</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : unsigned int order)</a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 33 : unsigned int level = b-&gt;max_order - order;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* Starting bit of index for order */</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 33 : return 1u &lt;&lt; level;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 15 : static inline unsigned int buddy_index_to_node(struct buddy *b,</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : unsigned int index,</a>
+<a name="36"><span class="lineNum"> 36 </span> : : unsigned int order)</a>
+<a name="37"><span class="lineNum"> 37 </span> : : {</a>
+<a name="38"><span class="lineNum"> 38 </span> : : /* Ensure the index is a multiple of the order */</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 15 : assert((index &amp; ((1u &lt;&lt; order) - 1)) == 0);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 15 : return buddy_order_start(b, order) + (index &gt;&gt; order);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 9 : static inline unsigned int buddy_node_to_index(struct buddy *b,</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : unsigned int node,</a>
+<a name="46"><span class="lineNum"> 46 </span> : : unsigned int order)</a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 9 : unsigned int start = buddy_order_start(b, order);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 9 : return (node - start) &lt;&lt; order;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : #ifdef BUDDY_DEBUG</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1592 : static void buddy_check_alloc(struct buddy *b, unsigned int node)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1592 : assert(bitmap_tst_bit(b-&gt;map, node));</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1592 : }</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 23 : static void buddy_check_alloc_down(struct buddy *b, unsigned int node)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 23 : unsigned int i, count = 1;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 121 : while (node &lt; buddy_map_size(b)) {</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1675 : for (i = 0; i &lt; count; i++)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1577 : buddy_check_alloc(b, node + i);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : /* Down one level */</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 98 : node &lt;&lt;= 1;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 98 : count &lt;&lt;= 1;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 23 : }</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : #else</a>
+<a name="73"><span class="lineNum"> 73 </span> : : static inline void buddy_check_alloc(struct buddy *b __unused, unsigned int node __unused) {}</a>
+<a name="74"><span class="lineNum"> 74 </span> : : static inline void buddy_check_alloc_down(struct buddy *b __unused, unsigned int node __unused) {}</a>
+<a name="75"><span class="lineNum"> 75 </span> : : #endif</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 10 : int buddy_alloc(struct buddy *b, unsigned int order)</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : {</a>
+<a name="79"><span class="lineNum"> 79 </span> : : unsigned int o;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : int node, index;</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : BUDDY_NOISE(&quot;buddy_alloc(%d)\n&quot;, order);</a>
+<a name="83"><span class="lineNum"> 83 </span> : : /*</a>
+<a name="84"><span class="lineNum"> 84 </span> : : * Find the first order up the tree from our requested order that</a>
+<a name="85"><span class="lineNum"> 85 </span> : : * has at least one free node.</a>
+<a name="86"><span class="lineNum"> 86 </span> : : */</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 16 : for (o = order; o &lt;= b-&gt;max_order; o++) {</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 15 : if (b-&gt;freecounts[o] &gt; 0)</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 9 : break;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : /* Nothing found ? fail */</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 10 : if (o &gt; b-&gt;max_order) {</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : BUDDY_NOISE(&quot; no free nodes !\n&quot;);</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : return -1;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : }</a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> : : BUDDY_NOISE(&quot; %d free node(s) at order %d, bits %d(%d)\n&quot;,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : b-&gt;freecounts[o], o,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : buddy_order_start(b, o),</a>
+<a name="101"><span class="lineNum"> 101 </span> : : 1u &lt;&lt; (b-&gt;max_order - o));</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : /* Now find a free node */</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 9 : node = bitmap_find_zero_bit(b-&gt;map, buddy_order_start(b, o),</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 9 : 1u &lt;&lt; (b-&gt;max_order - o));</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* There should always be one */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 9 : assert(node &gt;= 0);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Mark it allocated and decrease free count */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 9 : bitmap_set_bit(b-&gt;map, node);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 9 : b-&gt;freecounts[o]--;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* We know that node was free which means all its children must have</a>
+<a name="115"><span class="lineNum"> 115 </span> : : * been marked &quot;allocated&quot;. Double check.</a>
+<a name="116"><span class="lineNum"> 116 </span> : : */</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 9 : buddy_check_alloc_down(b, node);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : /* We have a node, we've marked it allocated, now we need to go down</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * the tree until we reach &quot;order&quot; which is the order we need. For</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * each level along the way, we mark the buddy free and leave the</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * first child allocated.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : */</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 14 : while (o &gt; order) {</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : /* Next level down */</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 5 : o--;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 5 : node &lt;&lt;= 1;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> : : BUDDY_NOISE(&quot; order %d, using %d marking %d free\n&quot;,</a>
+<a name="130"><span class="lineNum"> 130 </span> : : o, node, node ^ 1);</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 5 : bitmap_clr_bit(b-&gt;map, node ^ 1);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 5 : b-&gt;freecounts[o]++;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 5 : assert(bitmap_tst_bit(b-&gt;map, node));</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 9 : index = buddy_node_to_index(b, node, order);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : BUDDY_NOISE(&quot; result is index %d (node %d)\n&quot;, index, node);</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> : : /* We have a node, convert it to an element number */</a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 9 : return index;</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : }</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 3 : bool buddy_reserve(struct buddy *b, unsigned int index, unsigned int order)</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : {</a>
+<a name="146"><span class="lineNum"> 146 </span> : : unsigned int node, freenode, o;</a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 3 : assert(index &lt; (1u &lt;&lt; b-&gt;max_order));</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> : : BUDDY_NOISE(&quot;buddy_reserve(%d,%d)\n&quot;, index, order);</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> : : /* Get bit number for node */</a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 3 : node = buddy_index_to_node(b, index, order);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> : : BUDDY_NOISE(&quot; node=%d\n&quot;, node);</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* Find something free */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 18 : for (freenode = node, o = order; freenode &gt; 0; freenode &gt;&gt;= 1, o++)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 17 : if (!bitmap_tst_bit(b-&gt;map, freenode))</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> : : BUDDY_NOISE(&quot; freenode=%d order %d\n&quot;, freenode, o);</a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> : : /* Nothing free, error out */</a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 3 : if (!freenode)</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 1 : return false;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> : : /* We sit on a free node, mark it busy */</a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 2 : bitmap_set_bit(b-&gt;map, freenode);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 2 : assert(b-&gt;freecounts[o]);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 2 : b-&gt;freecounts[o]--;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> : : /* We know that node was free which means all its children must have</a>
+<a name="174"><span class="lineNum"> 174 </span> : : * been marked &quot;allocated&quot;. Double check.</a>
+<a name="175"><span class="lineNum"> 175 </span> : : */</a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 2 : buddy_check_alloc_down(b, freenode);</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> : : /* Reverse-walk the path and break down nodes */</a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 12 : while (o &gt; order) {</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : /* Next level down */</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 10 : o--;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 10 : freenode &lt;&lt;= 1;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : /* Find the right one on the path to node */</a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 10 : if (node &amp; (1u &lt;&lt; (o - order)))</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 7 : freenode++;</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> : : BUDDY_NOISE(&quot; order %d, using %d marking %d free\n&quot;,</a>
+<a name="189"><span class="lineNum"> 189 </span> : : o, freenode, freenode ^ 1);</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 10 : bitmap_clr_bit(b-&gt;map, freenode ^ 1);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 10 : b-&gt;freecounts[o]++;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 10 : assert(bitmap_tst_bit(b-&gt;map, node));</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 2 : assert(node == freenode);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 2 : return true;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : }</a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 12 : void buddy_free(struct buddy *b, unsigned int index, unsigned int order)</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : {</a>
+<a name="201"><span class="lineNum"> 201 </span> : : unsigned int node;</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 12 : assert(index &lt; (1u &lt;&lt; b-&gt;max_order));</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> : : BUDDY_NOISE(&quot;buddy_free(%d,%d)\n&quot;, index, order);</a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> : : /* Get bit number for node */</a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 12 : node = buddy_index_to_node(b, index, order);</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> : : BUDDY_NOISE(&quot; node=%d\n&quot;, node);</a>
+<a name="211"><span class="lineNum"> 211 </span> : : </a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* We assume that anything freed was fully allocated, ie,</a>
+<a name="213"><span class="lineNum"> 213 </span> : : * there is no child node of that allocation index/order</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * that is already free.</a>
+<a name="215"><span class="lineNum"> 215 </span> : : *</a>
+<a name="216"><span class="lineNum"> 216 </span> : : * BUDDY_DEBUG will verify it at the cost of performances</a>
+<a name="217"><span class="lineNum"> 217 </span> : : */</a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 12 : buddy_check_alloc_down(b, node);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> : : /* Propagate if buddy is free */</a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 27 : while (order &lt; b-&gt;max_order &amp;&amp; !bitmap_tst_bit(b-&gt;map, node ^ 1)) {</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : BUDDY_NOISE(&quot; order %d node %d buddy %d free, propagating\n&quot;,</a>
+<a name="223"><span class="lineNum"> 223 </span> : : order, node, node ^ 1);</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> : : /* Mark buddy busy (we are already marked busy) */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 15 : bitmap_set_bit(b-&gt;map, node ^ 1);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> : : /* Reduce free count */</a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 15 : assert(b-&gt;freecounts[order] &gt; 0);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 15 : b-&gt;freecounts[order]--;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : </a>
+<a name="232"><span class="lineNum"> 232 </span> : : /* Get parent */</a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 15 : node &gt;&gt;= 1;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 15 : order++;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> : : /* It must be busy already ! */</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 15 : buddy_check_alloc(b, node);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> : : BUDDY_NOISE(&quot; testing order %d node %d\n&quot;, order, node ^ 1);</a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* No more coalescing, mark it free */</a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 12 : bitmap_clr_bit(b-&gt;map, node);</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /* Increase the freelist count for that level */</a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 12 : b-&gt;freecounts[order]++;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> : : BUDDY_NOISE(&quot; free count at order %d is %d\n&quot;,</a>
+<a name="249"><span class="lineNum"> 249 </span> : : order, b-&gt;freecounts[order]);</a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 12 : }</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 1 : void buddy_reset(struct buddy *b)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : {</a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 1 : unsigned int bsize = BITMAP_BYTES(1u &lt;&lt; (b-&gt;max_order + 1));</span></a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> : : BUDDY_NOISE(&quot;buddy_reset()\n&quot;);</a>
+<a name="257"><span class="lineNum"> 257 </span> : : /* We fill the bitmap with 1's to make it completely &quot;busy&quot; */</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 1 : memset(b-&gt;map, 0xff, bsize);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 1 : memset(b-&gt;freecounts, 0, sizeof(b-&gt;freecounts));</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> : : /* We mark the root of the tree free, this is entry 1 as entry 0</a>
+<a name="262"><span class="lineNum"> 262 </span> : : * is unused.</a>
+<a name="263"><span class="lineNum"> 263 </span> : : */</a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 1 : buddy_free(b, 0, b-&gt;max_order);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 1 : struct buddy *buddy_create(unsigned int max_order)</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : {</a>
+<a name="269"><span class="lineNum"> 269 </span> : : struct buddy *b;</a>
+<a name="270"><span class="lineNum"> 270 </span> : : unsigned int bsize;</a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 1 : assert(max_order &lt;= BUDDY_MAX_ORDER);</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 1 : bsize = BITMAP_BYTES(1u &lt;&lt; (max_order + 1));</span></a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 1 : b = zalloc(sizeof(struct buddy) + bsize);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 1 : if (!b)</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 1 : b-&gt;max_order = max_order;</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> : : BUDDY_NOISE(&quot;Map @%p, size: %d bytes\n&quot;, b-&gt;map, bsize);</a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 1 : buddy_reset(b);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 1 : return b;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : }</a>
+<a name="287"><span class="lineNum"> 287 </span> : : </a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 1 : void buddy_destroy(struct buddy *b)</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : {</a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 1 : free(b);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/chip.c.func-sort-c.html b/coverage-report/core/chip.c.func-sort-c.html
new file mode 100644
index 0000000..63dca0f
--- /dev/null
+++ b/coverage-report/core/chip.c.func-sort-c.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/chip.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - chip.c<span style="font-size: 80%;"> (<a href="chip.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">87</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="chip.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#72">get_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#79">init_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#118">init_chips</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#61">next_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#12">pir_to_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#22">pir_to_core_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#35">pir_to_fused_core_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#48">pir_to_thread_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/chip.c.func.html b/coverage-report/core/chip.c.func.html
new file mode 100644
index 0000000..cf2aef8
--- /dev/null
+++ b/coverage-report/core/chip.c.func.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/chip.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - chip.c<span style="font-size: 80%;"> (<a href="chip.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">87</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="chip.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#72">get_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#79">init_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#118">init_chips</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#61">next_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#12">pir_to_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#22">pir_to_core_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#35">pir_to_fused_core_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.c.gcov.html#48">pir_to_thread_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/chip.c.gcov.html b/coverage-report/core/chip.c.gcov.html
new file mode 100644
index 0000000..351ee40
--- /dev/null
+++ b/coverage-report/core/chip.c.gcov.html
@@ -0,0 +1,251 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/chip.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - chip.c<span style="font-size: 80%;"> (source / <a href="chip.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">87</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;chip.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;console.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;device.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;timebase.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : static struct proc_chip *chips[MAX_CHIPS];</a>
+<a name="12"><span class="lineNum"> 12 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineNoCov"> 0 : uint32_t pir_to_chip_id(uint32_t pir)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineNoCov"> 0 : if (proc_gen == proc_gen_p9)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineNoCov"> 0 : return P9_PIR2GCID(pir);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineNoCov"> 0 : else if (proc_gen == proc_gen_p8)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : return P8_PIR2GCID(pir);</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : else</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : uint32_t pir_to_core_id(uint32_t pir)</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : if (proc_gen == proc_gen_p9) {</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : if (this_cpu()-&gt;is_fused_core)</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return P9_PIRFUSED2NORMALCOREID(pir);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : else</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : return P9_PIR2COREID(pir);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : } else if (proc_gen == proc_gen_p8)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : return P8_PIR2COREID(pir);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : else</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : uint32_t pir_to_fused_core_id(uint32_t pir)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : {</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : if (proc_gen == proc_gen_p9) {</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : if (this_cpu()-&gt;is_fused_core)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : return P9_PIR2FUSEDCOREID(pir);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : else</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : return P9_PIR2COREID(pir);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : } else if (proc_gen == proc_gen_p8)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : return P8_PIR2COREID(pir);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : else</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : }</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : uint32_t pir_to_thread_id(uint32_t pir)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : if (proc_gen == proc_gen_p9) {</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : if (this_cpu()-&gt;is_fused_core)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : return P9_PIRFUSED2NORMALTHREADID(pir);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : else</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : return P9_PIR2THREADID(pir);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : } else if (proc_gen == proc_gen_p8)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : return P8_PIR2THREADID(pir);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : else</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineNoCov"> 0 : struct proc_chip *next_chip(struct proc_chip *chip)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> : : unsigned int i;</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : for (i = chip ? (chip-&gt;id + 1) : 0; i &lt; MAX_CHIPS; i++)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : if (chips[i])</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : return chips[i];</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : }</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : struct proc_chip *get_chip(uint32_t chip_id)</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : {</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : if (chip_id &gt;= MAX_CHIPS)</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : return chips[chip_id];</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : static void init_chip(struct dt_node *dn)</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : {</a>
+<a name="83"><span class="lineNum"> 83 </span> : : struct proc_chip *chip;</a>
+<a name="84"><span class="lineNum"> 84 </span> : : uint32_t id;</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : const char *lc = NULL;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : id = dt_get_chip_id(dn);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : assert(id &lt; MAX_CHIPS);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : assert(chips[id] == NULL);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : chip = zalloc(sizeof(struct proc_chip));</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : assert(chip);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : chip-&gt;id = id;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : chip-&gt;devnode = dn;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : chip-&gt;dbob_id = dt_prop_get_u32_def(dn, &quot;ibm,dbob-id&quot;, 0xffffffff);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : chip-&gt;pcid = dt_prop_get_u32_def(dn, &quot;ibm,proc-chip-id&quot;, 0xffffffff);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : if (dt_prop_get_u32_def(dn, &quot;ibm,occ-functional-state&quot;, 0))</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : chip-&gt;occ_functional = true;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : else</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : chip-&gt;occ_functional = false;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : list_head_init(&amp;chip-&gt;i2cms);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* Update the location code for this chip. */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : if (dt_has_node_property(dn, &quot;ibm,loc-code&quot;, NULL))</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : lc = dt_prop_get(dn, &quot;ibm,loc-code&quot;);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : else if (dt_has_node_property(dn, &quot;ibm,slot-location-code&quot;, NULL))</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : lc = dt_prop_get(dn, &quot;ibm,slot-location-code&quot;);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : if (lc)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : chip-&gt;loc_code = strdup(lc);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;CHIP: Initialised chip %d from %s\n&quot;, id, dn-&gt;name);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : chips[id] = chip;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineNoCov"> 0 : void init_chips(void)</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : {</a>
+<a name="122"><span class="lineNum"> 122 </span> : : struct dt_node *xn;</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /* Detect mambo chip */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : if (dt_find_by_path(dt_root, &quot;/mambo&quot;)) {</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : proc_chip_quirks |= QUIRK_NO_CHIPTOD | QUIRK_MAMBO_CALLOUTS</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : | QUIRK_NO_F000F | QUIRK_NO_PBA | QUIRK_NO_OCC_IRQ</a>
+<a name="128"><span class="lineNum"> 128 </span> : : | QUIRK_NO_RNG;</a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : enable_mambo_console();</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;CHIP: Detected Mambo simulator\n&quot;);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : dt_for_each_compatible(dt_root, xn, &quot;ibm,mambo-chip&quot;)</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineNoCov"> 0 : init_chip(xn);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : /* Detect simics */</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : if (dt_find_by_path(dt_root, &quot;/simics&quot;)) {</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : proc_chip_quirks |= QUIRK_SIMICS</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : | QUIRK_NO_PBA | QUIRK_NO_OCC_IRQ | QUIRK_SLOW_SIM;</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : tb_hz = 512000;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;CHIP: Detected Simics simulator\n&quot;);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+<a name="145"><span class="lineNum"> 145 </span> : : /* Detect Awan emulator */</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : if (dt_find_by_path(dt_root, &quot;/awan&quot;)) {</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : proc_chip_quirks |= QUIRK_NO_CHIPTOD | QUIRK_NO_F000F</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : | QUIRK_NO_PBA | QUIRK_NO_OCC_IRQ | QUIRK_SLOW_SIM;</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : tb_hz = 512000;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;CHIP: Detected Awan emulator\n&quot;);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : }</a>
+<a name="152"><span class="lineNum"> 152 </span> : : /* Detect Qemu */</a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (dt_node_is_compatible(dt_root, &quot;qemu,powernv&quot;) ||</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : dt_node_is_compatible(dt_root, &quot;qemu,powernv8&quot;) ||</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : dt_node_is_compatible(dt_root, &quot;qemu,powernv9&quot;) ||</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : dt_find_by_path(dt_root, &quot;/qemu&quot;)) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : proc_chip_quirks |= QUIRK_QEMU | QUIRK_NO_CHIPTOD</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : | QUIRK_NO_DIRECT_CTL | QUIRK_NO_RNG;</a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;CHIP: Detected QEMU simulator\n&quot;);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> : : /* We walk the chips based on xscom nodes in the tree */</a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : dt_for_each_compatible(dt_root, xn, &quot;ibm,xscom&quot;) {</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : init_chip(xn);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : }</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/console-log.c.func-sort-c.html b/coverage-report/core/console-log.c.func-sort-c.html
new file mode 100644
index 0000000..d8a271e
--- /dev/null
+++ b/coverage-report/core/console-log.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/console-log.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - console-log.c<span style="font-size: 80%;"> (<a href="console-log.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="console-log.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="console-log.c.gcov.html#59">_printf</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="console-log.c.gcov.html#50">_prlog</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="console-log.c.gcov.html#16">vprlog</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/console-log.c.func.html b/coverage-report/core/console-log.c.func.html
new file mode 100644
index 0000000..96487cf
--- /dev/null
+++ b/coverage-report/core/console-log.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/console-log.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - console-log.c<span style="font-size: 80%;"> (<a href="console-log.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="console-log.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="console-log.c.gcov.html#59">_printf</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="console-log.c.gcov.html#50">_prlog</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="console-log.c.gcov.html#16">vprlog</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/console-log.c.gcov.html b/coverage-report/core/console-log.c.gcov.html
new file mode 100644
index 0000000..2daf712
--- /dev/null
+++ b/coverage-report/core/console-log.c.gcov.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/console-log.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - console-log.c<span style="font-size: 80%;"> (source / <a href="console-log.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Console Log routines</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * Wraps libc and console lower level functions</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * does fancy-schmancy things like timestamps and priorities</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * Doesn't make waffles.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;skiboot.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;unistd.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;stdio.h&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;console.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;timebase.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;debug_descriptor.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 13 : static int vprlog(int log_level, const char *fmt, va_list ap)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : int count;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : char buffer[320];</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 13 : bool flush_to_drivers = true;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 13 : unsigned long tb = mftb();</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : /* It's safe to return 0 when we &quot;did&quot; something here</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * as only printf cares about how much we wrote, and</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * if you change log_level to below PR_PRINTF then you</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * get everything you deserve.</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * By default, only PR_DEBUG and higher are stored in memory.</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * PR_TRACE and PR_INSANE are for those having a bad day.</a>
+<a name="31"><span class="lineNum"> 31 </span> : : */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 13 : if (log_level &gt; (debug_descriptor.console_log_levels &gt;&gt; 4))</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 11 : count = snprintf(buffer, sizeof(buffer), &quot;[%5lu.%09lu,%d] &quot;,</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : tb_to_secs(tb), tb_remaining_nsecs(tb), log_level);</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 11 : count+= vsnprintf(buffer+count, sizeof(buffer)-count, fmt, ap);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 11 : if (log_level &gt; (debug_descriptor.console_log_levels &amp; 0x0f))</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 2 : flush_to_drivers = false;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 11 : console_write(flush_to_drivers, buffer, count);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 11 : return count;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : }</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* we don't return anything as what on earth are we going to do</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * if we actually fail to print a log message? Print a log message about it?</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * Callers shouldn't care, prlog and friends should do something generically</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * sane in such crazy situations.</a>
+<a name="51"><span class="lineNum"> 51 </span> : : */</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 10 : void _prlog(int log_level, const char* fmt, ...)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> : : va_list ap;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 10 : va_start(ap, fmt);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 10 : vprlog(log_level, fmt, ap);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 10 : va_end(ap);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 2 : int _printf(const char* fmt, ...)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : {</a>
+<a name="63"><span class="lineNum"> 63 </span> : : int count;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : va_list ap;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 3 : va_start(ap, fmt);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 3 : count = vprlog(PR_PRINTF, fmt, ap);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 3 : va_end(ap);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 3 : return count;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/cpufeatures.c.func-sort-c.html b/coverage-report/core/cpufeatures.c.func-sort-c.html
new file mode 100644
index 0000000..ef6dcd8
--- /dev/null
+++ b/coverage-report/core/cpufeatures.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/cpufeatures.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - cpufeatures.c<span style="font-size: 80%;"> (<a href="cpufeatures.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">118</td>
+ <td class="headerCovTableEntry">139</td>
+ <td class="headerCovTableEntryMed">84.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="cpufeatures.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#860">add_cpufeatures</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#795">add_cpufeatures_dependencies</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#892">dt_add_cpufeatures</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#748">add_cpu_feature_nodeps</a></td>
+ <td class="coverFnHi">432</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/cpufeatures.c.func.html b/coverage-report/core/cpufeatures.c.func.html
new file mode 100644
index 0000000..a040883
--- /dev/null
+++ b/coverage-report/core/cpufeatures.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/cpufeatures.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - cpufeatures.c<span style="font-size: 80%;"> (<a href="cpufeatures.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">118</td>
+ <td class="headerCovTableEntry">139</td>
+ <td class="headerCovTableEntryMed">84.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="cpufeatures.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#748">add_cpu_feature_nodeps</a></td>
+ <td class="coverFnHi">432</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#860">add_cpufeatures</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#795">add_cpufeatures_dependencies</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpufeatures.c.gcov.html#892">dt_add_cpufeatures</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/cpufeatures.c.gcov.html b/coverage-report/core/cpufeatures.c.gcov.html
new file mode 100644
index 0000000..4a89897
--- /dev/null
+++ b/coverage-report/core/cpufeatures.c.gcov.html
@@ -0,0 +1,1068 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/cpufeatures.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - cpufeatures.c<span style="font-size: 80%;"> (source / <a href="cpufeatures.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">118</td>
+ <td class="headerCovTableEntry">139</td>
+ <td class="headerCovTableEntryMed">84.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This file deals with setup of /cpus/ibm,powerpc-cpu-features dt</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2017-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;processor.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;device.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #ifdef DEBUG</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define DBG(fmt, a...) prlog(PR_DEBUG, &quot;CPUFT: &quot; fmt, ##a)</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #else</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define DBG(fmt, a...)</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #endif</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* Device-tree visible constants follow */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define ISA_V2_07B 2070</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define ISA_V3_0B 3000</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define USABLE_PR (1U &lt;&lt; 0)</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #define USABLE_OS (1U &lt;&lt; 1)</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #define USABLE_HV (1U &lt;&lt; 2)</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : #define HV_SUPPORT_HFSCR (1U &lt;&lt; 0)</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #define OS_SUPPORT_FSCR (1U &lt;&lt; 0)</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* Following are definitions for the match tables, not the DT binding itself */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #define ISA_BASE 0</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define HV_NONE 0</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #define HV_CUSTOM 1</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #define HV_HFSCR 2</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define OS_NONE 0</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define OS_CUSTOM 1</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #define OS_FSCR 2</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /* CPU bitmasks for match table */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : #define CPU_P8_DD1 (1U &lt;&lt; 0)</a>
+<a name="44"><span class="lineNum"> 44 </span> : : #define CPU_P8_DD2 (1U &lt;&lt; 1)</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #define CPU_P9_DD1 (1U &lt;&lt; 2)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define CPU_P9_DD2_0_1 (1U &lt;&lt; 3) // 2.01 or 2.1</a>
+<a name="47"><span class="lineNum"> 47 </span> : : #define CPU_P9P (1U &lt;&lt; 4)</a>
+<a name="48"><span class="lineNum"> 48 </span> : : #define CPU_P9_DD2_2 (1U &lt;&lt; 5)</a>
+<a name="49"><span class="lineNum"> 49 </span> : : #define CPU_P9_DD2_3 (1U &lt;&lt; 6)</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> : : #define CPU_P9_DD2 (CPU_P9_DD2_0_1|CPU_P9_DD2_2|CPU_P9_DD2_3|CPU_P9P)</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : #define CPU_P8 (CPU_P8_DD1|CPU_P8_DD2)</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #define CPU_P9 (CPU_P9_DD1|CPU_P9_DD2|CPU_P9P)</a>
+<a name="55"><span class="lineNum"> 55 </span> : : #define CPU_ALL (CPU_P8|CPU_P9)</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> : : struct cpu_feature {</a>
+<a name="58"><span class="lineNum"> 58 </span> : : const char *name;</a>
+<a name="59"><span class="lineNum"> 59 </span> : : uint32_t cpus_supported;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : uint32_t isa;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : uint32_t usable_privilege;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : uint32_t hv_support;</a>
+<a name="63"><span class="lineNum"> 63 </span> : : uint32_t os_support;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : uint32_t hfscr_bit_nr;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : uint32_t fscr_bit_nr;</a>
+<a name="66"><span class="lineNum"> 66 </span> : : uint32_t hwcap_bit_nr;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : const char *dependencies_names; /* space-delimited names */</a>
+<a name="68"><span class="lineNum"> 68 </span> : : };</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /*</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * The base (or NULL) cpu feature set is the CPU features available</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * when no child nodes of the /cpus/ibm,powerpc-cpu-features node exist. The</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * base feature set is POWER8 (ISAv2.07B), less features that are listed</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * explicitly.</a>
+<a name="75"><span class="lineNum"> 75 </span> : : *</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * XXX: currently, the feature dependencies are not necessarily captured</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * exactly or completely. This is somewhat acceptable because all</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * implementations must be aware of all these features.</a>
+<a name="79"><span class="lineNum"> 79 </span> : : */</a>
+<a name="80"><span class="lineNum"> 80 </span> : : static const struct cpu_feature cpu_features_table[] = {</a>
+<a name="81"><span class="lineNum"> 81 </span> : : /*</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * Big endian as in ISAv2.07B, MSR_LE=0</a>
+<a name="83"><span class="lineNum"> 83 </span> : : */</a>
+<a name="84"><span class="lineNum"> 84 </span> : : { &quot;big-endian&quot;,</a>
+<a name="85"><span class="lineNum"> 85 </span> : : CPU_ALL,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="87"><span class="lineNum"> 87 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="88"><span class="lineNum"> 88 </span> : : -1, -1, -1,</a>
+<a name="89"><span class="lineNum"> 89 </span> : : NULL, },</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : /*</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * Little endian as in ISAv2.07B, MSR_LE=1.</a>
+<a name="93"><span class="lineNum"> 93 </span> : : *</a>
+<a name="94"><span class="lineNum"> 94 </span> : : * When both big and little endian are defined, there is an LPCR ILE</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * bit and implementation specific way to switch HILE mode, MSR_SLE,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : * etc.</a>
+<a name="97"><span class="lineNum"> 97 </span> : : */</a>
+<a name="98"><span class="lineNum"> 98 </span> : : { &quot;little-endian&quot;,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : CPU_ALL,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="101"><span class="lineNum"> 101 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="102"><span class="lineNum"> 102 </span> : : -1, -1, -1,</a>
+<a name="103"><span class="lineNum"> 103 </span> : : NULL, },</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> : : /*</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * MSR_HV=1 mode as in ISAv2.07B (i.e., hypervisor privileged</a>
+<a name="107"><span class="lineNum"> 107 </span> : : * instructions and registers).</a>
+<a name="108"><span class="lineNum"> 108 </span> : : */</a>
+<a name="109"><span class="lineNum"> 109 </span> : : { &quot;hypervisor&quot;,</a>
+<a name="110"><span class="lineNum"> 110 </span> : : CPU_ALL,</a>
+<a name="111"><span class="lineNum"> 111 </span> : : ISA_BASE, USABLE_HV,</a>
+<a name="112"><span class="lineNum"> 112 </span> : : HV_CUSTOM, OS_NONE,</a>
+<a name="113"><span class="lineNum"> 113 </span> : : -1, -1, -1,</a>
+<a name="114"><span class="lineNum"> 114 </span> : : NULL, },</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : /*</a>
+<a name="117"><span class="lineNum"> 117 </span> : : * ISAv2.07B interrupt vectors, registers, and control registers</a>
+<a name="118"><span class="lineNum"> 118 </span> : : * (e.g., AIL, ILE, HV, etc LPCR bits).</a>
+<a name="119"><span class="lineNum"> 119 </span> : : *</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * This does not necessarily specify all possible interrupt types.</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * floating-point, for example requires some ways to handle floating</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * point exceptions, but the low level details of interrupt handler</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * is not a dependency there. There will always be *some* interrupt</a>
+<a name="124"><span class="lineNum"> 124 </span> : : * handler, (and some way to provide memory magagement, etc.).</a>
+<a name="125"><span class="lineNum"> 125 </span> : : */</a>
+<a name="126"><span class="lineNum"> 126 </span> : : { &quot;interrupt-facilities&quot;,</a>
+<a name="127"><span class="lineNum"> 127 </span> : : CPU_ALL,</a>
+<a name="128"><span class="lineNum"> 128 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="129"><span class="lineNum"> 129 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="130"><span class="lineNum"> 130 </span> : : -1, -1, -1,</a>
+<a name="131"><span class="lineNum"> 131 </span> : : NULL, },</a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> : : { &quot;smt&quot;,</a>
+<a name="134"><span class="lineNum"> 134 </span> : : CPU_ALL,</a>
+<a name="135"><span class="lineNum"> 135 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="136"><span class="lineNum"> 136 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="137"><span class="lineNum"> 137 </span> : : -1, -1, 14,</a>
+<a name="138"><span class="lineNum"> 138 </span> : : NULL, },</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> : : /*</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * ISAv2.07B Program Priority Registers (PPR)</a>
+<a name="142"><span class="lineNum"> 142 </span> : : * PPR and associated control registers (e.g. RPR, PSPB),</a>
+<a name="143"><span class="lineNum"> 143 </span> : : * priority &quot;or&quot; instructions, etc.</a>
+<a name="144"><span class="lineNum"> 144 </span> : : */</a>
+<a name="145"><span class="lineNum"> 145 </span> : : { &quot;program-priority-register&quot;,</a>
+<a name="146"><span class="lineNum"> 146 </span> : : CPU_ALL,</a>
+<a name="147"><span class="lineNum"> 147 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="148"><span class="lineNum"> 148 </span> : : HV_NONE, OS_NONE,</a>
+<a name="149"><span class="lineNum"> 149 </span> : : -1, -1, -1,</a>
+<a name="150"><span class="lineNum"> 150 </span> : : NULL, },</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> : : /*</a>
+<a name="153"><span class="lineNum"> 153 </span> : : * ISAv2.07B Book3S Chapter 5.7.9.1. Virtual Page Class Key Protecion</a>
+<a name="154"><span class="lineNum"> 154 </span> : : * AMR, IAMR, AMOR, UAMOR, etc registers and MMU key bits.</a>
+<a name="155"><span class="lineNum"> 155 </span> : : */</a>
+<a name="156"><span class="lineNum"> 156 </span> : : { &quot;virtual-page-class-key-protection&quot;,</a>
+<a name="157"><span class="lineNum"> 157 </span> : : CPU_ALL,</a>
+<a name="158"><span class="lineNum"> 158 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="159"><span class="lineNum"> 159 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="160"><span class="lineNum"> 160 </span> : : -1, -1, -1,</a>
+<a name="161"><span class="lineNum"> 161 </span> : : NULL, },</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : /*</a>
+<a name="164"><span class="lineNum"> 164 </span> : : * ISAv2.07B SAO storage control attribute</a>
+<a name="165"><span class="lineNum"> 165 </span> : : */</a>
+<a name="166"><span class="lineNum"> 166 </span> : : { &quot;strong-access-ordering&quot;,</a>
+<a name="167"><span class="lineNum"> 167 </span> : : CPU_ALL &amp; ~CPU_P9_DD1,</a>
+<a name="168"><span class="lineNum"> 168 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="169"><span class="lineNum"> 169 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="170"><span class="lineNum"> 170 </span> : : -1, -1, -1,</a>
+<a name="171"><span class="lineNum"> 171 </span> : : NULL, },</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> : : /*</a>
+<a name="174"><span class="lineNum"> 174 </span> : : * ISAv2.07B no-execute storage control attribute</a>
+<a name="175"><span class="lineNum"> 175 </span> : : */</a>
+<a name="176"><span class="lineNum"> 176 </span> : : { &quot;no-execute&quot;,</a>
+<a name="177"><span class="lineNum"> 177 </span> : : CPU_ALL,</a>
+<a name="178"><span class="lineNum"> 178 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="179"><span class="lineNum"> 179 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="180"><span class="lineNum"> 180 </span> : : -1, -1, -1,</a>
+<a name="181"><span class="lineNum"> 181 </span> : : NULL, },</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> : : /*</a>
+<a name="184"><span class="lineNum"> 184 </span> : : * Cache inhibited attribute supported on large pages.</a>
+<a name="185"><span class="lineNum"> 185 </span> : : */</a>
+<a name="186"><span class="lineNum"> 186 </span> : : { &quot;cache-inhibited-large-page&quot;,</a>
+<a name="187"><span class="lineNum"> 187 </span> : : CPU_ALL,</a>
+<a name="188"><span class="lineNum"> 188 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="189"><span class="lineNum"> 189 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="190"><span class="lineNum"> 190 </span> : : -1, -1, -1,</a>
+<a name="191"><span class="lineNum"> 191 </span> : : NULL, },</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : /*</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * ISAv2.07B Book3S Chapter 8. Debug Facilities</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * CIEA, CIABR, DEAW, MEte, trace interrupt, etc.</a>
+<a name="196"><span class="lineNum"> 196 </span> : : * Except CFAR, branch tracing.</a>
+<a name="197"><span class="lineNum"> 197 </span> : : */</a>
+<a name="198"><span class="lineNum"> 198 </span> : : { &quot;debug-facilities&quot;,</a>
+<a name="199"><span class="lineNum"> 199 </span> : : CPU_ALL,</a>
+<a name="200"><span class="lineNum"> 200 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="201"><span class="lineNum"> 201 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="202"><span class="lineNum"> 202 </span> : : -1, -1, -1,</a>
+<a name="203"><span class="lineNum"> 203 </span> : : NULL, },</a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> : : /*</a>
+<a name="206"><span class="lineNum"> 206 </span> : : * ISAv2.07B CFAR</a>
+<a name="207"><span class="lineNum"> 207 </span> : : */</a>
+<a name="208"><span class="lineNum"> 208 </span> : : { &quot;come-from-address-register&quot;,</a>
+<a name="209"><span class="lineNum"> 209 </span> : : CPU_ALL,</a>
+<a name="210"><span class="lineNum"> 210 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="211"><span class="lineNum"> 211 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="212"><span class="lineNum"> 212 </span> : : -1, -1, -1,</a>
+<a name="213"><span class="lineNum"> 213 </span> : : &quot;debug-facilities&quot;, },</a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> : : /*</a>
+<a name="216"><span class="lineNum"> 216 </span> : : * ISAv2.07B Branch tracing (optional in ISA)</a>
+<a name="217"><span class="lineNum"> 217 </span> : : */</a>
+<a name="218"><span class="lineNum"> 218 </span> : : { &quot;branch-tracing&quot;,</a>
+<a name="219"><span class="lineNum"> 219 </span> : : CPU_ALL,</a>
+<a name="220"><span class="lineNum"> 220 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="221"><span class="lineNum"> 221 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="222"><span class="lineNum"> 222 </span> : : -1, -1, -1,</a>
+<a name="223"><span class="lineNum"> 223 </span> : : &quot;debug-facilities&quot;, },</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> : : /*</a>
+<a name="226"><span class="lineNum"> 226 </span> : : * ISAv2.07B Floating-point Facility</a>
+<a name="227"><span class="lineNum"> 227 </span> : : */</a>
+<a name="228"><span class="lineNum"> 228 </span> : : { &quot;floating-point&quot;,</a>
+<a name="229"><span class="lineNum"> 229 </span> : : CPU_ALL,</a>
+<a name="230"><span class="lineNum"> 230 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="231"><span class="lineNum"> 231 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="232"><span class="lineNum"> 232 </span> : : PPC_BITLSHIFT(63), -1, 27,</a>
+<a name="233"><span class="lineNum"> 233 </span> : : NULL, },</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> : : /*</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * ISAv2.07B Vector Facility (VMX)</a>
+<a name="237"><span class="lineNum"> 237 </span> : : */</a>
+<a name="238"><span class="lineNum"> 238 </span> : : { &quot;vector&quot;,</a>
+<a name="239"><span class="lineNum"> 239 </span> : : CPU_ALL,</a>
+<a name="240"><span class="lineNum"> 240 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="241"><span class="lineNum"> 241 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="242"><span class="lineNum"> 242 </span> : : PPC_BITLSHIFT(62), -1, 28,</a>
+<a name="243"><span class="lineNum"> 243 </span> : : &quot;floating-point&quot;, },</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /*</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * ISAv2.07B Vector-scalar Facility (VSX)</a>
+<a name="247"><span class="lineNum"> 247 </span> : : */</a>
+<a name="248"><span class="lineNum"> 248 </span> : : { &quot;vector-scalar&quot;,</a>
+<a name="249"><span class="lineNum"> 249 </span> : : CPU_ALL,</a>
+<a name="250"><span class="lineNum"> 250 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="251"><span class="lineNum"> 251 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="252"><span class="lineNum"> 252 </span> : : -1, -1, 7,</a>
+<a name="253"><span class="lineNum"> 253 </span> : : &quot;vector&quot;, },</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : { &quot;vector-crypto&quot;,</a>
+<a name="256"><span class="lineNum"> 256 </span> : : CPU_ALL,</a>
+<a name="257"><span class="lineNum"> 257 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="258"><span class="lineNum"> 258 </span> : : HV_NONE, OS_NONE,</a>
+<a name="259"><span class="lineNum"> 259 </span> : : -1, -1, 57,</a>
+<a name="260"><span class="lineNum"> 260 </span> : : &quot;vector&quot;, },</a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> : : /*</a>
+<a name="263"><span class="lineNum"> 263 </span> : : * ISAv2.07B Quadword Load and Store instructions</a>
+<a name="264"><span class="lineNum"> 264 </span> : : * including lqarx/stdqcx. instructions.</a>
+<a name="265"><span class="lineNum"> 265 </span> : : */</a>
+<a name="266"><span class="lineNum"> 266 </span> : : { &quot;quadword-load-store&quot;,</a>
+<a name="267"><span class="lineNum"> 267 </span> : : CPU_ALL,</a>
+<a name="268"><span class="lineNum"> 268 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="269"><span class="lineNum"> 269 </span> : : HV_NONE, OS_NONE,</a>
+<a name="270"><span class="lineNum"> 270 </span> : : -1, -1, -1,</a>
+<a name="271"><span class="lineNum"> 271 </span> : : NULL, },</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> : : /*</a>
+<a name="274"><span class="lineNum"> 274 </span> : : * ISAv2.07B Binary Coded Decimal (BCD)</a>
+<a name="275"><span class="lineNum"> 275 </span> : : * BCD fixed point instructions</a>
+<a name="276"><span class="lineNum"> 276 </span> : : */</a>
+<a name="277"><span class="lineNum"> 277 </span> : : { &quot;decimal-integer&quot;,</a>
+<a name="278"><span class="lineNum"> 278 </span> : : CPU_ALL,</a>
+<a name="279"><span class="lineNum"> 279 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="280"><span class="lineNum"> 280 </span> : : HV_NONE, OS_NONE,</a>
+<a name="281"><span class="lineNum"> 281 </span> : : -1, -1, -1,</a>
+<a name="282"><span class="lineNum"> 282 </span> : : NULL, },</a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> : : /*</a>
+<a name="285"><span class="lineNum"> 285 </span> : : * ISAv2.07B Decimal floating-point Facility (DFP)</a>
+<a name="286"><span class="lineNum"> 286 </span> : : */</a>
+<a name="287"><span class="lineNum"> 287 </span> : : { &quot;decimal-floating-point&quot;,</a>
+<a name="288"><span class="lineNum"> 288 </span> : : CPU_ALL,</a>
+<a name="289"><span class="lineNum"> 289 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="290"><span class="lineNum"> 290 </span> : : HV_NONE, OS_NONE,</a>
+<a name="291"><span class="lineNum"> 291 </span> : : -1, -1, 10,</a>
+<a name="292"><span class="lineNum"> 292 </span> : : &quot;floating-point&quot;, },</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : /*</a>
+<a name="295"><span class="lineNum"> 295 </span> : : * ISAv2.07B</a>
+<a name="296"><span class="lineNum"> 296 </span> : : * DSCR, default data prefetch LPCR, etc</a>
+<a name="297"><span class="lineNum"> 297 </span> : : */</a>
+<a name="298"><span class="lineNum"> 298 </span> : : { &quot;data-stream-control-register&quot;,</a>
+<a name="299"><span class="lineNum"> 299 </span> : : CPU_ALL,</a>
+<a name="300"><span class="lineNum"> 300 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="301"><span class="lineNum"> 301 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="302"><span class="lineNum"> 302 </span> : : PPC_BITLSHIFT(61), PPC_BITLSHIFT(61), 61,</a>
+<a name="303"><span class="lineNum"> 303 </span> : : NULL, },</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : /*</a>
+<a name="306"><span class="lineNum"> 306 </span> : : * ISAv2.07B Branch History Rolling Buffer (BHRB)</a>
+<a name="307"><span class="lineNum"> 307 </span> : : */</a>
+<a name="308"><span class="lineNum"> 308 </span> : : { &quot;branch-history-rolling-buffer&quot;,</a>
+<a name="309"><span class="lineNum"> 309 </span> : : CPU_ALL,</a>
+<a name="310"><span class="lineNum"> 310 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="311"><span class="lineNum"> 311 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="312"><span class="lineNum"> 312 </span> : : PPC_BITLSHIFT(59), -1, -1,</a>
+<a name="313"><span class="lineNum"> 313 </span> : : NULL, },</a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> : : /*</a>
+<a name="316"><span class="lineNum"> 316 </span> : : * ISAv2.07B Transactional Memory Facility (TM or HTM)</a>
+<a name="317"><span class="lineNum"> 317 </span> : : */</a>
+<a name="318"><span class="lineNum"> 318 </span> : : { &quot;transactional-memory&quot;,</a>
+<a name="319"><span class="lineNum"> 319 </span> : : CPU_P8, /* P9 support is not enabled yet */</a>
+<a name="320"><span class="lineNum"> 320 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="321"><span class="lineNum"> 321 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="322"><span class="lineNum"> 322 </span> : : PPC_BITLSHIFT(58), -1, 62,</a>
+<a name="323"><span class="lineNum"> 323 </span> : : NULL, },</a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> : : /*</a>
+<a name="326"><span class="lineNum"> 326 </span> : : * ISAv3.0B TM additions</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * TEXASR bit 17, self-induced vs external footprint overflow</a>
+<a name="328"><span class="lineNum"> 328 </span> : : */</a>
+<a name="329"><span class="lineNum"> 329 </span> : : { &quot;transactional-memory-v3&quot;,</a>
+<a name="330"><span class="lineNum"> 330 </span> : : 0,</a>
+<a name="331"><span class="lineNum"> 331 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="332"><span class="lineNum"> 332 </span> : : HV_NONE, OS_NONE,</a>
+<a name="333"><span class="lineNum"> 333 </span> : : -1, -1, -1,</a>
+<a name="334"><span class="lineNum"> 334 </span> : : &quot;transactional-memory&quot;, },</a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> : : /*</a>
+<a name="337"><span class="lineNum"> 337 </span> : : * ISAv2.07B Event-Based Branch Facility (EBB)</a>
+<a name="338"><span class="lineNum"> 338 </span> : : */</a>
+<a name="339"><span class="lineNum"> 339 </span> : : { &quot;event-based-branch&quot;,</a>
+<a name="340"><span class="lineNum"> 340 </span> : : CPU_ALL,</a>
+<a name="341"><span class="lineNum"> 341 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="342"><span class="lineNum"> 342 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="343"><span class="lineNum"> 343 </span> : : PPC_BITLSHIFT(56), PPC_BITLSHIFT(56), 60,</a>
+<a name="344"><span class="lineNum"> 344 </span> : : NULL, },</a>
+<a name="345"><span class="lineNum"> 345 </span> : : </a>
+<a name="346"><span class="lineNum"> 346 </span> : : /*</a>
+<a name="347"><span class="lineNum"> 347 </span> : : * ISAv2.07B Target Address Register (TAR)</a>
+<a name="348"><span class="lineNum"> 348 </span> : : */</a>
+<a name="349"><span class="lineNum"> 349 </span> : : { &quot;target-address-register&quot;,</a>
+<a name="350"><span class="lineNum"> 350 </span> : : CPU_ALL,</a>
+<a name="351"><span class="lineNum"> 351 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="352"><span class="lineNum"> 352 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="353"><span class="lineNum"> 353 </span> : : PPC_BITLSHIFT(55), PPC_BITLSHIFT(55), 58,</a>
+<a name="354"><span class="lineNum"> 354 </span> : : NULL, },</a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> : : /*</a>
+<a name="357"><span class="lineNum"> 357 </span> : : * ISAv2.07B Control Register (CTRL)</a>
+<a name="358"><span class="lineNum"> 358 </span> : : */</a>
+<a name="359"><span class="lineNum"> 359 </span> : : { &quot;control-register&quot;,</a>
+<a name="360"><span class="lineNum"> 360 </span> : : CPU_ALL,</a>
+<a name="361"><span class="lineNum"> 361 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="362"><span class="lineNum"> 362 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="363"><span class="lineNum"> 363 </span> : : -1, -1, -1,</a>
+<a name="364"><span class="lineNum"> 364 </span> : : NULL, },</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> : : /*</a>
+<a name="367"><span class="lineNum"> 367 </span> : : * ISAv2.07B Book3S Chapter 11. Processor Control.</a>
+<a name="368"><span class="lineNum"> 368 </span> : : * msgsnd, msgsndp, doorbell, etc.</a>
+<a name="369"><span class="lineNum"> 369 </span> : : *</a>
+<a name="370"><span class="lineNum"> 370 </span> : : * ISAv3.0B is not compatible (different addressing, HFSCR required</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * for msgsndp).</a>
+<a name="372"><span class="lineNum"> 372 </span> : : */</a>
+<a name="373"><span class="lineNum"> 373 </span> : : { &quot;processor-control-facility&quot;,</a>
+<a name="374"><span class="lineNum"> 374 </span> : : CPU_P8_DD2, /* P8 DD1 has no dbell */</a>
+<a name="375"><span class="lineNum"> 375 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="376"><span class="lineNum"> 376 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="377"><span class="lineNum"> 377 </span> : : -1, -1, -1,</a>
+<a name="378"><span class="lineNum"> 378 </span> : : NULL, },</a>
+<a name="379"><span class="lineNum"> 379 </span> : : </a>
+<a name="380"><span class="lineNum"> 380 </span> : : /*</a>
+<a name="381"><span class="lineNum"> 381 </span> : : * ISAv2.07B PURR, SPURR registers</a>
+<a name="382"><span class="lineNum"> 382 </span> : : */</a>
+<a name="383"><span class="lineNum"> 383 </span> : : { &quot;processor-utilization-of-resources-register&quot;,</a>
+<a name="384"><span class="lineNum"> 384 </span> : : CPU_ALL,</a>
+<a name="385"><span class="lineNum"> 385 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="386"><span class="lineNum"> 386 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="387"><span class="lineNum"> 387 </span> : : -1, -1, -1,</a>
+<a name="388"><span class="lineNum"> 388 </span> : : NULL, },</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> : : /*</a>
+<a name="391"><span class="lineNum"> 391 </span> : : * POWER8 initiate coprocessor store word indexed (icswx) instruction</a>
+<a name="392"><span class="lineNum"> 392 </span> : : */</a>
+<a name="393"><span class="lineNum"> 393 </span> : : { &quot;coprocessor-icswx&quot;,</a>
+<a name="394"><span class="lineNum"> 394 </span> : : CPU_P8,</a>
+<a name="395"><span class="lineNum"> 395 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="396"><span class="lineNum"> 396 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="397"><span class="lineNum"> 397 </span> : : -1, -1, -1,</a>
+<a name="398"><span class="lineNum"> 398 </span> : : NULL, },</a>
+<a name="399"><span class="lineNum"> 399 </span> : : </a>
+<a name="400"><span class="lineNum"> 400 </span> : : /*</a>
+<a name="401"><span class="lineNum"> 401 </span> : : * ISAv2.07B hash based MMU and all instructions, registers,</a>
+<a name="402"><span class="lineNum"> 402 </span> : : * data structures, exceptions, etc.</a>
+<a name="403"><span class="lineNum"> 403 </span> : : */</a>
+<a name="404"><span class="lineNum"> 404 </span> : : { &quot;mmu-hash&quot;,</a>
+<a name="405"><span class="lineNum"> 405 </span> : : CPU_P8,</a>
+<a name="406"><span class="lineNum"> 406 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="407"><span class="lineNum"> 407 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="408"><span class="lineNum"> 408 </span> : : -1, -1, -1,</a>
+<a name="409"><span class="lineNum"> 409 </span> : : NULL, },</a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : /*</a>
+<a name="412"><span class="lineNum"> 412 </span> : : * POWER8 MCE / machine check exception.</a>
+<a name="413"><span class="lineNum"> 413 </span> : : */</a>
+<a name="414"><span class="lineNum"> 414 </span> : : { &quot;machine-check-power8&quot;,</a>
+<a name="415"><span class="lineNum"> 415 </span> : : CPU_P8,</a>
+<a name="416"><span class="lineNum"> 416 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="417"><span class="lineNum"> 417 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="418"><span class="lineNum"> 418 </span> : : -1, -1, -1,</a>
+<a name="419"><span class="lineNum"> 419 </span> : : NULL, },</a>
+<a name="420"><span class="lineNum"> 420 </span> : : </a>
+<a name="421"><span class="lineNum"> 421 </span> : : /*</a>
+<a name="422"><span class="lineNum"> 422 </span> : : * POWER8 PMU / performance monitor unit.</a>
+<a name="423"><span class="lineNum"> 423 </span> : : */</a>
+<a name="424"><span class="lineNum"> 424 </span> : : { &quot;performance-monitor-power8&quot;,</a>
+<a name="425"><span class="lineNum"> 425 </span> : : CPU_P8,</a>
+<a name="426"><span class="lineNum"> 426 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="427"><span class="lineNum"> 427 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="428"><span class="lineNum"> 428 </span> : : -1, -1, -1,</a>
+<a name="429"><span class="lineNum"> 429 </span> : : NULL, },</a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> : : /*</a>
+<a name="432"><span class="lineNum"> 432 </span> : : * ISAv2.07B alignment interrupts set DSISR register</a>
+<a name="433"><span class="lineNum"> 433 </span> : : *</a>
+<a name="434"><span class="lineNum"> 434 </span> : : * POWER CPUs do not used this, and it's removed from ISAv3.0B.</a>
+<a name="435"><span class="lineNum"> 435 </span> : : */</a>
+<a name="436"><span class="lineNum"> 436 </span> : : { &quot;alignment-interrupt-dsisr&quot;,</a>
+<a name="437"><span class="lineNum"> 437 </span> : : 0,</a>
+<a name="438"><span class="lineNum"> 438 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="439"><span class="lineNum"> 439 </span> : : HV_NONE, OS_NONE,</a>
+<a name="440"><span class="lineNum"> 440 </span> : : -1, -1, -1,</a>
+<a name="441"><span class="lineNum"> 441 </span> : : NULL, },</a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> : : /*</a>
+<a name="444"><span class="lineNum"> 444 </span> : : * ISAv2.07B / POWER8 doze, nap, sleep, winkle instructions</a>
+<a name="445"><span class="lineNum"> 445 </span> : : * XXX: is Linux we using some BookIV specific implementation details</a>
+<a name="446"><span class="lineNum"> 446 </span> : : * in nap handling? We have no POWER8 specific key here.</a>
+<a name="447"><span class="lineNum"> 447 </span> : : */</a>
+<a name="448"><span class="lineNum"> 448 </span> : : { &quot;idle-nap&quot;,</a>
+<a name="449"><span class="lineNum"> 449 </span> : : CPU_P8,</a>
+<a name="450"><span class="lineNum"> 450 </span> : : ISA_BASE, USABLE_HV,</a>
+<a name="451"><span class="lineNum"> 451 </span> : : HV_CUSTOM, OS_NONE,</a>
+<a name="452"><span class="lineNum"> 452 </span> : : -1, -1, -1,</a>
+<a name="453"><span class="lineNum"> 453 </span> : : NULL, },</a>
+<a name="454"><span class="lineNum"> 454 </span> : : </a>
+<a name="455"><span class="lineNum"> 455 </span> : : /*</a>
+<a name="456"><span class="lineNum"> 456 </span> : : * ISAv2.07B wait instruction</a>
+<a name="457"><span class="lineNum"> 457 </span> : : */</a>
+<a name="458"><span class="lineNum"> 458 </span> : : { &quot;wait&quot;,</a>
+<a name="459"><span class="lineNum"> 459 </span> : : CPU_P8,</a>
+<a name="460"><span class="lineNum"> 460 </span> : : ISA_BASE, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="461"><span class="lineNum"> 461 </span> : : HV_NONE, OS_NONE,</a>
+<a name="462"><span class="lineNum"> 462 </span> : : -1, -1, -1,</a>
+<a name="463"><span class="lineNum"> 463 </span> : : NULL, },</a>
+<a name="464"><span class="lineNum"> 464 </span> : : </a>
+<a name="465"><span class="lineNum"> 465 </span> : : { &quot;subcore&quot;,</a>
+<a name="466"><span class="lineNum"> 466 </span> : : CPU_P8,</a>
+<a name="467"><span class="lineNum"> 467 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="468"><span class="lineNum"> 468 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="469"><span class="lineNum"> 469 </span> : : -1, -1, -1,</a>
+<a name="470"><span class="lineNum"> 470 </span> : : &quot;smt&quot;, },</a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> : : /*</a>
+<a name="473"><span class="lineNum"> 473 </span> : : * ISAv3.0B radix based MMU</a>
+<a name="474"><span class="lineNum"> 474 </span> : : */</a>
+<a name="475"><span class="lineNum"> 475 </span> : : { &quot;mmu-radix&quot;,</a>
+<a name="476"><span class="lineNum"> 476 </span> : : CPU_P9,</a>
+<a name="477"><span class="lineNum"> 477 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="478"><span class="lineNum"> 478 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="479"><span class="lineNum"> 479 </span> : : -1, -1, -1,</a>
+<a name="480"><span class="lineNum"> 480 </span> : : NULL, },</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> : : /*</a>
+<a name="483"><span class="lineNum"> 483 </span> : : * ISAv3.0B hash based MMU, new hash pte format, PCTR, etc</a>
+<a name="484"><span class="lineNum"> 484 </span> : : */</a>
+<a name="485"><span class="lineNum"> 485 </span> : : { &quot;mmu-hash-v3&quot;,</a>
+<a name="486"><span class="lineNum"> 486 </span> : : CPU_P9,</a>
+<a name="487"><span class="lineNum"> 487 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="488"><span class="lineNum"> 488 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="489"><span class="lineNum"> 489 </span> : : -1, -1, -1,</a>
+<a name="490"><span class="lineNum"> 490 </span> : : NULL, },</a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> : : /*</a>
+<a name="493"><span class="lineNum"> 493 </span> : : * ISAv3.0B wait instruction</a>
+<a name="494"><span class="lineNum"> 494 </span> : : */</a>
+<a name="495"><span class="lineNum"> 495 </span> : : { &quot;wait-v3&quot;,</a>
+<a name="496"><span class="lineNum"> 496 </span> : : CPU_P9,</a>
+<a name="497"><span class="lineNum"> 497 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="498"><span class="lineNum"> 498 </span> : : HV_NONE, OS_NONE,</a>
+<a name="499"><span class="lineNum"> 499 </span> : : -1, -1, -1,</a>
+<a name="500"><span class="lineNum"> 500 </span> : : NULL, },</a>
+<a name="501"><span class="lineNum"> 501 </span> : : </a>
+<a name="502"><span class="lineNum"> 502 </span> : : /*</a>
+<a name="503"><span class="lineNum"> 503 </span> : : * ISAv3.0B stop idle instructions and registers</a>
+<a name="504"><span class="lineNum"> 504 </span> : : * XXX: Same question as for idle-nap</a>
+<a name="505"><span class="lineNum"> 505 </span> : : */</a>
+<a name="506"><span class="lineNum"> 506 </span> : : { &quot;idle-stop&quot;,</a>
+<a name="507"><span class="lineNum"> 507 </span> : : CPU_P9,</a>
+<a name="508"><span class="lineNum"> 508 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="509"><span class="lineNum"> 509 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="510"><span class="lineNum"> 510 </span> : : -1, -1, -1,</a>
+<a name="511"><span class="lineNum"> 511 </span> : : NULL, },</a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> : : /*</a>
+<a name="514"><span class="lineNum"> 514 </span> : : * ISAv3.0B Hypervisor Virtualization Interrupt</a>
+<a name="515"><span class="lineNum"> 515 </span> : : * Also associated system registers, LPCR EE, HEIC, HVICE,</a>
+<a name="516"><span class="lineNum"> 516 </span> : : * system reset SRR1 reason, etc.</a>
+<a name="517"><span class="lineNum"> 517 </span> : : */</a>
+<a name="518"><span class="lineNum"> 518 </span> : : { &quot;hypervisor-virtualization-interrupt&quot;,</a>
+<a name="519"><span class="lineNum"> 519 </span> : : CPU_P9,</a>
+<a name="520"><span class="lineNum"> 520 </span> : : ISA_V3_0B, USABLE_HV,</a>
+<a name="521"><span class="lineNum"> 521 </span> : : HV_CUSTOM, OS_NONE,</a>
+<a name="522"><span class="lineNum"> 522 </span> : : -1, -1, -1,</a>
+<a name="523"><span class="lineNum"> 523 </span> : : NULL, },</a>
+<a name="524"><span class="lineNum"> 524 </span> : : </a>
+<a name="525"><span class="lineNum"> 525 </span> : : /*</a>
+<a name="526"><span class="lineNum"> 526 </span> : : * POWER9 MCE / machine check exception.</a>
+<a name="527"><span class="lineNum"> 527 </span> : : */</a>
+<a name="528"><span class="lineNum"> 528 </span> : : { &quot;machine-check-power9&quot;,</a>
+<a name="529"><span class="lineNum"> 529 </span> : : CPU_P9,</a>
+<a name="530"><span class="lineNum"> 530 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="531"><span class="lineNum"> 531 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="532"><span class="lineNum"> 532 </span> : : -1, -1, -1,</a>
+<a name="533"><span class="lineNum"> 533 </span> : : NULL, },</a>
+<a name="534"><span class="lineNum"> 534 </span> : : </a>
+<a name="535"><span class="lineNum"> 535 </span> : : /*</a>
+<a name="536"><span class="lineNum"> 536 </span> : : * POWER9 PMU / performance monitor unit.</a>
+<a name="537"><span class="lineNum"> 537 </span> : : */</a>
+<a name="538"><span class="lineNum"> 538 </span> : : { &quot;performance-monitor-power9&quot;,</a>
+<a name="539"><span class="lineNum"> 539 </span> : : CPU_P9,</a>
+<a name="540"><span class="lineNum"> 540 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="541"><span class="lineNum"> 541 </span> : : HV_CUSTOM, OS_CUSTOM,</a>
+<a name="542"><span class="lineNum"> 542 </span> : : -1, -1, -1,</a>
+<a name="543"><span class="lineNum"> 543 </span> : : NULL, },</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> : : /*</a>
+<a name="546"><span class="lineNum"> 546 </span> : : * ISAv3.0B scv/rfscv system call instructions and exceptions, fscr bit</a>
+<a name="547"><span class="lineNum"> 547 </span> : : * etc.</a>
+<a name="548"><span class="lineNum"> 548 </span> : : */</a>
+<a name="549"><span class="lineNum"> 549 </span> : : { &quot;system-call-vectored&quot;,</a>
+<a name="550"><span class="lineNum"> 550 </span> : : CPU_P9,</a>
+<a name="551"><span class="lineNum"> 551 </span> : : ISA_V3_0B, USABLE_OS|USABLE_PR,</a>
+<a name="552"><span class="lineNum"> 552 </span> : : HV_NONE, OS_CUSTOM,</a>
+<a name="553"><span class="lineNum"> 553 </span> : : -1, PPC_BITLSHIFT(51), 52,</a>
+<a name="554"><span class="lineNum"> 554 </span> : : NULL, },</a>
+<a name="555"><span class="lineNum"> 555 </span> : : </a>
+<a name="556"><span class="lineNum"> 556 </span> : : /*</a>
+<a name="557"><span class="lineNum"> 557 </span> : : * ISAv3.0B Book3S Chapter 10. Processor Control.</a>
+<a name="558"><span class="lineNum"> 558 </span> : : * global msgsnd, msgsndp, msgsync, doorbell, etc.</a>
+<a name="559"><span class="lineNum"> 559 </span> : : */</a>
+<a name="560"><span class="lineNum"> 560 </span> : : { &quot;processor-control-facility-v3&quot;,</a>
+<a name="561"><span class="lineNum"> 561 </span> : : CPU_P9,</a>
+<a name="562"><span class="lineNum"> 562 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="563"><span class="lineNum"> 563 </span> : : HV_CUSTOM, OS_NONE,</a>
+<a name="564"><span class="lineNum"> 564 </span> : : PPC_BITLSHIFT(53), -1, -1,</a>
+<a name="565"><span class="lineNum"> 565 </span> : : NULL, },</a>
+<a name="566"><span class="lineNum"> 566 </span> : : </a>
+<a name="567"><span class="lineNum"> 567 </span> : : /*</a>
+<a name="568"><span class="lineNum"> 568 </span> : : * ISAv3.0B addpcis instruction</a>
+<a name="569"><span class="lineNum"> 569 </span> : : */</a>
+<a name="570"><span class="lineNum"> 570 </span> : : { &quot;pc-relative-addressing&quot;,</a>
+<a name="571"><span class="lineNum"> 571 </span> : : CPU_P9,</a>
+<a name="572"><span class="lineNum"> 572 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="573"><span class="lineNum"> 573 </span> : : HV_NONE, OS_NONE,</a>
+<a name="574"><span class="lineNum"> 574 </span> : : -1, -1, -1,</a>
+<a name="575"><span class="lineNum"> 575 </span> : : NULL, },</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> : : /*</a>
+<a name="578"><span class="lineNum"> 578 </span> : : * ISAv2.07B Book3S Chapter 7. Timer Facilities</a>
+<a name="579"><span class="lineNum"> 579 </span> : : * TB, VTB, DEC, HDEC, IC, etc registers and exceptions.</a>
+<a name="580"><span class="lineNum"> 580 </span> : : * Not including PURR or SPURR registers.</a>
+<a name="581"><span class="lineNum"> 581 </span> : : */</a>
+<a name="582"><span class="lineNum"> 582 </span> : : { &quot;timer-facilities&quot;,</a>
+<a name="583"><span class="lineNum"> 583 </span> : : CPU_ALL,</a>
+<a name="584"><span class="lineNum"> 584 </span> : : ISA_BASE, USABLE_HV|USABLE_OS,</a>
+<a name="585"><span class="lineNum"> 585 </span> : : HV_NONE, OS_NONE,</a>
+<a name="586"><span class="lineNum"> 586 </span> : : -1, -1, -1,</a>
+<a name="587"><span class="lineNum"> 587 </span> : : NULL, },</a>
+<a name="588"><span class="lineNum"> 588 </span> : : </a>
+<a name="589"><span class="lineNum"> 589 </span> : : /*</a>
+<a name="590"><span class="lineNum"> 590 </span> : : * ISAv3.0B Book3S Chapter 7. Timer Facilities</a>
+<a name="591"><span class="lineNum"> 591 </span> : : * Large decrementer and hypervisor decrementer</a>
+<a name="592"><span class="lineNum"> 592 </span> : : */</a>
+<a name="593"><span class="lineNum"> 593 </span> : : { &quot;timer-facilities-v3&quot;,</a>
+<a name="594"><span class="lineNum"> 594 </span> : : CPU_P9,</a>
+<a name="595"><span class="lineNum"> 595 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="596"><span class="lineNum"> 596 </span> : : HV_NONE, OS_NONE,</a>
+<a name="597"><span class="lineNum"> 597 </span> : : -1, -1, -1,</a>
+<a name="598"><span class="lineNum"> 598 </span> : : &quot;timer-facilities&quot;, },</a>
+<a name="599"><span class="lineNum"> 599 </span> : : </a>
+<a name="600"><span class="lineNum"> 600 </span> : : /*</a>
+<a name="601"><span class="lineNum"> 601 </span> : : * ISAv3.0B deliver a random number instruction (darn)</a>
+<a name="602"><span class="lineNum"> 602 </span> : : */</a>
+<a name="603"><span class="lineNum"> 603 </span> : : { &quot;random-number-generator&quot;,</a>
+<a name="604"><span class="lineNum"> 604 </span> : : CPU_P9,</a>
+<a name="605"><span class="lineNum"> 605 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="606"><span class="lineNum"> 606 </span> : : HV_NONE, OS_NONE,</a>
+<a name="607"><span class="lineNum"> 607 </span> : : -1, -1, 53,</a>
+<a name="608"><span class="lineNum"> 608 </span> : : NULL, },</a>
+<a name="609"><span class="lineNum"> 609 </span> : : </a>
+<a name="610"><span class="lineNum"> 610 </span> : : /*</a>
+<a name="611"><span class="lineNum"> 611 </span> : : * ISAv3.0B fixed point instructions and registers</a>
+<a name="612"><span class="lineNum"> 612 </span> : : * multiply-add, modulo, count trailing zeroes, cmprb, cmpeqb,</a>
+<a name="613"><span class="lineNum"> 613 </span> : : * extswsli, mfvsrld, mtvsrdd, mtvsrws, addex, CA32, OV32,</a>
+<a name="614"><span class="lineNum"> 614 </span> : : * mcrxrx, setb</a>
+<a name="615"><span class="lineNum"> 615 </span> : : */</a>
+<a name="616"><span class="lineNum"> 616 </span> : : { &quot;fixed-point-v3&quot;,</a>
+<a name="617"><span class="lineNum"> 617 </span> : : CPU_P9,</a>
+<a name="618"><span class="lineNum"> 618 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="619"><span class="lineNum"> 619 </span> : : HV_NONE, OS_NONE,</a>
+<a name="620"><span class="lineNum"> 620 </span> : : -1, -1, -1,</a>
+<a name="621"><span class="lineNum"> 621 </span> : : NULL, },</a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> : : { &quot;decimal-integer-v3&quot;,</a>
+<a name="624"><span class="lineNum"> 624 </span> : : CPU_P9,</a>
+<a name="625"><span class="lineNum"> 625 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="626"><span class="lineNum"> 626 </span> : : HV_NONE, OS_NONE,</a>
+<a name="627"><span class="lineNum"> 627 </span> : : -1, -1, -1,</a>
+<a name="628"><span class="lineNum"> 628 </span> : : &quot;fixed-point-v3 decimal-integer&quot;, },</a>
+<a name="629"><span class="lineNum"> 629 </span> : : </a>
+<a name="630"><span class="lineNum"> 630 </span> : : /*</a>
+<a name="631"><span class="lineNum"> 631 </span> : : * ISAv3.0B lightweight mffs</a>
+<a name="632"><span class="lineNum"> 632 </span> : : */</a>
+<a name="633"><span class="lineNum"> 633 </span> : : { &quot;floating-point-v3&quot;,</a>
+<a name="634"><span class="lineNum"> 634 </span> : : CPU_P9,</a>
+<a name="635"><span class="lineNum"> 635 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="636"><span class="lineNum"> 636 </span> : : HV_NONE, OS_NONE,</a>
+<a name="637"><span class="lineNum"> 637 </span> : : -1, -1, -1,</a>
+<a name="638"><span class="lineNum"> 638 </span> : : &quot;floating-point&quot;, },</a>
+<a name="639"><span class="lineNum"> 639 </span> : : </a>
+<a name="640"><span class="lineNum"> 640 </span> : : { &quot;decimal-floating-point-v3&quot;,</a>
+<a name="641"><span class="lineNum"> 641 </span> : : CPU_P9,</a>
+<a name="642"><span class="lineNum"> 642 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="643"><span class="lineNum"> 643 </span> : : HV_NONE, OS_NONE,</a>
+<a name="644"><span class="lineNum"> 644 </span> : : -1, -1, -1,</a>
+<a name="645"><span class="lineNum"> 645 </span> : : &quot;floating-point-v3 decimal-floating-point&quot;, },</a>
+<a name="646"><span class="lineNum"> 646 </span> : : </a>
+<a name="647"><span class="lineNum"> 647 </span> : : { &quot;vector-v3&quot;,</a>
+<a name="648"><span class="lineNum"> 648 </span> : : CPU_P9,</a>
+<a name="649"><span class="lineNum"> 649 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="650"><span class="lineNum"> 650 </span> : : HV_NONE, OS_NONE,</a>
+<a name="651"><span class="lineNum"> 651 </span> : : -1, -1, -1,</a>
+<a name="652"><span class="lineNum"> 652 </span> : : &quot;vector&quot;, },</a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> : : { &quot;vector-scalar-v3&quot;,</a>
+<a name="655"><span class="lineNum"> 655 </span> : : CPU_P9,</a>
+<a name="656"><span class="lineNum"> 656 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="657"><span class="lineNum"> 657 </span> : : HV_NONE, OS_NONE,</a>
+<a name="658"><span class="lineNum"> 658 </span> : : -1, -1, -1,</a>
+<a name="659"><span class="lineNum"> 659 </span> : : &quot;vector-v3 vector-scalar&quot; },</a>
+<a name="660"><span class="lineNum"> 660 </span> : : </a>
+<a name="661"><span class="lineNum"> 661 </span> : : { &quot;vector-binary128&quot;,</a>
+<a name="662"><span class="lineNum"> 662 </span> : : CPU_P9,</a>
+<a name="663"><span class="lineNum"> 663 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="664"><span class="lineNum"> 664 </span> : : HV_NONE, OS_NONE,</a>
+<a name="665"><span class="lineNum"> 665 </span> : : -1, -1, 54,</a>
+<a name="666"><span class="lineNum"> 666 </span> : : &quot;vector-scalar-v3&quot;, },</a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> : : { &quot;vector-binary16&quot;,</a>
+<a name="669"><span class="lineNum"> 669 </span> : : CPU_P9,</a>
+<a name="670"><span class="lineNum"> 670 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="671"><span class="lineNum"> 671 </span> : : HV_NONE, OS_NONE,</a>
+<a name="672"><span class="lineNum"> 672 </span> : : -1, -1, -1,</a>
+<a name="673"><span class="lineNum"> 673 </span> : : &quot;vector-v3&quot;, },</a>
+<a name="674"><span class="lineNum"> 674 </span> : : </a>
+<a name="675"><span class="lineNum"> 675 </span> : : /*</a>
+<a name="676"><span class="lineNum"> 676 </span> : : * ISAv3.0B external exception for EBB</a>
+<a name="677"><span class="lineNum"> 677 </span> : : */</a>
+<a name="678"><span class="lineNum"> 678 </span> : : { &quot;event-based-branch-v3&quot;,</a>
+<a name="679"><span class="lineNum"> 679 </span> : : CPU_P9,</a>
+<a name="680"><span class="lineNum"> 680 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="681"><span class="lineNum"> 681 </span> : : HV_NONE, OS_NONE,</a>
+<a name="682"><span class="lineNum"> 682 </span> : : -1, -1, -1,</a>
+<a name="683"><span class="lineNum"> 683 </span> : : &quot;event-based-branch&quot;, },</a>
+<a name="684"><span class="lineNum"> 684 </span> : : </a>
+<a name="685"><span class="lineNum"> 685 </span> : : /*</a>
+<a name="686"><span class="lineNum"> 686 </span> : : * ISAv3.0B Atomic Memory Operations (AMO)</a>
+<a name="687"><span class="lineNum"> 687 </span> : : */</a>
+<a name="688"><span class="lineNum"> 688 </span> : : { &quot;atomic-memory-operations&quot;,</a>
+<a name="689"><span class="lineNum"> 689 </span> : : CPU_P9,</a>
+<a name="690"><span class="lineNum"> 690 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="691"><span class="lineNum"> 691 </span> : : HV_NONE, OS_NONE,</a>
+<a name="692"><span class="lineNum"> 692 </span> : : -1, -1, -1,</a>
+<a name="693"><span class="lineNum"> 693 </span> : : NULL, },</a>
+<a name="694"><span class="lineNum"> 694 </span> : : </a>
+<a name="695"><span class="lineNum"> 695 </span> : : /*</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * ISAv3.0B Copy-Paste Facility</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> : : { &quot;copy-paste&quot;,</a>
+<a name="699"><span class="lineNum"> 699 </span> : : CPU_P9,</a>
+<a name="700"><span class="lineNum"> 700 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS|USABLE_PR,</a>
+<a name="701"><span class="lineNum"> 701 </span> : : HV_NONE, OS_NONE,</a>
+<a name="702"><span class="lineNum"> 702 </span> : : -1, -1, -1,</a>
+<a name="703"><span class="lineNum"> 703 </span> : : NULL, },</a>
+<a name="704"><span class="lineNum"> 704 </span> : : </a>
+<a name="705"><span class="lineNum"> 705 </span> : : /*</a>
+<a name="706"><span class="lineNum"> 706 </span> : : * ISAv3.0B GSR SPR register</a>
+<a name="707"><span class="lineNum"> 707 </span> : : * POWER9 does not implement it</a>
+<a name="708"><span class="lineNum"> 708 </span> : : */</a>
+<a name="709"><span class="lineNum"> 709 </span> : : { &quot;group-start-register&quot;,</a>
+<a name="710"><span class="lineNum"> 710 </span> : : 0,</a>
+<a name="711"><span class="lineNum"> 711 </span> : : ISA_V3_0B, USABLE_HV|USABLE_OS,</a>
+<a name="712"><span class="lineNum"> 712 </span> : : HV_NONE, OS_NONE,</a>
+<a name="713"><span class="lineNum"> 713 </span> : : -1, -1, -1,</a>
+<a name="714"><span class="lineNum"> 714 </span> : : NULL, },</a>
+<a name="715"><span class="lineNum"> 715 </span> : : </a>
+<a name="716"><span class="lineNum"> 716 </span> : : /*</a>
+<a name="717"><span class="lineNum"> 717 </span> : : * Due to hardware bugs in POWER9, the hypervisor needs to assist</a>
+<a name="718"><span class="lineNum"> 718 </span> : : * guests.</a>
+<a name="719"><span class="lineNum"> 719 </span> : : *</a>
+<a name="720"><span class="lineNum"> 720 </span> : : * Presence of this feature indicates presence of the bug.</a>
+<a name="721"><span class="lineNum"> 721 </span> : : *</a>
+<a name="722"><span class="lineNum"> 722 </span> : : * See linux kernel commit 4bb3c7a0208f</a>
+<a name="723"><span class="lineNum"> 723 </span> : : * and linux Documentation/powerpc/transactional_memory.txt</a>
+<a name="724"><span class="lineNum"> 724 </span> : : */</a>
+<a name="725"><span class="lineNum"> 725 </span> : : { &quot;tm-suspend-hypervisor-assist&quot;,</a>
+<a name="726"><span class="lineNum"> 726 </span> : : CPU_P9_DD2_2|CPU_P9_DD2_3|CPU_P9P,</a>
+<a name="727"><span class="lineNum"> 727 </span> : : ISA_V3_0B, USABLE_HV,</a>
+<a name="728"><span class="lineNum"> 728 </span> : : HV_CUSTOM, OS_NONE,</a>
+<a name="729"><span class="lineNum"> 729 </span> : : -1, -1, -1,</a>
+<a name="730"><span class="lineNum"> 730 </span> : : NULL, },</a>
+<a name="731"><span class="lineNum"> 731 </span> : : </a>
+<a name="732"><span class="lineNum"> 732 </span> : : /*</a>
+<a name="733"><span class="lineNum"> 733 </span> : : * Due to hardware bugs in POWER9, the hypervisor can hit</a>
+<a name="734"><span class="lineNum"> 734 </span> : : * CPU bugs in the operations it needs to do for</a>
+<a name="735"><span class="lineNum"> 735 </span> : : * tm-suspend-hypervisor-assist.</a>
+<a name="736"><span class="lineNum"> 736 </span> : : *</a>
+<a name="737"><span class="lineNum"> 737 </span> : : * Presence of this &quot;feature&quot; means processor is affected by the bug.</a>
+<a name="738"><span class="lineNum"> 738 </span> : : *</a>
+<a name="739"><span class="lineNum"> 739 </span> : : * See linux kernel commit 4bb3c7a0208f</a>
+<a name="740"><span class="lineNum"> 740 </span> : : * and linux Documentation/powerpc/transactional_memory.txt</a>
+<a name="741"><span class="lineNum"> 741 </span> : : */</a>
+<a name="742"><span class="lineNum"> 742 </span> : : { &quot;tm-suspend-xer-so-bug&quot;,</a>
+<a name="743"><span class="lineNum"> 743 </span> : : CPU_P9_DD2_2,</a>
+<a name="744"><span class="lineNum"> 744 </span> : : ISA_V3_0B, USABLE_HV,</a>
+<a name="745"><span class="lineNum"> 745 </span> : : HV_CUSTOM, OS_NONE,</a>
+<a name="746"><span class="lineNum"> 746 </span> : : -1, -1, -1,</a>
+<a name="747"><span class="lineNum"> 747 </span> : : NULL, },</a>
+<a name="748"><span class="lineNum"> 748 </span> : : };</a>
+<a name="749"><span class="lineNum"> 749 </span> : : </a>
+<a name="750"><span class="lineNum"> 750 </span> :<span class="lineCov"> 432 : static void add_cpu_feature_nodeps(struct dt_node *features,</span></a>
+<a name="751"><span class="lineNum"> 751 </span> : : const struct cpu_feature *f)</a>
+<a name="752"><span class="lineNum"> 752 </span> : : {</a>
+<a name="753"><span class="lineNum"> 753 </span> : : struct dt_node *feature;</a>
+<a name="754"><span class="lineNum"> 754 </span> : : </a>
+<a name="755"><span class="lineNum"> 755 </span> :<span class="lineCov"> 432 : feature = dt_new(features, f-&gt;name);</span></a>
+<a name="756"><span class="lineNum"> 756 </span> :<span class="lineCov"> 432 : assert(feature);</span></a>
+<a name="757"><span class="lineNum"> 757 </span> : : </a>
+<a name="758"><span class="lineNum"> 758 </span> :<span class="lineCov"> 432 : dt_add_property_cells(feature, &quot;isa&quot;, f-&gt;isa);</span></a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineCov"> 432 : dt_add_property_cells(feature, &quot;usable-privilege&quot;, f-&gt;usable_privilege);</span></a>
+<a name="760"><span class="lineNum"> 760 </span> : : </a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineCov"> 432 : if (f-&gt;usable_privilege &amp; USABLE_HV) {</span></a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineCov"> 427 : if (f-&gt;hv_support != HV_NONE) {</span></a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 287 : uint32_t s = 0;</span></a>
+<a name="764"><span class="lineNum"> 764 </span> :<span class="lineCov"> 287 : if (f-&gt;hv_support == HV_HFSCR)</span></a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineNoCov"> 0 : s |= HV_SUPPORT_HFSCR;</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : </a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineCov"> 287 : dt_add_property_cells(feature, &quot;hv-support&quot;, s);</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineCov"> 287 : if (f-&gt;hfscr_bit_nr != -1)</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineCov"> 70 : dt_add_property_cells(feature, &quot;hfscr-bit-nr&quot;, f-&gt;hfscr_bit_nr);</span></a>
+<a name="770"><span class="lineNum"> 770 </span> : : } else {</a>
+<a name="771"><span class="lineNum"> 771 </span> :<span class="lineCov"> 140 : assert(f-&gt;hfscr_bit_nr == -1);</span></a>
+<a name="772"><span class="lineNum"> 772 </span> : : }</a>
+<a name="773"><span class="lineNum"> 773 </span> : : }</a>
+<a name="774"><span class="lineNum"> 774 </span> : : </a>
+<a name="775"><span class="lineNum"> 775 </span> :<span class="lineCov"> 432 : if (f-&gt;usable_privilege &amp; USABLE_OS) {</span></a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineCov"> 408 : if (f-&gt;os_support != OS_NONE) {</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 263 : uint32_t s = 0;</span></a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineCov"> 263 : if (f-&gt;os_support == OS_FSCR)</span></a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : s |= OS_SUPPORT_FSCR;</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 263 : dt_add_property_cells(feature, &quot;os-support&quot;, s);</span></a>
+<a name="781"><span class="lineNum"> 781 </span> :<span class="lineCov"> 263 : if (f-&gt;fscr_bit_nr != -1)</span></a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 35 : dt_add_property_cells(feature, &quot;fscr-bit-nr&quot;, f-&gt;fscr_bit_nr);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : } else {</a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 145 : assert(f-&gt;fscr_bit_nr == -1);</span></a>
+<a name="785"><span class="lineNum"> 785 </span> : : }</a>
+<a name="786"><span class="lineNum"> 786 </span> : : }</a>
+<a name="787"><span class="lineNum"> 787 </span> : : </a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineCov"> 432 : if (f-&gt;usable_privilege &amp; USABLE_PR) {</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 255 : if (f-&gt;hwcap_bit_nr != -1)</span></a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineCov"> 110 : dt_add_property_cells(feature, &quot;hwcap-bit-nr&quot;, f-&gt;hwcap_bit_nr);</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : }</a>
+<a name="792"><span class="lineNum"> 792 </span> : : </a>
+<a name="793"><span class="lineNum"> 793 </span> :<span class="lineCov"> 432 : if (f-&gt;dependencies_names)</span></a>
+<a name="794"><span class="lineNum"> 794 </span> :<span class="lineCov"> 110 : dt_add_property(feature, &quot;dependencies&quot;, NULL, 0);</span></a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineCov"> 432 : }</span></a>
+<a name="796"><span class="lineNum"> 796 </span> : : </a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineCov"> 10 : static void add_cpufeatures_dependencies(struct dt_node *features)</span></a>
+<a name="798"><span class="lineNum"> 798 </span> : : {</a>
+<a name="799"><span class="lineNum"> 799 </span> : : struct dt_node *feature;</a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineCov"> 442 : dt_for_each_node(features, feature) {</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineCov"> 432 : const struct cpu_feature *f = NULL;</span></a>
+<a name="803"><span class="lineNum"> 803 </span> : : const char *deps_names;</a>
+<a name="804"><span class="lineNum"> 804 </span> : : struct dt_property *deps;</a>
+<a name="805"><span class="lineNum"> 805 </span> : : int nr_deps;</a>
+<a name="806"><span class="lineNum"> 806 </span> : : int i;</a>
+<a name="807"><span class="lineNum"> 807 </span> : : </a>
+<a name="808"><span class="lineNum"> 808 </span> : : /* Find features with dependencies */</a>
+<a name="809"><span class="lineNum"> 809 </span> : : </a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineCov"> 432 : deps = __dt_find_property(feature, &quot;dependencies&quot;);</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineCov"> 432 : if (!deps)</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineCov"> 322 : continue;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : </a>
+<a name="814"><span class="lineNum"> 814 </span> : : /* Find the matching cpu table */</a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineCov"> 3580 : for (i = 0; i &lt; ARRAY_SIZE(cpu_features_table); i++) {</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineCov"> 3580 : f = &amp;cpu_features_table[i];</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 3580 : if (!strcmp(f-&gt;name, feature-&gt;name))</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 110 : break;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : }</a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineCov"> 110 : assert(f);</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 110 : assert(f-&gt;dependencies_names);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> : : </a>
+<a name="823"><span class="lineNum"> 823 </span> : : /*</a>
+<a name="824"><span class="lineNum"> 824 </span> : : * Count number of depended features and allocate space</a>
+<a name="825"><span class="lineNum"> 825 </span> : : * for phandles in the property.</a>
+<a name="826"><span class="lineNum"> 826 </span> : : */</a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineCov"> 110 : deps_names = f-&gt;dependencies_names;</span></a>
+<a name="828"><span class="lineNum"> 828 </span> :<span class="lineCov"> 110 : nr_deps = strcount(deps_names, &quot; &quot;) + 1;</span></a>
+<a name="829"><span class="lineNum"> 829 </span> :<span class="lineCov"> 110 : dt_resize_property(&amp;deps, nr_deps * sizeof(u32));</span></a>
+<a name="830"><span class="lineNum"> 830 </span> : : </a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineCov"> 110 : DBG(&quot;feature %s has %d dependencies (%s)\n&quot;, f-&gt;name, nr_deps, deps_names);</span></a>
+<a name="832"><span class="lineNum"> 832 </span> : : /*</a>
+<a name="833"><span class="lineNum"> 833 </span> : : * For each one, find the depended feature then advance to</a>
+<a name="834"><span class="lineNum"> 834 </span> : : * next name.</a>
+<a name="835"><span class="lineNum"> 835 </span> : : */</a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineCov"> 235 : for (i = 0; i &lt; nr_deps; i++) {</span></a>
+<a name="837"><span class="lineNum"> 837 </span> : : struct dt_node *dep;</a>
+<a name="838"><span class="lineNum"> 838 </span> : : int len;</a>
+<a name="839"><span class="lineNum"> 839 </span> : : </a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineCov"> 125 : if (nr_deps - i == 1)</span></a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 110 : len = strlen(deps_names);</span></a>
+<a name="842"><span class="lineNum"> 842 </span> : : else</a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineCov"> 15 : len = strchr(deps_names, ' ') - deps_names;</span></a>
+<a name="844"><span class="lineNum"> 844 </span> : : </a>
+<a name="845"><span class="lineNum"> 845 </span> :<span class="lineCov"> 3212 : dt_for_each_node(features, dep) {</span></a>
+<a name="846"><span class="lineNum"> 846 </span> :<span class="lineCov"> 3212 : if (!strncmp(deps_names, dep-&gt;name, len))</span></a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineCov"> 125 : goto found_dep;</span></a>
+<a name="848"><span class="lineNum"> 848 </span> : : }</a>
+<a name="849"><span class="lineNum"> 849 </span> : : </a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;CPUFT: feature %s dependencies not found\n&quot;, f-&gt;name);</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineCov"> 125 : found_dep:</span></a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineCov"> 125 : DBG(&quot; %s found dep (%s)\n&quot;, f-&gt;name, dep-&gt;name);</span></a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineCov"> 125 : dt_property_set_cell(deps, i, dep-&gt;phandle);</span></a>
+<a name="855"><span class="lineNum"> 855 </span> : : </a>
+<a name="856"><span class="lineNum"> 856 </span> : : /* Advance over the name + delimiter */</a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineCov"> 125 : deps_names += len + 1;</span></a>
+<a name="858"><span class="lineNum"> 858 </span> : : }</a>
+<a name="859"><span class="lineNum"> 859 </span> : : }</a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="861"><span class="lineNum"> 861 </span> : : </a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineCov"> 10 : static void add_cpufeatures(struct dt_node *cpus,</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : uint32_t cpu_feature_isa, uint32_t cpu_feature_cpu,</a>
+<a name="864"><span class="lineNum"> 864 </span> : : const char *cpu_name)</a>
+<a name="865"><span class="lineNum"> 865 </span> : : {</a>
+<a name="866"><span class="lineNum"> 866 </span> : : struct dt_node *features;</a>
+<a name="867"><span class="lineNum"> 867 </span> : : int i;</a>
+<a name="868"><span class="lineNum"> 868 </span> : : </a>
+<a name="869"><span class="lineNum"> 869 </span> :<span class="lineCov"> 10 : DBG(&quot;creating cpufeatures for cpu:%d isa:%d\n&quot;, cpu_feature_cpu, cpu_feature_isa);</span></a>
+<a name="870"><span class="lineNum"> 870 </span> : : </a>
+<a name="871"><span class="lineNum"> 871 </span> :<span class="lineCov"> 10 : features = dt_new(cpus, &quot;ibm,powerpc-cpu-features&quot;);</span></a>
+<a name="872"><span class="lineNum"> 872 </span> :<span class="lineCov"> 10 : assert(features);</span></a>
+<a name="873"><span class="lineNum"> 873 </span> : : </a>
+<a name="874"><span class="lineNum"> 874 </span> :<span class="lineCov"> 10 : dt_add_property_cells(features, &quot;isa&quot;, cpu_feature_isa);</span></a>
+<a name="875"><span class="lineNum"> 875 </span> : : </a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineCov"> 10 : dt_add_property_string(features, &quot;device_type&quot;, &quot;cpu-features&quot;);</span></a>
+<a name="877"><span class="lineNum"> 877 </span> :<span class="lineCov"> 10 : dt_add_property_string(features, &quot;compatible&quot;, &quot;ibm,powerpc-cpu-features&quot;);</span></a>
+<a name="878"><span class="lineNum"> 878 </span> :<span class="lineCov"> 10 : dt_add_property_string(features, &quot;display-name&quot;, cpu_name);</span></a>
+<a name="879"><span class="lineNum"> 879 </span> : : </a>
+<a name="880"><span class="lineNum"> 880 </span> : : /* add without dependencies */</a>
+<a name="881"><span class="lineNum"> 881 </span> :<span class="lineCov"> 650 : for (i = 0; i &lt; ARRAY_SIZE(cpu_features_table); i++) {</span></a>
+<a name="882"><span class="lineNum"> 882 </span> :<span class="lineCov"> 640 : const struct cpu_feature *f = &amp;cpu_features_table[i];</span></a>
+<a name="883"><span class="lineNum"> 883 </span> : : </a>
+<a name="884"><span class="lineNum"> 884 </span> :<span class="lineCov"> 640 : if (f-&gt;cpus_supported &amp; cpu_feature_cpu) {</span></a>
+<a name="885"><span class="lineNum"> 885 </span> :<span class="lineCov"> 432 : DBG(&quot; '%s'\n&quot;, f-&gt;name);</span></a>
+<a name="886"><span class="lineNum"> 886 </span> :<span class="lineCov"> 432 : add_cpu_feature_nodeps(features, f);</span></a>
+<a name="887"><span class="lineNum"> 887 </span> : : }</a>
+<a name="888"><span class="lineNum"> 888 </span> : : }</a>
+<a name="889"><span class="lineNum"> 889 </span> : : </a>
+<a name="890"><span class="lineNum"> 890 </span> : : /* dependency construction pass */</a>
+<a name="891"><span class="lineNum"> 891 </span> :<span class="lineCov"> 10 : add_cpufeatures_dependencies(features);</span></a>
+<a name="892"><span class="lineNum"> 892 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="893"><span class="lineNum"> 893 </span> : : </a>
+<a name="894"><span class="lineNum"> 894 </span> :<span class="lineCov"> 11 : void dt_add_cpufeatures(struct dt_node *root)</span></a>
+<a name="895"><span class="lineNum"> 895 </span> : : {</a>
+<a name="896"><span class="lineNum"> 896 </span> : : int version;</a>
+<a name="897"><span class="lineNum"> 897 </span> :<span class="lineCov"> 11 : uint32_t cpu_feature_isa = 0;</span></a>
+<a name="898"><span class="lineNum"> 898 </span> :<span class="lineCov"> 11 : uint32_t cpu_feature_cpu = 0;</span></a>
+<a name="899"><span class="lineNum"> 899 </span> : : struct dt_node *cpus;</a>
+<a name="900"><span class="lineNum"> 900 </span> :<span class="lineCov"> 11 : const char *cpu_name = NULL;</span></a>
+<a name="901"><span class="lineNum"> 901 </span> : : </a>
+<a name="902"><span class="lineNum"> 902 </span> :<span class="lineCov"> 11 : version = mfspr(SPR_PVR);</span></a>
+<a name="903"><span class="lineNum"> 903 </span> :<span class="lineCov"> 11 : switch(PVR_TYPE(version)) {</span></a>
+<a name="904"><span class="lineNum"> 904 </span> :<span class="lineCov"> 2 : case PVR_TYPE_P8:</span></a>
+<a name="905"><span class="lineNum"> 905 </span> :<span class="lineCov"> 2 : if (!cpu_name)</span></a>
+<a name="906"><span class="lineNum"> 906 </span> :<span class="lineCov"> 2 : cpu_name = &quot;POWER8&quot;;</span></a>
+<a name="907"><span class="lineNum"> 907 </span> : : /* fallthrough */</a>
+<a name="908"><span class="lineNum"> 908 </span> : : case PVR_TYPE_P8E:</a>
+<a name="909"><span class="lineNum"> 909 </span> :<span class="lineCov"> 4 : if (!cpu_name)</span></a>
+<a name="910"><span class="lineNum"> 910 </span> :<span class="lineCov"> 2 : cpu_name = &quot;POWER8E&quot;;</span></a>
+<a name="911"><span class="lineNum"> 911 </span> : : /* fallthrough */</a>
+<a name="912"><span class="lineNum"> 912 </span> :<span class="lineCov"> 4 : cpu_feature_isa = ISA_V2_07B;</span></a>
+<a name="913"><span class="lineNum"> 913 </span> :<span class="lineCov"> 4 : if (PVR_VERS_MAJ(version) == 1)</span></a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineCov"> 2 : cpu_feature_cpu = CPU_P8_DD1;</span></a>
+<a name="915"><span class="lineNum"> 915 </span> : : else</a>
+<a name="916"><span class="lineNum"> 916 </span> :<span class="lineCov"> 2 : cpu_feature_cpu = CPU_P8_DD2;</span></a>
+<a name="917"><span class="lineNum"> 917 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="918"><span class="lineNum"> 918 </span> :<span class="lineCov"> 1 : case PVR_TYPE_P8NVL:</span></a>
+<a name="919"><span class="lineNum"> 919 </span> :<span class="lineCov"> 1 : cpu_name = &quot;POWER8NVL&quot;;</span></a>
+<a name="920"><span class="lineNum"> 920 </span> :<span class="lineCov"> 1 : cpu_feature_isa = ISA_V2_07B;</span></a>
+<a name="921"><span class="lineNum"> 921 </span> :<span class="lineCov"> 1 : cpu_feature_cpu = CPU_P8_DD2;</span></a>
+<a name="922"><span class="lineNum"> 922 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="923"><span class="lineNum"> 923 </span> :<span class="lineCov"> 4 : case PVR_TYPE_P9:</span></a>
+<a name="924"><span class="lineNum"> 924 </span> :<span class="lineCov"> 4 : if (!cpu_name)</span></a>
+<a name="925"><span class="lineNum"> 925 </span> :<span class="lineCov"> 4 : cpu_name = &quot;POWER9&quot;;</span></a>
+<a name="926"><span class="lineNum"> 926 </span> : : </a>
+<a name="927"><span class="lineNum"> 927 </span> :<span class="lineCov"> 4 : cpu_feature_isa = ISA_V3_0B;</span></a>
+<a name="928"><span class="lineNum"> 928 </span> :<span class="lineCov"> 4 : if (is_power9n(version) &amp;&amp;</span></a>
+<a name="929"><span class="lineNum"> 929 </span> :<span class="lineCov"> 4 : (PVR_VERS_MAJ(version) == 2)) {</span></a>
+<a name="930"><span class="lineNum"> 930 </span> : : /* P9N DD2.x */</a>
+<a name="931"><span class="lineNum"> 931 </span> :<span class="lineCov"> 8 : switch (PVR_VERS_MIN(version)) {</span></a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineCov"> 2 : case 0:</span></a>
+<a name="933"><span class="lineNum"> 933 </span> : : case 1:</a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineCov"> 2 : cpu_feature_cpu = CPU_P9_DD2_0_1;</span></a>
+<a name="935"><span class="lineNum"> 935 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="936"><span class="lineNum"> 936 </span> :<span class="lineCov"> 1 : case 2:</span></a>
+<a name="937"><span class="lineNum"> 937 </span> :<span class="lineCov"> 1 : cpu_feature_cpu = CPU_P9_DD2_2;</span></a>
+<a name="938"><span class="lineNum"> 938 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineCov"> 1 : case 3:</span></a>
+<a name="940"><span class="lineNum"> 940 </span> :<span class="lineCov"> 1 : cpu_feature_cpu = CPU_P9_DD2_3;</span></a>
+<a name="941"><span class="lineNum"> 941 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="942"><span class="lineNum"> 942 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="943"><span class="lineNum"> 943 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="944"><span class="lineNum"> 944 </span> : : }</a>
+<a name="945"><span class="lineNum"> 945 </span> :<span class="lineNoCov"> 0 : } else if (is_power9c(version) &amp;&amp;</span></a>
+<a name="946"><span class="lineNum"> 946 </span> :<span class="lineNoCov"> 0 : (PVR_VERS_MAJ(version) == 1)) {</span></a>
+<a name="947"><span class="lineNum"> 947 </span> : : /* P9C DD1.x */</a>
+<a name="948"><span class="lineNum"> 948 </span> :<span class="lineNoCov"> 0 : switch (PVR_VERS_MIN(version)) {</span></a>
+<a name="949"><span class="lineNum"> 949 </span> :<span class="lineNoCov"> 0 : case 1:</span></a>
+<a name="950"><span class="lineNum"> 950 </span> : : /* Cumulus DD1.1 =&gt; Nimbus DD2.1 */</a>
+<a name="951"><span class="lineNum"> 951 </span> :<span class="lineNoCov"> 0 : cpu_feature_cpu = CPU_P9_DD2_0_1;</span></a>
+<a name="952"><span class="lineNum"> 952 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="953"><span class="lineNum"> 953 </span> :<span class="lineNoCov"> 0 : case 2:</span></a>
+<a name="954"><span class="lineNum"> 954 </span> : : /* Cumulus DD1.2 */</a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineNoCov"> 0 : cpu_feature_cpu = CPU_P9_DD2_2;</span></a>
+<a name="956"><span class="lineNum"> 956 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="957"><span class="lineNum"> 957 </span> :<span class="lineNoCov"> 0 : case 3:</span></a>
+<a name="958"><span class="lineNum"> 958 </span> : : /* Cumulus DD1.3 */</a>
+<a name="959"><span class="lineNum"> 959 </span> :<span class="lineNoCov"> 0 : cpu_feature_cpu = CPU_P9_DD2_3;</span></a>
+<a name="960"><span class="lineNum"> 960 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="961"><span class="lineNum"> 961 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="962"><span class="lineNum"> 962 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="963"><span class="lineNum"> 963 </span> : : }</a>
+<a name="964"><span class="lineNum"> 964 </span> : : } else {</a>
+<a name="965"><span class="lineNum"> 965 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="966"><span class="lineNum"> 966 </span> : : }</a>
+<a name="967"><span class="lineNum"> 967 </span> : : </a>
+<a name="968"><span class="lineNum"> 968 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineCov"> 1 : case PVR_TYPE_P9P:</span></a>
+<a name="970"><span class="lineNum"> 970 </span> :<span class="lineCov"> 1 : if (!cpu_name)</span></a>
+<a name="971"><span class="lineNum"> 971 </span> :<span class="lineCov"> 1 : cpu_name = &quot;POWER9P&quot;;</span></a>
+<a name="972"><span class="lineNum"> 972 </span> : : </a>
+<a name="973"><span class="lineNum"> 973 </span> :<span class="lineCov"> 1 : cpu_feature_isa = ISA_V3_0B;</span></a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 1 : cpu_feature_cpu = CPU_P9P;</span></a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="976"><span class="lineNum"> 976 </span> :<span class="lineCov"> 1 : default:</span></a>
+<a name="977"><span class="lineNum"> 977 </span> :<span class="lineCov"> 1 : return;</span></a>
+<a name="978"><span class="lineNum"> 978 </span> : : }</a>
+<a name="979"><span class="lineNum"> 979 </span> : : </a>
+<a name="980"><span class="lineNum"> 980 </span> :<span class="lineCov"> 10 : cpus = dt_new_check(root, &quot;cpus&quot;);</span></a>
+<a name="981"><span class="lineNum"> 981 </span> : : </a>
+<a name="982"><span class="lineNum"> 982 </span> :<span class="lineCov"> 10 : add_cpufeatures(cpus, cpu_feature_isa, cpu_feature_cpu, cpu_name);</span></a>
+<a name="983"><span class="lineNum"> 983 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/device.c.func-sort-c.html b/coverage-report/core/device.c.func-sort-c.html
new file mode 100644
index 0000000..3aab797
--- /dev/null
+++ b/coverage-report/core/device.c.func-sort-c.html
@@ -0,0 +1,349 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/device.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - device.c<span style="font-size: 80%;"> (<a href="device.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">471</td>
+ <td class="headerCovTableEntry">555</td>
+ <td class="headerCovTableEntryMed">84.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntry">67</td>
+ <td class="headerCovTableEntryMed">89.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="device.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#243">__dt_copy</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#665">dt_check_del_prop</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#276">dt_copy</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#994">dt_count_addresses</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#910">dt_expand</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1078">dt_node_is_enabled</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#595">dt_property_get_u64</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1091">dt_adjust_subtree_phandle</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#581">dt_del_property</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#747">dt_prop_get_u64</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#409">dt_find_by_phandle</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#220">dt_new_2addr</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#816">dt_prop_get_cell_def</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#790">dt_prop_get_def</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#798">dt_prop_get_def_size</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#809">dt_prop_get_cell</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1058">dt_translate_address</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#494">dt_add_property_nstr</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#783">dt_prop_get</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#766">dt_prop_get_u32</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1011">dt_translate_one</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#978">dt_find_compatible_node_on_chip</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#755">dt_prop_get_u64_def</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#845">dt_expand_node</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#281">dt_get_path</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#396">dt_new_check</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#529">__dt_add_property_u64s</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#379">dt_find_by_name</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#942">dt_get_address</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#935">dt_n_size_cells</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#971">dt_get_chip_id</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#928">dt_n_address_cells</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#735">dt_find_compatible_node</a></td>
+ <td class="coverFnHi">49</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#54">dt_new_root</a></td>
+ <td class="coverFnHi">50</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#673">dt_require_property</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#547">__dt_add_property_strings</a></td>
+ <td class="coverFnHi">82</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#773">dt_prop_get_u32_def</a></td>
+ <td class="coverFnHi">90</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#918">dt_get_number</a></td>
+ <td class="coverFnHi">107</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#472">dt_resize_property</a></td>
+ <td class="coverFnHi">112</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#343">dt_find_by_path</a></td>
+ <td class="coverFnHi">116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#602">dt_property_set_cell</a></td>
+ <td class="coverFnHi">125</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#189">dt_find_by_name_addr</a></td>
+ <td class="coverFnHi">164</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#198">dt_new_addr</a></td>
+ <td class="coverFnHi">229</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#588">dt_property_get_cell</a></td>
+ <td class="coverFnHi">246</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#959">__dt_get_chip_id</a></td>
+ <td class="coverFnHi">389</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#610">dt_first</a></td>
+ <td class="coverFnHi">548</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#484">dt_add_property_string</a></td>
+ <td class="coverFnHi">564</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#136">dt_new</a></td>
+ <td class="coverFnHi">610</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#644">__dt_find_property</a></td>
+ <td class="coverFnHi">678</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#698">dt_has_node_property</a></td>
+ <td class="coverFnHi">763</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#92">dt_attach_root</a></td>
+ <td class="coverFnHi">850</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#827">dt_free</a></td>
+ <td class="coverFnHi">856</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#127">dt_destroy</a></td>
+ <td class="coverFnHi">859</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#37">new_node</a></td>
+ <td class="coverFnHi">891</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#447">dt_add_property</a></td>
+ <td class="coverFnHi">1211</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#154">__dt_find_by_name_addr</a></td>
+ <td class="coverFnHi">1905</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#311">__dt_path_split</a></td>
+ <td class="coverFnHi">2119</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#728">dt_node_is_compatible</a></td>
+ <td class="coverFnHi">2127</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#711">dt_prop_find_string</a></td>
+ <td class="coverFnHi">2131</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#511">__dt_add_property_cells</a></td>
+ <td class="coverFnHi">3217</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#419">new_property</a></td>
+ <td class="coverFnHi">4534</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#31">free_name</a></td>
+ <td class="coverFnHi">5300</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#22">take_name</a></td>
+ <td class="coverFnHi">5425</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#616">dt_next</a></td>
+ <td class="coverFnHi">6735</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#69">dt_cmp_subnodes</a></td>
+ <td class="coverFnHi">7983</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#654">dt_find_property</a></td>
+ <td class="coverFnHi">9042</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#59">get_unitname</a></td>
+ <td class="coverFnHi">18367</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/device.c.func.html b/coverage-report/core/device.c.func.html
new file mode 100644
index 0000000..df11bd5
--- /dev/null
+++ b/coverage-report/core/device.c.func.html
@@ -0,0 +1,349 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/device.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - device.c<span style="font-size: 80%;"> (<a href="device.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">471</td>
+ <td class="headerCovTableEntry">555</td>
+ <td class="headerCovTableEntryMed">84.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntry">67</td>
+ <td class="headerCovTableEntryMed">89.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="device.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#511">__dt_add_property_cells</a></td>
+ <td class="coverFnHi">3217</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#547">__dt_add_property_strings</a></td>
+ <td class="coverFnHi">82</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#529">__dt_add_property_u64s</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#243">__dt_copy</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#154">__dt_find_by_name_addr</a></td>
+ <td class="coverFnHi">1905</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#644">__dt_find_property</a></td>
+ <td class="coverFnHi">678</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#959">__dt_get_chip_id</a></td>
+ <td class="coverFnHi">389</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#311">__dt_path_split</a></td>
+ <td class="coverFnHi">2119</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#447">dt_add_property</a></td>
+ <td class="coverFnHi">1211</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#494">dt_add_property_nstr</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#484">dt_add_property_string</a></td>
+ <td class="coverFnHi">564</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1091">dt_adjust_subtree_phandle</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#92">dt_attach_root</a></td>
+ <td class="coverFnHi">850</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#665">dt_check_del_prop</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#69">dt_cmp_subnodes</a></td>
+ <td class="coverFnHi">7983</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#276">dt_copy</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#994">dt_count_addresses</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#581">dt_del_property</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#127">dt_destroy</a></td>
+ <td class="coverFnHi">859</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#910">dt_expand</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#845">dt_expand_node</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#379">dt_find_by_name</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#189">dt_find_by_name_addr</a></td>
+ <td class="coverFnHi">164</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#343">dt_find_by_path</a></td>
+ <td class="coverFnHi">116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#409">dt_find_by_phandle</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#735">dt_find_compatible_node</a></td>
+ <td class="coverFnHi">49</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#978">dt_find_compatible_node_on_chip</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#654">dt_find_property</a></td>
+ <td class="coverFnHi">9042</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#610">dt_first</a></td>
+ <td class="coverFnHi">548</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#827">dt_free</a></td>
+ <td class="coverFnHi">856</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#942">dt_get_address</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#971">dt_get_chip_id</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#918">dt_get_number</a></td>
+ <td class="coverFnHi">107</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#281">dt_get_path</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#698">dt_has_node_property</a></td>
+ <td class="coverFnHi">763</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#928">dt_n_address_cells</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#935">dt_n_size_cells</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#136">dt_new</a></td>
+ <td class="coverFnHi">610</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#220">dt_new_2addr</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#198">dt_new_addr</a></td>
+ <td class="coverFnHi">229</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#396">dt_new_check</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#54">dt_new_root</a></td>
+ <td class="coverFnHi">50</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#616">dt_next</a></td>
+ <td class="coverFnHi">6735</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#728">dt_node_is_compatible</a></td>
+ <td class="coverFnHi">2127</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1078">dt_node_is_enabled</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#711">dt_prop_find_string</a></td>
+ <td class="coverFnHi">2131</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#783">dt_prop_get</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#809">dt_prop_get_cell</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#816">dt_prop_get_cell_def</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#790">dt_prop_get_def</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#798">dt_prop_get_def_size</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#766">dt_prop_get_u32</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#773">dt_prop_get_u32_def</a></td>
+ <td class="coverFnHi">90</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#747">dt_prop_get_u64</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#755">dt_prop_get_u64_def</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#588">dt_property_get_cell</a></td>
+ <td class="coverFnHi">246</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#595">dt_property_get_u64</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#602">dt_property_set_cell</a></td>
+ <td class="coverFnHi">125</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#673">dt_require_property</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#472">dt_resize_property</a></td>
+ <td class="coverFnHi">112</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1058">dt_translate_address</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#1011">dt_translate_one</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#31">free_name</a></td>
+ <td class="coverFnHi">5300</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#59">get_unitname</a></td>
+ <td class="coverFnHi">18367</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#37">new_node</a></td>
+ <td class="coverFnHi">891</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#419">new_property</a></td>
+ <td class="coverFnHi">4534</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.c.gcov.html#22">take_name</a></td>
+ <td class="coverFnHi">5425</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/device.c.gcov.html b/coverage-report/core/device.c.gcov.html
new file mode 100644
index 0000000..fa09252
--- /dev/null
+++ b/coverage-report/core/device.c.gcov.html
@@ -0,0 +1,1213 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/device.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - device.c<span style="font-size: 80%;"> (source / <a href="device.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">471</td>
+ <td class="headerCovTableEntry">555</td>
+ <td class="headerCovTableEntryMed">84.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntry">67</td>
+ <td class="headerCovTableEntryMed">89.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Manipulate the device tree</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;device.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;libfdt/libfdt.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;libfdt/libfdt_internal.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : /* Used to give unique handles. */</a>
+<a name="19"><span class="lineNum"> 19 </span> : : u32 last_phandle = 0;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : struct dt_node *dt_root;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct dt_node *dt_chosen;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 5425 : static const char *take_name(const char *name)</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 5425 : if (!is_rodata(name) &amp;&amp; !(name = strdup(name))) {</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Failed to allocate copy of name&quot;);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 5425 : return name;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : }</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 5300 : static void free_name(const char *name)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : {</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 5242 : if (!is_rodata(name))</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 5299 : free((char *)name);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 5300 : }</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 891 : static struct dt_node *new_node(const char *name)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 891 : struct dt_node *node = malloc(sizeof *node);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 891 : if (!node) {</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Failed to allocate node\n&quot;);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : }</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 891 : node-&gt;name = take_name(name);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 891 : node-&gt;parent = NULL;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 891 : list_head_init(&amp;node-&gt;properties);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 891 : list_head_init(&amp;node-&gt;children);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : /* FIXME: locking? */</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 891 : node-&gt;phandle = new_phandle();</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 891 : return node;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 50 : struct dt_node *dt_new_root(const char *name)</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : {</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 50 : return new_node(name);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : }</a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 18367 : static const char *get_unitname(const struct dt_node *node)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : {</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 18367 : const char *c = strchr(node-&gt;name, '@');</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 18367 : if (!c)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 11399 : return NULL;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 6968 : return c + 1;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : }</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 7983 : int dt_cmp_subnodes(const struct dt_node *a, const struct dt_node *b)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 7983 : const char *a_unit = get_unitname(a);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 7983 : const char *b_unit = get_unitname(b);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 7983 : ptrdiff_t basenamelen = a_unit - a-&gt;name;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* sort hex unit addresses by number */</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 7983 : if (a_unit &amp;&amp; b_unit &amp;&amp; !strncmp(a-&gt;name, b-&gt;name, basenamelen)) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : unsigned long long a_num, b_num;</a>
+<a name="81"><span class="lineNum"> 81 </span> : : char *a_end, *b_end;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1102 : a_num = strtoul(a_unit, &amp;a_end, 16);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1102 : b_num = strtoul(b_unit, &amp;b_end, 16);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /* only compare if the unit addr parsed correctly */</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1102 : if (*a_end == 0 &amp;&amp; *b_end == 0)</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1101 : return (a_num &gt; b_num) - (a_num &lt; b_num);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : }</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 6882 : return strcmp(a-&gt;name, b-&gt;name);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 850 : bool dt_attach_root(struct dt_node *parent, struct dt_node *root)</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : {</a>
+<a name="96"><span class="lineNum"> 96 </span> : : struct dt_node *node;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 850 : assert(!root-&gt;parent);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 850 : if (list_empty(&amp;parent-&gt;children)) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 126 : list_add(&amp;parent-&gt;children, &amp;root-&gt;list);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 126 : root-&gt;parent = parent;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 126 : return true;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : }</a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 8000 : dt_for_each_child(parent, node) {</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 7860 : int cmp = dt_cmp_subnodes(node, root);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Look for duplicates */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 7860 : if (cmp == 0) {</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 4 : prerror(&quot;DT: %s failed, duplicate %s\n&quot;,</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : __func__, root-&gt;name);</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 4 : return false;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : }</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : /* insert before the first node that's larger</a>
+<a name="118"><span class="lineNum"> 118 </span> : : * the the node we're inserting */</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 7856 : if (cmp &gt; 0)</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 580 : break;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 720 : list_add_before(&amp;parent-&gt;children, &amp;root-&gt;list, &amp;node-&gt;list);</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 720 : root-&gt;parent = parent;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 720 : return true;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : }</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 859 : static inline void dt_destroy(struct dt_node *dn)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : {</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 859 : if (!dn)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 859 : free_name(dn-&gt;name);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 859 : free(dn);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 610 : struct dt_node *dt_new(struct dt_node *parent, const char *name)</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : {</a>
+<a name="140"><span class="lineNum"> 140 </span> : : struct dt_node *new;</a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 610 : assert(parent);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 610 : new = new_node(name);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 610 : if (!dt_attach_root(parent, new)) {</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1 : dt_destroy(new);</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : }</a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 609 : return new;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : }</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /*</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * low level variant, we export this because there are &quot;weird&quot; address</a>
+<a name="153"><span class="lineNum"> 153 </span> : : * formats, such as LPC/ISA bus addresses which have a letter to identify</a>
+<a name="154"><span class="lineNum"> 154 </span> : : * which bus space the address is inside of.</a>
+<a name="155"><span class="lineNum"> 155 </span> : : */</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 1905 : struct dt_node *__dt_find_by_name_addr(struct dt_node *parent, const char *name,</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : const char *addr)</a>
+<a name="158"><span class="lineNum"> 158 </span> : : {</a>
+<a name="159"><span class="lineNum"> 159 </span> : : struct dt_node *node;</a>
+<a name="160"><span class="lineNum"> 160 </span> : : </a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1905 : if (list_empty(&amp;parent-&gt;children))</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 1385 : return NULL;</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 2826 : dt_for_each_child(parent, node) {</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 2401 : const char *unit = get_unitname(node);</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : int len;</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 2401 : if (!unit)</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 39 : continue;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> : : /* match the name */</a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 2362 : len = (int) (unit - node-&gt;name) - 1;</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 2362 : if (strncmp(node-&gt;name, name, len))</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 2171 : continue;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> : : /* match the unit */</a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 191 : if (strcmp(unit, addr) == 0)</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 95 : return node;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : }</a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 1999 : dt_for_each_child(parent, node) {</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 1741 : struct dt_node *ret = __dt_find_by_name_addr(node, name, addr);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 1741 : if (ret)</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 167 : return ret;</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 258 : return NULL;</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : }</a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 164 : struct dt_node *dt_find_by_name_addr(struct dt_node *parent, const char *name,</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : uint64_t addr)</a>
+<a name="193"><span class="lineNum"> 193 </span> : : {</a>
+<a name="194"><span class="lineNum"> 194 </span> : : char addr_str[16 + 1]; /* max size of a 64bit int */</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 164 : snprintf(addr_str, sizeof(addr_str), &quot;%&quot; PRIx64, addr);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 164 : return __dt_find_by_name_addr(parent, name, addr_str);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : }</a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 229 : struct dt_node *dt_new_addr(struct dt_node *parent, const char *name,</span></a>
+<a name="201"><span class="lineNum"> 201 </span> : : uint64_t addr)</a>
+<a name="202"><span class="lineNum"> 202 </span> : : {</a>
+<a name="203"><span class="lineNum"> 203 </span> : : char *lname;</a>
+<a name="204"><span class="lineNum"> 204 </span> : : struct dt_node *new;</a>
+<a name="205"><span class="lineNum"> 205 </span> : : size_t len;</a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 229 : assert(parent);</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 229 : len = strlen(name) + STR_MAX_CHARS(addr) + 2;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 229 : lname = malloc(len);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 229 : if (!lname)</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 229 : snprintf(lname, len, &quot;%s@%llx&quot;, name, (long long)addr);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 229 : new = new_node(lname);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 229 : free(lname);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 229 : if (!dt_attach_root(parent, new)) {</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 1 : dt_destroy(new);</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : }</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 228 : return new;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : }</a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 2 : struct dt_node *dt_new_2addr(struct dt_node *parent, const char *name,</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : uint64_t addr0, uint64_t addr1)</a>
+<a name="224"><span class="lineNum"> 224 </span> : : {</a>
+<a name="225"><span class="lineNum"> 225 </span> : : char *lname;</a>
+<a name="226"><span class="lineNum"> 226 </span> : : struct dt_node *new;</a>
+<a name="227"><span class="lineNum"> 227 </span> : : size_t len;</a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 2 : assert(parent);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 2 : len = strlen(name) + 2*STR_MAX_CHARS(addr0) + 3;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 2 : lname = malloc(len);</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 2 : if (!lname)</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 2 : snprintf(lname, len, &quot;%s@%llx,%llx&quot;,</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : name, (long long)addr0, (long long)addr1);</a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 2 : new = new_node(lname);</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 2 : free(lname);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 2 : if (!dt_attach_root(parent, new)) {</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 1 : dt_destroy(new);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : }</a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 1 : return new;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : }</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : static struct dt_node *__dt_copy(struct dt_node *node, struct dt_node *parent,</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : bool root)</a>
+<a name="247"><span class="lineNum"> 247 </span> : : {</a>
+<a name="248"><span class="lineNum"> 248 </span> : : struct dt_property *prop, *new_prop;</a>
+<a name="249"><span class="lineNum"> 249 </span> : : struct dt_node *new_node, *child;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : new_node = dt_new(parent, node-&gt;name);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : if (!new_node)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;node-&gt;properties, prop, list) {</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : new_prop = dt_add_property(new_node, prop-&gt;name, prop-&gt;prop,</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : prop-&gt;len);</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : if (!new_prop)</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : }</a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;node-&gt;children, child, list) {</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : child = __dt_copy(child, new_node, false);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : if (!child)</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : return new_node;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : fail:</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : /* dt_free will recurse for us, so only free when we unwind to the</a>
+<a name="272"><span class="lineNum"> 272 </span> : : * top-level failure */</a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : if (root)</span></a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineNoCov"> 0 : dt_free(new_node);</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : }</a>
+<a name="277"><span class="lineNum"> 277 </span> : : </a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : struct dt_node *dt_copy(struct dt_node *node, struct dt_node *parent)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : {</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : return __dt_copy(node, parent, true);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : }</a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 10 : char *dt_get_path(const struct dt_node *node)</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : {</a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 10 : unsigned int len = 0;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : const struct dt_node *n;</a>
+<a name="287"><span class="lineNum"> 287 </span> : : char *path, *p;</a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> : : /* Dealing with NULL is for test/debug purposes */</a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 10 : if (!node)</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : return strdup(&quot;&lt;NULL&gt;&quot;);</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 36 : for (n = node; n; n = n-&gt;parent) {</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 26 : len += strlen(n-&gt;name);</span></a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 26 : if (n-&gt;parent || n == node)</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 17 : len++;</span></a>
+<a name="297"><span class="lineNum"> 297 </span> : : }</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 10 : path = zalloc(len + 1);</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 10 : assert(path);</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 10 : p = path + len;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 36 : for (n = node; n; n = n-&gt;parent) {</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 26 : len = strlen(n-&gt;name);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 26 : p -= len;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 26 : memcpy(p, n-&gt;name, len);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 26 : if (n-&gt;parent || n == node)</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 17 : *(--p) = '/';</span></a>
+<a name="307"><span class="lineNum"> 307 </span> : : }</a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 10 : assert(p == path);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 10 : return p;</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : }</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 2119 : static const char *__dt_path_split(const char *p,</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : const char **namep, unsigned int *namel,</a>
+<a name="315"><span class="lineNum"> 315 </span> : : const char **addrp, unsigned int *addrl)</a>
+<a name="316"><span class="lineNum"> 316 </span> : : {</a>
+<a name="317"><span class="lineNum"> 317 </span> : : const char *at, *sl;</a>
+<a name="318"><span class="lineNum"> 318 </span> : : </a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 2119 : *namel = *addrl = 0;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Skip initial '/' */</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 2265 : while (*p == '/')</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 146 : p++;</span></a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> : : /* Check empty path */</a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 2119 : if (*p == 0)</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : return p;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : </a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 2119 : at = strchr(p, '@');</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 2119 : sl = strchr(p, '/');</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 2119 : if (sl == NULL)</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 2031 : sl = p + strlen(p);</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 2119 : if (sl &lt; at)</span></a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 2 : at = NULL;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 2119 : if (at) {</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 558 : *addrp = at + 1;</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 558 : *addrl = sl - at - 1;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : }</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 2119 : *namep = p;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 2119 : *namel = at ? (at - p) : (sl - p);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 2119 : return sl;</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : }</a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 116 : struct dt_node *dt_find_by_path(struct dt_node *root, const char *path)</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : {</a>
+<a name="347"><span class="lineNum"> 347 </span> : : struct dt_node *n;</a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 116 : const char *pn, *pa, *p = path, *nn, *na;</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : unsigned int pnl, pal, nnl, nal;</a>
+<a name="350"><span class="lineNum"> 350 </span> : : bool match;</a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : /* Walk path components */</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 236 : while (*p) {</span></a>
+<a name="354"><span class="lineNum"> 354 </span> : : /* Extract next path component */</a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 184 : p = __dt_path_split(p, &amp;pn, &amp;pnl, &amp;pa, &amp;pal);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 184 : if (pnl == 0 &amp;&amp; pal == 0)</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : </a>
+<a name="359"><span class="lineNum"> 359 </span> : : /* Compare with each child node */</a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 184 : match = false;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 1999 : list_for_each(&amp;root-&gt;children, n, list) {</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 1935 : match = true;</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 1935 : __dt_path_split(n-&gt;name, &amp;nn, &amp;nnl, &amp;na, &amp;nal);</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 1935 : if (pnl &amp;&amp; (pnl != nnl || strncmp(pn, nn, pnl)))</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 1815 : match = false;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1935 : if (pal &amp;&amp; (pal != nal || strncmp(pa, na, pal)))</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : match = false;</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 1935 : if (match) {</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 120 : root = n;</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 120 : break;</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : }</a>
+<a name="372"><span class="lineNum"> 372 </span> : : }</a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> : : /* No child match */</a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 184 : if (!match)</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 64 : return NULL;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : }</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 52 : return root;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : }</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 35 : struct dt_node *dt_find_by_name(struct dt_node *root, const char *name)</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : {</a>
+<a name="383"><span class="lineNum"> 383 </span> : : struct dt_node *child, *match;</a>
+<a name="384"><span class="lineNum"> 384 </span> : : </a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 41 : list_for_each(&amp;root-&gt;children, child, list) {</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 24 : if (!strcmp(child-&gt;name, name))</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 11 : return child;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 13 : match = dt_find_by_name(child, name);</span></a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 13 : if (match)</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 7 : return match;</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : }</a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 17 : return NULL;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 12 : struct dt_node *dt_new_check(struct dt_node *parent, const char *name)</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : {</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 12 : struct dt_node *node = dt_find_by_name(parent, name);</span></a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 12 : if (!node) {</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 11 : node = dt_new(parent, name);</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 11 : assert(node);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : }</a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineCov"> 12 : return node;</span></a>
+<a name="408"><span class="lineNum"> 408 </span> : : }</a>
+<a name="409"><span class="lineNum"> 409 </span> : : </a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 2 : struct dt_node *dt_find_by_phandle(struct dt_node *root, u32 phandle)</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : {</a>
+<a name="413"><span class="lineNum"> 413 </span> : : struct dt_node *node;</a>
+<a name="414"><span class="lineNum"> 414 </span> : : </a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 10 : dt_for_each_node(root, node)</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 9 : if (node-&gt;phandle == phandle)</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 1 : return node;</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : }</a>
+<a name="420"><span class="lineNum"> 420 </span> : : </a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineCov"> 4534 : static struct dt_property *new_property(struct dt_node *node,</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : const char *name, size_t size)</a>
+<a name="423"><span class="lineNum"> 423 </span> : : {</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 4534 : struct dt_property *p = malloc(sizeof(*p) + size);</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : char *path;</a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 4534 : if (!p) {</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : path = dt_get_path(node);</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Failed to allocate property \&quot;%s\&quot; for %s of %zu bytes\n&quot;,</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : name, path, size);</a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="433"><span class="lineNum"> 433 </span> : : }</a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 4534 : if (dt_find_property(node, name)) {</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineNoCov"> 0 : path = dt_get_path(node);</span></a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Duplicate property \&quot;%s\&quot; in node %s\n&quot;,</span></a>
+<a name="437"><span class="lineNum"> 437 </span> : : name, path);</a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : </a>
+<a name="441"><span class="lineNum"> 441 </span> : : }</a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineCov"> 4534 : p-&gt;name = take_name(name);</span></a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 4534 : p-&gt;len = size;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 4534 : list_add_tail(&amp;node-&gt;properties, &amp;p-&gt;list);</span></a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 4534 : return p;</span></a>
+<a name="447"><span class="lineNum"> 447 </span> : : }</a>
+<a name="448"><span class="lineNum"> 448 </span> : : </a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineCov"> 1211 : struct dt_property *dt_add_property(struct dt_node *node,</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : const char *name,</a>
+<a name="451"><span class="lineNum"> 451 </span> : : const void *val, size_t size)</a>
+<a name="452"><span class="lineNum"> 452 </span> : : {</a>
+<a name="453"><span class="lineNum"> 453 </span> : : struct dt_property *p;</a>
+<a name="454"><span class="lineNum"> 454 </span> : : </a>
+<a name="455"><span class="lineNum"> 455 </span> : : /*</a>
+<a name="456"><span class="lineNum"> 456 </span> : : * Filter out phandle properties, we re-generate them</a>
+<a name="457"><span class="lineNum"> 457 </span> : : * when flattening</a>
+<a name="458"><span class="lineNum"> 458 </span> : : */</a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 1211 : if (strcmp(name, &quot;linux,phandle&quot;) == 0 ||</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 1211 : strcmp(name, &quot;phandle&quot;) == 0) {</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineCov"> 10 : assert(size == 4);</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 10 : node-&gt;phandle = *(const u32 *)val;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 10 : if (node-&gt;phandle &gt;= last_phandle)</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 4 : set_last_phandle(node-&gt;phandle);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineCov"> 10 : return NULL;</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : }</a>
+<a name="467"><span class="lineNum"> 467 </span> : : </a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 1201 : p = new_property(node, name, size);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 1201 : if (size)</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 881 : memcpy(p-&gt;prop, val, size);</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 1201 : return p;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : }</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 112 : void dt_resize_property(struct dt_property **prop, size_t len)</span></a>
+<a name="475"><span class="lineNum"> 475 </span> : : {</a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 112 : size_t new_len = sizeof(**prop) + len;</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : </a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 112 : *prop = realloc(*prop, new_len);</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineCov"> 112 : (*prop)-&gt;len = len;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : </a>
+<a name="481"><span class="lineNum"> 481 </span> : : /* Fix up linked lists in case we moved. (note: not an empty list). */</a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 112 : (*prop)-&gt;list.next-&gt;prev = &amp;(*prop)-&gt;list;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 112 : (*prop)-&gt;list.prev-&gt;next = &amp;(*prop)-&gt;list;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 112 : }</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineCov"> 564 : struct dt_property *dt_add_property_string(struct dt_node *node,</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : const char *name,</a>
+<a name="488"><span class="lineNum"> 488 </span> : : const char *value)</a>
+<a name="489"><span class="lineNum"> 489 </span> : : {</a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 564 : size_t len = 0;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 564 : if (value)</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 564 : len = strlen(value) + 1;</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 564 : return dt_add_property(node, name, value, len);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> : : }</a>
+<a name="495"><span class="lineNum"> 495 </span> : : </a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 5 : struct dt_property *dt_add_property_nstr(struct dt_node *node,</span></a>
+<a name="497"><span class="lineNum"> 497 </span> : : const char *name,</a>
+<a name="498"><span class="lineNum"> 498 </span> : : const char *value, unsigned int vlen)</a>
+<a name="499"><span class="lineNum"> 499 </span> : : {</a>
+<a name="500"><span class="lineNum"> 500 </span> : : struct dt_property *p;</a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 5 : char *tmp = zalloc(vlen + 1);</span></a>
+<a name="502"><span class="lineNum"> 502 </span> : : </a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 5 : if (!tmp)</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : </a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineCov"> 5 : strncpy(tmp, value, vlen);</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 5 : p = dt_add_property(node, name, tmp, strlen(tmp)+1);</span></a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 5 : free(tmp);</span></a>
+<a name="509"><span class="lineNum"> 509 </span> : : </a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 5 : return p;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> : : }</a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 3217 : struct dt_property *__dt_add_property_cells(struct dt_node *node,</span></a>
+<a name="514"><span class="lineNum"> 514 </span> : : const char *name,</a>
+<a name="515"><span class="lineNum"> 515 </span> : : int count, ...)</a>
+<a name="516"><span class="lineNum"> 516 </span> : : {</a>
+<a name="517"><span class="lineNum"> 517 </span> : : struct dt_property *p;</a>
+<a name="518"><span class="lineNum"> 518 </span> : : fdt32_t *val;</a>
+<a name="519"><span class="lineNum"> 519 </span> : : unsigned int i;</a>
+<a name="520"><span class="lineNum"> 520 </span> : : va_list args;</a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 3217 : p = new_property(node, name, count * sizeof(u32));</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineCov"> 3217 : val = (fdt32_t *)p-&gt;prop;</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineCov"> 3217 : va_start(args, count);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineCov"> 7460 : for (i = 0; i &lt; count; i++)</span></a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineCov"> 4243 : val[i] = cpu_to_fdt32(va_arg(args, u32));</span></a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 3217 : va_end(args);</span></a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 3217 : return p;</span></a>
+<a name="529"><span class="lineNum"> 529 </span> : : }</a>
+<a name="530"><span class="lineNum"> 530 </span> : : </a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 34 : struct dt_property *__dt_add_property_u64s(struct dt_node *node,</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : const char *name,</a>
+<a name="533"><span class="lineNum"> 533 </span> : : int count, ...)</a>
+<a name="534"><span class="lineNum"> 534 </span> : : {</a>
+<a name="535"><span class="lineNum"> 535 </span> : : struct dt_property *p;</a>
+<a name="536"><span class="lineNum"> 536 </span> : : fdt64_t *val;</a>
+<a name="537"><span class="lineNum"> 537 </span> : : unsigned int i;</a>
+<a name="538"><span class="lineNum"> 538 </span> : : va_list args;</a>
+<a name="539"><span class="lineNum"> 539 </span> : : </a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 34 : p = new_property(node, name, count * sizeof(u64));</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineCov"> 34 : val = (fdt64_t *)p-&gt;prop;</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineCov"> 34 : va_start(args, count);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 124 : for (i = 0; i &lt; count; i++)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> :<span class="lineCov"> 90 : val[i] = cpu_to_fdt64(va_arg(args, u64));</span></a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 34 : va_end(args);</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineCov"> 34 : return p;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : }</a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 82 : struct dt_property *__dt_add_property_strings(struct dt_node *node,</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : const char *name,</a>
+<a name="551"><span class="lineNum"> 551 </span> : : int count, ...)</a>
+<a name="552"><span class="lineNum"> 552 </span> : : {</a>
+<a name="553"><span class="lineNum"> 553 </span> : : struct dt_property *p;</a>
+<a name="554"><span class="lineNum"> 554 </span> : : unsigned int i, size;</a>
+<a name="555"><span class="lineNum"> 555 </span> : : va_list args;</a>
+<a name="556"><span class="lineNum"> 556 </span> : : const char *sstr;</a>
+<a name="557"><span class="lineNum"> 557 </span> : : char *s;</a>
+<a name="558"><span class="lineNum"> 558 </span> : : </a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 82 : va_start(args, count);</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineCov"> 222 : for (i = size = 0; i &lt; count; i++) {</span></a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineCov"> 140 : sstr = va_arg(args, const char *);</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineCov"> 140 : if (sstr)</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineCov"> 140 : size += strlen(sstr) + 1;</span></a>
+<a name="564"><span class="lineNum"> 564 </span> : : }</a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineCov"> 82 : va_end(args);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 82 : if (!size)</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : size = 1;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineCov"> 82 : p = new_property(node, name, size);</span></a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineCov"> 82 : s = (char *)p-&gt;prop;</span></a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineCov"> 82 : *s = 0;</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineCov"> 82 : va_start(args, count);</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineCov"> 222 : for (i = 0; i &lt; count; i++) { </span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineCov"> 140 : sstr = va_arg(args, const char *);</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineCov"> 140 : if (sstr) {</span></a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineCov"> 140 : strcpy(s, sstr);</span></a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineCov"> 140 : s = s + strlen(sstr) + 1;</span></a>
+<a name="577"><span class="lineNum"> 577 </span> : : }</a>
+<a name="578"><span class="lineNum"> 578 </span> : : }</a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineCov"> 82 : va_end(args);</span></a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineCov"> 82 : return p;</span></a>
+<a name="581"><span class="lineNum"> 581 </span> : : }</a>
+<a name="582"><span class="lineNum"> 582 </span> : : </a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineCov"> 1 : void dt_del_property(struct dt_node *node, struct dt_property *prop)</span></a>
+<a name="584"><span class="lineNum"> 584 </span> : : {</a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineCov"> 1 : list_del_from(&amp;node-&gt;properties, &amp;prop-&gt;list);</span></a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 1 : free_name(prop-&gt;name);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 1 : free(prop);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 246 : u32 dt_property_get_cell(const struct dt_property *prop, u32 index)</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : {</a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 246 : assert(prop-&gt;len &gt;= (index+1)*sizeof(u32));</span></a>
+<a name="593"><span class="lineNum"> 593 </span> : : /* Always aligned, so this works. */</a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineCov"> 246 : return fdt32_to_cpu(((const fdt32_t *)prop-&gt;prop)[index]);</span></a>
+<a name="595"><span class="lineNum"> 595 </span> : : }</a>
+<a name="596"><span class="lineNum"> 596 </span> : : </a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineNoCov"> 0 : u64 dt_property_get_u64(const struct dt_property *prop, u32 index)</span></a>
+<a name="598"><span class="lineNum"> 598 </span> : : {</a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineNoCov"> 0 : assert(prop-&gt;len &gt;= (index+1)*sizeof(u64));</span></a>
+<a name="600"><span class="lineNum"> 600 </span> : : /* Always aligned, so this works. */</a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : return fdt64_to_cpu(((const fdt64_t *)prop-&gt;prop)[index]);</span></a>
+<a name="602"><span class="lineNum"> 602 </span> : : }</a>
+<a name="603"><span class="lineNum"> 603 </span> : : </a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineCov"> 125 : void dt_property_set_cell(struct dt_property *prop, u32 index, u32 val)</span></a>
+<a name="605"><span class="lineNum"> 605 </span> : : {</a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineCov"> 125 : assert(prop-&gt;len &gt;= (index+1)*sizeof(u32));</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : /* Always aligned, so this works. */</a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineCov"> 125 : ((fdt32_t *)prop-&gt;prop)[index] = cpu_to_fdt32(val);</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineCov"> 125 : }</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : </a>
+<a name="611"><span class="lineNum"> 611 </span> : : /* First child of this node. */</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineCov"> 548 : struct dt_node *dt_first(const struct dt_node *root)</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : {</a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 548 : return list_top(&amp;root-&gt;children, struct dt_node, list);</span></a>
+<a name="615"><span class="lineNum"> 615 </span> : : }</a>
+<a name="616"><span class="lineNum"> 616 </span> : : </a>
+<a name="617"><span class="lineNum"> 617 </span> : : /* Return next node, or NULL. */</a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineCov"> 6735 : struct dt_node *dt_next(const struct dt_node *root,</span></a>
+<a name="619"><span class="lineNum"> 619 </span> : : const struct dt_node *prev)</a>
+<a name="620"><span class="lineNum"> 620 </span> : : {</a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineCov"> 6735 : if (!prev) {</span></a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineCov"> 26 : struct dt_node *first = dt_first(root);</span></a>
+<a name="623"><span class="lineNum"> 623 </span> : : </a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineCov"> 26 : if (!first)</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="626"><span class="lineNum"> 626 </span> : : else</a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 26 : return first;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : }</a>
+<a name="629"><span class="lineNum"> 629 </span> : : </a>
+<a name="630"><span class="lineNum"> 630 </span> : : /* Children? */</a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 6709 : if (!list_empty(&amp;prev-&gt;children))</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 340 : return dt_first(prev);</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : </a>
+<a name="634"><span class="lineNum"> 634 </span> : : do {</a>
+<a name="635"><span class="lineNum"> 635 </span> : : /* More siblings? */</a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineCov"> 6705 : if (prev-&gt;list.next != &amp;prev-&gt;parent-&gt;children.n)</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineCov"> 6308 : return list_entry(prev-&gt;list.next, struct dt_node,list);</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /* No more siblings, move up to parent. */</a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineCov"> 397 : prev = prev-&gt;parent;</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineCov"> 397 : } while (prev != root);</span></a>
+<a name="642"><span class="lineNum"> 642 </span> : : </a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 61 : return NULL;</span></a>
+<a name="644"><span class="lineNum"> 644 </span> : : }</a>
+<a name="645"><span class="lineNum"> 645 </span> : : </a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineCov"> 678 : struct dt_property *__dt_find_property(struct dt_node *node, const char *name)</span></a>
+<a name="647"><span class="lineNum"> 647 </span> : : {</a>
+<a name="648"><span class="lineNum"> 648 </span> : : struct dt_property *i;</a>
+<a name="649"><span class="lineNum"> 649 </span> : : </a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineCov"> 4927 : list_for_each(&amp;node-&gt;properties, i, list)</span></a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 4365 : if (strcmp(i-&gt;name, name) == 0)</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 116 : return i;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineCov"> 562 : return NULL;</span></a>
+<a name="654"><span class="lineNum"> 654 </span> : : }</a>
+<a name="655"><span class="lineNum"> 655 </span> : : </a>
+<a name="656"><span class="lineNum"> 656 </span> :<span class="lineCov"> 9042 : const struct dt_property *dt_find_property(const struct dt_node *node,</span></a>
+<a name="657"><span class="lineNum"> 657 </span> : : const char *name)</a>
+<a name="658"><span class="lineNum"> 658 </span> : : {</a>
+<a name="659"><span class="lineNum"> 659 </span> : : const struct dt_property *i;</a>
+<a name="660"><span class="lineNum"> 660 </span> : : </a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 74693 : list_for_each(&amp;node-&gt;properties, i, list)</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 66765 : if (strcmp(i-&gt;name, name) == 0)</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 1114 : return i;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineCov"> 7928 : return NULL;</span></a>
+<a name="665"><span class="lineNum"> 665 </span> : : }</a>
+<a name="666"><span class="lineNum"> 666 </span> : : </a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineNoCov"> 0 : void dt_check_del_prop(struct dt_node *node, const char *name)</span></a>
+<a name="668"><span class="lineNum"> 668 </span> : : {</a>
+<a name="669"><span class="lineNum"> 669 </span> : : struct dt_property *p;</a>
+<a name="670"><span class="lineNum"> 670 </span> : : </a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : p = __dt_find_property(node, name);</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : if (p)</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : dt_del_property(node, p);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineCov"> 57 : const struct dt_property *dt_require_property(const struct dt_node *node,</span></a>
+<a name="676"><span class="lineNum"> 676 </span> : : const char *name, int wanted_len)</a>
+<a name="677"><span class="lineNum"> 677 </span> : : {</a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineCov"> 57 : const struct dt_property *p = dt_find_property(node, name);</span></a>
+<a name="679"><span class="lineNum"> 679 </span> : : </a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineCov"> 57 : if (!p) {</span></a>
+<a name="681"><span class="lineNum"> 681 </span> :<span class="lineNoCov"> 0 : const char *path = dt_get_path(node);</span></a>
+<a name="682"><span class="lineNum"> 682 </span> : : </a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : prerror(&quot;DT: Missing required property %s/%s\n&quot;,</span></a>
+<a name="684"><span class="lineNum"> 684 </span> : : path, name);</a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="686"><span class="lineNum"> 686 </span> : : }</a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 57 : if (wanted_len &gt;= 0 &amp;&amp; p-&gt;len != wanted_len) {</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : const char *path = dt_get_path(node);</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : </a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : prerror(&quot;DT: Unexpected property length %s/%s\n&quot;,</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : path, name);</a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineNoCov"> 0 : prerror(&quot;DT: Expected len: %d got len: %zu\n&quot;,</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : wanted_len, p-&gt;len);</a>
+<a name="694"><span class="lineNum"> 694 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="695"><span class="lineNum"> 695 </span> : : }</a>
+<a name="696"><span class="lineNum"> 696 </span> : : </a>
+<a name="697"><span class="lineNum"> 697 </span> :<span class="lineCov"> 57 : return p;</span></a>
+<a name="698"><span class="lineNum"> 698 </span> : : }</a>
+<a name="699"><span class="lineNum"> 699 </span> : : </a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 763 : bool dt_has_node_property(const struct dt_node *node,</span></a>
+<a name="701"><span class="lineNum"> 701 </span> : : const char *name, const char *val)</a>
+<a name="702"><span class="lineNum"> 702 </span> : : {</a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 763 : const struct dt_property *p = dt_find_property(node, name);</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : </a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineCov"> 763 : if (!p)</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 434 : return false;</span></a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineCov"> 329 : if (!val)</span></a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 2 : return true;</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 327 : return p-&gt;len == strlen(val) + 1 &amp;&amp; memcmp(p-&gt;prop, val, p-&gt;len) == 0;</span></a>
+<a name="711"><span class="lineNum"> 711 </span> : : }</a>
+<a name="712"><span class="lineNum"> 712 </span> : : </a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 2131 : bool dt_prop_find_string(const struct dt_property *p, const char *s)</span></a>
+<a name="714"><span class="lineNum"> 714 </span> : : {</a>
+<a name="715"><span class="lineNum"> 715 </span> : : const char *c, *end;</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 2131 : if (!p)</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 1664 : return false;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 467 : c = p-&gt;prop;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 467 : end = c + p-&gt;len;</span></a>
+<a name="721"><span class="lineNum"> 721 </span> : : </a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 1244 : while(c &lt; end) {</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 833 : if (!strcasecmp(s, c))</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineCov"> 56 : return true;</span></a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineCov"> 777 : c += strlen(c) + 1;</span></a>
+<a name="726"><span class="lineNum"> 726 </span> : : }</a>
+<a name="727"><span class="lineNum"> 727 </span> :<span class="lineCov"> 411 : return false;</span></a>
+<a name="728"><span class="lineNum"> 728 </span> : : }</a>
+<a name="729"><span class="lineNum"> 729 </span> : : </a>
+<a name="730"><span class="lineNum"> 730 </span> :<span class="lineCov"> 2127 : bool dt_node_is_compatible(const struct dt_node *node, const char *compat)</span></a>
+<a name="731"><span class="lineNum"> 731 </span> : : {</a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineCov"> 2127 : const struct dt_property *p = dt_find_property(node, &quot;compatible&quot;);</span></a>
+<a name="733"><span class="lineNum"> 733 </span> : : </a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineCov"> 2127 : return dt_prop_find_string(p, compat);</span></a>
+<a name="735"><span class="lineNum"> 735 </span> : : }</a>
+<a name="736"><span class="lineNum"> 736 </span> : : </a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineCov"> 49 : struct dt_node *dt_find_compatible_node(struct dt_node *root,</span></a>
+<a name="738"><span class="lineNum"> 738 </span> : : struct dt_node *prev,</a>
+<a name="739"><span class="lineNum"> 739 </span> : : const char *compat)</a>
+<a name="740"><span class="lineNum"> 740 </span> : : {</a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 49 : struct dt_node *node = prev;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> : : </a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineCov"> 2092 : while ((node = dt_next(root, node)))</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineCov"> 2089 : if (dt_node_is_compatible(node, compat))</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineCov"> 46 : return node;</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineCov"> 3 : return NULL;</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : }</a>
+<a name="748"><span class="lineNum"> 748 </span> : : </a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineCov"> 1 : u64 dt_prop_get_u64(const struct dt_node *node, const char *prop)</span></a>
+<a name="750"><span class="lineNum"> 750 </span> : : {</a>
+<a name="751"><span class="lineNum"> 751 </span> :<span class="lineCov"> 1 : const struct dt_property *p = dt_require_property(node, prop, 8);</span></a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> :<span class="lineCov"> 1 : return ((u64)dt_property_get_cell(p, 0) &lt;&lt; 32)</span></a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineCov"> 1 : | dt_property_get_cell(p, 1);</span></a>
+<a name="755"><span class="lineNum"> 755 </span> : : }</a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineCov"> 8 : u64 dt_prop_get_u64_def(const struct dt_node *node, const char *prop, u64 def)</span></a>
+<a name="758"><span class="lineNum"> 758 </span> : : {</a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineCov"> 8 : const struct dt_property *p = dt_find_property(node, prop);</span></a>
+<a name="760"><span class="lineNum"> 760 </span> : : </a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineCov"> 8 : if (!p)</span></a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineCov"> 1 : return def;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : </a>
+<a name="764"><span class="lineNum"> 764 </span> :<span class="lineCov"> 7 : return ((u64)dt_property_get_cell(p, 0) &lt;&lt; 32)</span></a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineCov"> 7 : | dt_property_get_cell(p, 1);</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : }</a>
+<a name="767"><span class="lineNum"> 767 </span> : : </a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineCov"> 5 : u32 dt_prop_get_u32(const struct dt_node *node, const char *prop)</span></a>
+<a name="769"><span class="lineNum"> 769 </span> : : {</a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineCov"> 5 : const struct dt_property *p = dt_require_property(node, prop, 4);</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : </a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineCov"> 5 : return dt_property_get_cell(p, 0);</span></a>
+<a name="773"><span class="lineNum"> 773 </span> : : }</a>
+<a name="774"><span class="lineNum"> 774 </span> : : </a>
+<a name="775"><span class="lineNum"> 775 </span> :<span class="lineCov"> 90 : u32 dt_prop_get_u32_def(const struct dt_node *node, const char *prop, u32 def)</span></a>
+<a name="776"><span class="lineNum"> 776 </span> : : {</a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 90 : const struct dt_property *p = dt_find_property(node, prop);</span></a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineCov"> 90 : if (!p)</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 5 : return def;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 85 : return dt_property_get_cell(p, 0);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : }</a>
+<a name="784"><span class="lineNum"> 784 </span> : : </a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 5 : const void *dt_prop_get(const struct dt_node *node, const char *prop)</span></a>
+<a name="786"><span class="lineNum"> 786 </span> : : {</a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineCov"> 5 : const struct dt_property *p = dt_require_property(node, prop, -1);</span></a>
+<a name="788"><span class="lineNum"> 788 </span> : : </a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 5 : return p-&gt;prop;</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : }</a>
+<a name="791"><span class="lineNum"> 791 </span> : : </a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineCov"> 2 : const void *dt_prop_get_def(const struct dt_node *node, const char *prop,</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : void *def)</a>
+<a name="794"><span class="lineNum"> 794 </span> : : {</a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineCov"> 2 : const struct dt_property *p = dt_find_property(node, prop);</span></a>
+<a name="796"><span class="lineNum"> 796 </span> : : </a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineCov"> 2 : return p ? p-&gt;prop : def;</span></a>
+<a name="798"><span class="lineNum"> 798 </span> : : }</a>
+<a name="799"><span class="lineNum"> 799 </span> : : </a>
+<a name="800"><span class="lineNum"> 800 </span> :<span class="lineCov"> 2 : const void *dt_prop_get_def_size(const struct dt_node *node, const char *prop,</span></a>
+<a name="801"><span class="lineNum"> 801 </span> : : void *def, size_t *len)</a>
+<a name="802"><span class="lineNum"> 802 </span> : : {</a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineCov"> 2 : const struct dt_property *p = dt_find_property(node, prop);</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineCov"> 2 : *len = 0;</span></a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineCov"> 2 : if (p)</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineCov"> 1 : *len = p-&gt;len;</span></a>
+<a name="807"><span class="lineNum"> 807 </span> : : </a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineCov"> 2 : return p ? p-&gt;prop : def;</span></a>
+<a name="809"><span class="lineNum"> 809 </span> : : }</a>
+<a name="810"><span class="lineNum"> 810 </span> : : </a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineCov"> 4 : u32 dt_prop_get_cell(const struct dt_node *node, const char *prop, u32 cell)</span></a>
+<a name="812"><span class="lineNum"> 812 </span> : : {</a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineCov"> 4 : const struct dt_property *p = dt_require_property(node, prop, -1);</span></a>
+<a name="814"><span class="lineNum"> 814 </span> : : </a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineCov"> 4 : return dt_property_get_cell(p, cell);</span></a>
+<a name="816"><span class="lineNum"> 816 </span> : : }</a>
+<a name="817"><span class="lineNum"> 817 </span> : : </a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 2 : u32 dt_prop_get_cell_def(const struct dt_node *node, const char *prop,</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : u32 cell, u32 def)</a>
+<a name="820"><span class="lineNum"> 820 </span> : : {</a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 2 : const struct dt_property *p = dt_find_property(node, prop);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> : : </a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineCov"> 2 : if (!p)</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineCov"> 1 : return def;</span></a>
+<a name="825"><span class="lineNum"> 825 </span> : : </a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineCov"> 1 : return dt_property_get_cell(p, cell);</span></a>
+<a name="827"><span class="lineNum"> 827 </span> : : }</a>
+<a name="828"><span class="lineNum"> 828 </span> : : </a>
+<a name="829"><span class="lineNum"> 829 </span> :<span class="lineCov"> 856 : void dt_free(struct dt_node *node)</span></a>
+<a name="830"><span class="lineNum"> 830 </span> : : {</a>
+<a name="831"><span class="lineNum"> 831 </span> : : struct dt_node *child;</a>
+<a name="832"><span class="lineNum"> 832 </span> : : struct dt_property *p;</a>
+<a name="833"><span class="lineNum"> 833 </span> : : </a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineCov"> 1685 : while ((child = list_top(&amp;node-&gt;children, struct dt_node, list)))</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 829 : dt_free(child);</span></a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineCov"> 5296 : while ((p = list_pop(&amp;node-&gt;properties, struct dt_property, list))) {</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineCov"> 4440 : free_name(p-&gt;name);</span></a>
+<a name="839"><span class="lineNum"> 839 </span> :<span class="lineCov"> 4440 : free(p);</span></a>
+<a name="840"><span class="lineNum"> 840 </span> : : }</a>
+<a name="841"><span class="lineNum"> 841 </span> : : </a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineCov"> 856 : if (node-&gt;parent)</span></a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineCov"> 830 : list_del_from(&amp;node-&gt;parent-&gt;children, &amp;node-&gt;list);</span></a>
+<a name="844"><span class="lineNum"> 844 </span> :<span class="lineCov"> 856 : dt_destroy(node);</span></a>
+<a name="845"><span class="lineNum"> 845 </span> :<span class="lineCov"> 856 : }</span></a>
+<a name="846"><span class="lineNum"> 846 </span> : : </a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineCov"> 9 : int dt_expand_node(struct dt_node *node, const void *fdt, int fdt_node)</span></a>
+<a name="848"><span class="lineNum"> 848 </span> : : {</a>
+<a name="849"><span class="lineNum"> 849 </span> : : const struct fdt_property *prop;</a>
+<a name="850"><span class="lineNum"> 850 </span> : : int offset, nextoffset, err;</a>
+<a name="851"><span class="lineNum"> 851 </span> : : struct dt_node *child;</a>
+<a name="852"><span class="lineNum"> 852 </span> : : const char *name;</a>
+<a name="853"><span class="lineNum"> 853 </span> : : uint32_t tag;</a>
+<a name="854"><span class="lineNum"> 854 </span> : : </a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineCov"> 9 : if (((err = fdt_check_header(fdt)) != 0)</span></a>
+<a name="856"><span class="lineNum"> 856 </span> :<span class="lineCov"> 9 : || ((err = fdt_check_node_offset_(fdt, fdt_node)) &lt; 0)) {</span></a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FDT: Error %d parsing node 0x%x\n&quot;, err, fdt_node);</span></a>
+<a name="858"><span class="lineNum"> 858 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="859"><span class="lineNum"> 859 </span> : : }</a>
+<a name="860"><span class="lineNum"> 860 </span> : : </a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineCov"> 9 : nextoffset = err;</span></a>
+<a name="862"><span class="lineNum"> 862 </span> : : do {</a>
+<a name="863"><span class="lineNum"> 863 </span> :<span class="lineCov"> 54 : offset = nextoffset;</span></a>
+<a name="864"><span class="lineNum"> 864 </span> : : </a>
+<a name="865"><span class="lineNum"> 865 </span> :<span class="lineCov"> 54 : tag = fdt_next_tag(fdt, offset, &amp;nextoffset);</span></a>
+<a name="866"><span class="lineNum"> 866 </span> :<span class="lineCov"> 54 : switch (tag) {</span></a>
+<a name="867"><span class="lineNum"> 867 </span> :<span class="lineCov"> 38 : case FDT_PROP:</span></a>
+<a name="868"><span class="lineNum"> 868 </span> :<span class="lineCov"> 38 : prop = fdt_offset_ptr_(fdt, offset);</span></a>
+<a name="869"><span class="lineNum"> 869 </span> :<span class="lineCov"> 38 : name = fdt_string(fdt, fdt32_to_cpu(prop-&gt;nameoff));</span></a>
+<a name="870"><span class="lineNum"> 870 </span> :<span class="lineCov"> 38 : dt_add_property(node, name, prop-&gt;data,</span></a>
+<a name="871"><span class="lineNum"> 871 </span> :<span class="lineCov"> 38 : fdt32_to_cpu(prop-&gt;len));</span></a>
+<a name="872"><span class="lineNum"> 872 </span> :<span class="lineCov"> 38 : break;</span></a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineCov"> 7 : case FDT_BEGIN_NODE:</span></a>
+<a name="874"><span class="lineNum"> 874 </span> :<span class="lineCov"> 7 : name = fdt_get_name(fdt, offset, NULL);</span></a>
+<a name="875"><span class="lineNum"> 875 </span> :<span class="lineCov"> 7 : child = dt_new_root(name);</span></a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineCov"> 7 : assert(child);</span></a>
+<a name="877"><span class="lineNum"> 877 </span> :<span class="lineCov"> 7 : nextoffset = dt_expand_node(child, fdt, offset);</span></a>
+<a name="878"><span class="lineNum"> 878 </span> : : </a>
+<a name="879"><span class="lineNum"> 879 </span> : : /*</a>
+<a name="880"><span class="lineNum"> 880 </span> : : * This may fail in case of duplicate, keep it</a>
+<a name="881"><span class="lineNum"> 881 </span> : : * going for now, we may ultimately want to</a>
+<a name="882"><span class="lineNum"> 882 </span> : : * assert</a>
+<a name="883"><span class="lineNum"> 883 </span> : : */</a>
+<a name="884"><span class="lineNum"> 884 </span> :<span class="lineCov"> 7 : if (!dt_attach_root(node, child))</span></a>
+<a name="885"><span class="lineNum"> 885 </span> : : /**</a>
+<a name="886"><span class="lineNum"> 886 </span> : : * @fwts-label DTHasDuplicateNodeID</a>
+<a name="887"><span class="lineNum"> 887 </span> : : * @fwts-advice OPAL will parse the Flattened</a>
+<a name="888"><span class="lineNum"> 888 </span> : : * Device Tree(FDT), which can be generated</a>
+<a name="889"><span class="lineNum"> 889 </span> : : * from different firmware sources. During</a>
+<a name="890"><span class="lineNum"> 890 </span> : : * expansion of FDT, OPAL observed a node</a>
+<a name="891"><span class="lineNum"> 891 </span> : : * assigned multiple times (a duplicate). This</a>
+<a name="892"><span class="lineNum"> 892 </span> : : * indicates either a Hostboot bug *OR*, more</a>
+<a name="893"><span class="lineNum"> 893 </span> : : * likely, a bug in the platform XML. Check</a>
+<a name="894"><span class="lineNum"> 894 </span> : : * the platform XML for duplicate IDs for</a>
+<a name="895"><span class="lineNum"> 895 </span> : : * this type of device. Because of this</a>
+<a name="896"><span class="lineNum"> 896 </span> : : * duplicate node, OPAL won't add the hardware</a>
+<a name="897"><span class="lineNum"> 897 </span> : : * device found with a duplicate node ID into</a>
+<a name="898"><span class="lineNum"> 898 </span> : : * DT, rendering the corresponding device not</a>
+<a name="899"><span class="lineNum"> 899 </span> : : * functional.</a>
+<a name="900"><span class="lineNum"> 900 </span> : : */</a>
+<a name="901"><span class="lineNum"> 901 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;DT: Found duplicate node: %s\n&quot;,</span></a>
+<a name="902"><span class="lineNum"> 902 </span> : : child-&gt;name);</a>
+<a name="903"><span class="lineNum"> 903 </span> :<span class="lineCov"> 7 : break;</span></a>
+<a name="904"><span class="lineNum"> 904 </span> :<span class="lineNoCov"> 0 : case FDT_END:</span></a>
+<a name="905"><span class="lineNum"> 905 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="906"><span class="lineNum"> 906 </span> : : }</a>
+<a name="907"><span class="lineNum"> 907 </span> :<span class="lineCov"> 54 : } while (tag != FDT_END_NODE);</span></a>
+<a name="908"><span class="lineNum"> 908 </span> : : </a>
+<a name="909"><span class="lineNum"> 909 </span> :<span class="lineCov"> 9 : return nextoffset;</span></a>
+<a name="910"><span class="lineNum"> 910 </span> : : }</a>
+<a name="911"><span class="lineNum"> 911 </span> : : </a>
+<a name="912"><span class="lineNum"> 912 </span> :<span class="lineNoCov"> 0 : void dt_expand(const void *fdt)</span></a>
+<a name="913"><span class="lineNum"> 913 </span> : : {</a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;FDT: Parsing fdt @%p\n&quot;, fdt);</span></a>
+<a name="915"><span class="lineNum"> 915 </span> : : </a>
+<a name="916"><span class="lineNum"> 916 </span> :<span class="lineNoCov"> 0 : if (dt_expand_node(dt_root, fdt, 0) &lt; 0)</span></a>
+<a name="917"><span class="lineNum"> 917 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="918"><span class="lineNum"> 918 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="919"><span class="lineNum"> 919 </span> : : </a>
+<a name="920"><span class="lineNum"> 920 </span> :<span class="lineCov"> 107 : u64 dt_get_number(const void *pdata, unsigned int cells)</span></a>
+<a name="921"><span class="lineNum"> 921 </span> : : {</a>
+<a name="922"><span class="lineNum"> 922 </span> :<span class="lineCov"> 107 : const __be32 *p = pdata;</span></a>
+<a name="923"><span class="lineNum"> 923 </span> :<span class="lineCov"> 107 : u64 ret = 0;</span></a>
+<a name="924"><span class="lineNum"> 924 </span> : : </a>
+<a name="925"><span class="lineNum"> 925 </span> :<span class="lineCov"> 303 : while(cells--)</span></a>
+<a name="926"><span class="lineNum"> 926 </span> :<span class="lineCov"> 196 : ret = (ret &lt;&lt; 32) | be32_to_cpu(*(p++));</span></a>
+<a name="927"><span class="lineNum"> 927 </span> :<span class="lineCov"> 107 : return ret;</span></a>
+<a name="928"><span class="lineNum"> 928 </span> : : }</a>
+<a name="929"><span class="lineNum"> 929 </span> : : </a>
+<a name="930"><span class="lineNum"> 930 </span> :<span class="lineCov"> 41 : u32 dt_n_address_cells(const struct dt_node *node)</span></a>
+<a name="931"><span class="lineNum"> 931 </span> : : {</a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineCov"> 41 : if (!node-&gt;parent)</span></a>
+<a name="933"><span class="lineNum"> 933 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineCov"> 41 : return dt_prop_get_u32_def(node-&gt;parent, &quot;#address-cells&quot;, 2);</span></a>
+<a name="935"><span class="lineNum"> 935 </span> : : }</a>
+<a name="936"><span class="lineNum"> 936 </span> : : </a>
+<a name="937"><span class="lineNum"> 937 </span> :<span class="lineCov"> 35 : u32 dt_n_size_cells(const struct dt_node *node)</span></a>
+<a name="938"><span class="lineNum"> 938 </span> : : {</a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineCov"> 35 : if (!node-&gt;parent)</span></a>
+<a name="940"><span class="lineNum"> 940 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="941"><span class="lineNum"> 941 </span> :<span class="lineCov"> 35 : return dt_prop_get_u32_def(node-&gt;parent, &quot;#size-cells&quot;, 1);</span></a>
+<a name="942"><span class="lineNum"> 942 </span> : : }</a>
+<a name="943"><span class="lineNum"> 943 </span> : : </a>
+<a name="944"><span class="lineNum"> 944 </span> :<span class="lineCov"> 35 : u64 dt_get_address(const struct dt_node *node, unsigned int index,</span></a>
+<a name="945"><span class="lineNum"> 945 </span> : : u64 *out_size)</a>
+<a name="946"><span class="lineNum"> 946 </span> : : {</a>
+<a name="947"><span class="lineNum"> 947 </span> : : const struct dt_property *p;</a>
+<a name="948"><span class="lineNum"> 948 </span> :<span class="lineCov"> 35 : u32 na = dt_n_address_cells(node);</span></a>
+<a name="949"><span class="lineNum"> 949 </span> :<span class="lineCov"> 35 : u32 ns = dt_n_size_cells(node);</span></a>
+<a name="950"><span class="lineNum"> 950 </span> : : u32 pos, n;</a>
+<a name="951"><span class="lineNum"> 951 </span> : : </a>
+<a name="952"><span class="lineNum"> 952 </span> :<span class="lineCov"> 35 : p = dt_require_property(node, &quot;reg&quot;, -1);</span></a>
+<a name="953"><span class="lineNum"> 953 </span> :<span class="lineCov"> 35 : n = (na + ns) * sizeof(u32);</span></a>
+<a name="954"><span class="lineNum"> 954 </span> :<span class="lineCov"> 35 : pos = n * index;</span></a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineCov"> 35 : assert((pos + n) &lt;= p-&gt;len);</span></a>
+<a name="956"><span class="lineNum"> 956 </span> :<span class="lineCov"> 35 : if (out_size)</span></a>
+<a name="957"><span class="lineNum"> 957 </span> :<span class="lineCov"> 31 : *out_size = dt_get_number(p-&gt;prop + pos + na * sizeof(u32), ns);</span></a>
+<a name="958"><span class="lineNum"> 958 </span> :<span class="lineCov"> 35 : return dt_get_number(p-&gt;prop + pos, na);</span></a>
+<a name="959"><span class="lineNum"> 959 </span> : : }</a>
+<a name="960"><span class="lineNum"> 960 </span> : : </a>
+<a name="961"><span class="lineNum"> 961 </span> :<span class="lineCov"> 389 : u32 __dt_get_chip_id(const struct dt_node *node)</span></a>
+<a name="962"><span class="lineNum"> 962 </span> : : {</a>
+<a name="963"><span class="lineNum"> 963 </span> : : const struct dt_property *prop;</a>
+<a name="964"><span class="lineNum"> 964 </span> : : </a>
+<a name="965"><span class="lineNum"> 965 </span> :<span class="lineCov"> 1307 : for (; node; node = node-&gt;parent) {</span></a>
+<a name="966"><span class="lineNum"> 966 </span> :<span class="lineCov"> 1050 : prop = dt_find_property(node, &quot;ibm,chip-id&quot;);</span></a>
+<a name="967"><span class="lineNum"> 967 </span> :<span class="lineCov"> 1050 : if (prop)</span></a>
+<a name="968"><span class="lineNum"> 968 </span> :<span class="lineCov"> 132 : return dt_property_get_cell(prop, 0);</span></a>
+<a name="969"><span class="lineNum"> 969 </span> : : }</a>
+<a name="970"><span class="lineNum"> 970 </span> :<span class="lineCov"> 257 : return 0xffffffff;</span></a>
+<a name="971"><span class="lineNum"> 971 </span> : : }</a>
+<a name="972"><span class="lineNum"> 972 </span> : : </a>
+<a name="973"><span class="lineNum"> 973 </span> :<span class="lineCov"> 41 : u32 dt_get_chip_id(const struct dt_node *node)</span></a>
+<a name="974"><span class="lineNum"> 974 </span> : : {</a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineCov"> 41 : u32 id = __dt_get_chip_id(node);</span></a>
+<a name="976"><span class="lineNum"> 976 </span> :<span class="lineCov"> 41 : assert(id != 0xffffffff);</span></a>
+<a name="977"><span class="lineNum"> 977 </span> :<span class="lineCov"> 41 : return id;</span></a>
+<a name="978"><span class="lineNum"> 978 </span> : : }</a>
+<a name="979"><span class="lineNum"> 979 </span> : : </a>
+<a name="980"><span class="lineNum"> 980 </span> :<span class="lineCov"> 8 : struct dt_node *dt_find_compatible_node_on_chip(struct dt_node *root,</span></a>
+<a name="981"><span class="lineNum"> 981 </span> : : struct dt_node *prev,</a>
+<a name="982"><span class="lineNum"> 982 </span> : : const char *compat,</a>
+<a name="983"><span class="lineNum"> 983 </span> : : uint32_t chip_id)</a>
+<a name="984"><span class="lineNum"> 984 </span> : : {</a>
+<a name="985"><span class="lineNum"> 985 </span> :<span class="lineCov"> 8 : struct dt_node *node = prev;</span></a>
+<a name="986"><span class="lineNum"> 986 </span> : : </a>
+<a name="987"><span class="lineNum"> 987 </span> :<span class="lineCov"> 350 : while ((node = dt_next(root, node))) {</span></a>
+<a name="988"><span class="lineNum"> 988 </span> :<span class="lineCov"> 348 : u32 cid = __dt_get_chip_id(node);</span></a>
+<a name="989"><span class="lineNum"> 989 </span> :<span class="lineCov"> 384 : if (cid == chip_id &amp;&amp;</span></a>
+<a name="990"><span class="lineNum"> 990 </span> :<span class="lineCov"> 36 : dt_node_is_compatible(node, compat))</span></a>
+<a name="991"><span class="lineNum"> 991 </span> :<span class="lineCov"> 6 : return node;</span></a>
+<a name="992"><span class="lineNum"> 992 </span> : : }</a>
+<a name="993"><span class="lineNum"> 993 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
+<a name="994"><span class="lineNum"> 994 </span> : : }</a>
+<a name="995"><span class="lineNum"> 995 </span> : : </a>
+<a name="996"><span class="lineNum"> 996 </span> :<span class="lineNoCov"> 0 : unsigned int dt_count_addresses(const struct dt_node *node)</span></a>
+<a name="997"><span class="lineNum"> 997 </span> : : {</a>
+<a name="998"><span class="lineNum"> 998 </span> : : const struct dt_property *p;</a>
+<a name="999"><span class="lineNum"> 999 </span> :<span class="lineNoCov"> 0 : u32 na = dt_n_address_cells(node);</span></a>
+<a name="1000"><span class="lineNum"> 1000 </span> :<span class="lineNoCov"> 0 : u32 ns = dt_n_size_cells(node);</span></a>
+<a name="1001"><span class="lineNum"> 1001 </span> : : u32 n;</a>
+<a name="1002"><span class="lineNum"> 1002 </span> : : </a>
+<a name="1003"><span class="lineNum"> 1003 </span> :<span class="lineNoCov"> 0 : p = dt_require_property(node, &quot;reg&quot;, -1);</span></a>
+<a name="1004"><span class="lineNum"> 1004 </span> :<span class="lineNoCov"> 0 : n = (na + ns) * sizeof(u32);</span></a>
+<a name="1005"><span class="lineNum"> 1005 </span> : : </a>
+<a name="1006"><span class="lineNum"> 1006 </span> :<span class="lineNoCov"> 0 : if (n == 0)</span></a>
+<a name="1007"><span class="lineNum"> 1007 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="1008"><span class="lineNum"> 1008 </span> : : </a>
+<a name="1009"><span class="lineNum"> 1009 </span> :<span class="lineNoCov"> 0 : return p-&gt;len / n;</span></a>
+<a name="1010"><span class="lineNum"> 1010 </span> : : }</a>
+<a name="1011"><span class="lineNum"> 1011 </span> : : </a>
+<a name="1012"><span class="lineNum"> 1012 </span> : : /* Translates an address from the given bus into its parent's address space */</a>
+<a name="1013"><span class="lineNum"> 1013 </span> :<span class="lineCov"> 6 : static u64 dt_translate_one(const struct dt_node *bus, u64 addr)</span></a>
+<a name="1014"><span class="lineNum"> 1014 </span> : : {</a>
+<a name="1015"><span class="lineNum"> 1015 </span> : : u32 ranges_count, na, ns, parent_na;</a>
+<a name="1016"><span class="lineNum"> 1016 </span> : : const struct dt_property *p;</a>
+<a name="1017"><span class="lineNum"> 1017 </span> : : const u32 *ranges;</a>
+<a name="1018"><span class="lineNum"> 1018 </span> : : int i, stride;</a>
+<a name="1019"><span class="lineNum"> 1019 </span> : : </a>
+<a name="1020"><span class="lineNum"> 1020 </span> :<span class="lineCov"> 6 : assert(bus-&gt;parent);</span></a>
+<a name="1021"><span class="lineNum"> 1021 </span> : : </a>
+<a name="1022"><span class="lineNum"> 1022 </span> :<span class="lineCov"> 6 : na = dt_prop_get_u32_def(bus, &quot;#address-cells&quot;, 2);</span></a>
+<a name="1023"><span class="lineNum"> 1023 </span> :<span class="lineCov"> 6 : ns = dt_prop_get_u32_def(bus, &quot;#size-cells&quot;, 2);</span></a>
+<a name="1024"><span class="lineNum"> 1024 </span> :<span class="lineCov"> 6 : parent_na = dt_n_address_cells(bus);</span></a>
+<a name="1025"><span class="lineNum"> 1025 </span> : : </a>
+<a name="1026"><span class="lineNum"> 1026 </span> :<span class="lineCov"> 6 : stride = na + ns + parent_na;</span></a>
+<a name="1027"><span class="lineNum"> 1027 </span> : : </a>
+<a name="1028"><span class="lineNum"> 1028 </span> : : /*</a>
+<a name="1029"><span class="lineNum"> 1029 </span> : : * FIXME: We should handle arbitrary length addresses, rather than</a>
+<a name="1030"><span class="lineNum"> 1030 </span> : : * limiting it to 64bit. If someone wants/needs that they</a>
+<a name="1031"><span class="lineNum"> 1031 </span> : : * can implement the bignum math for it :)</a>
+<a name="1032"><span class="lineNum"> 1032 </span> : : */</a>
+<a name="1033"><span class="lineNum"> 1033 </span> :<span class="lineCov"> 6 : assert(na &lt;= 2);</span></a>
+<a name="1034"><span class="lineNum"> 1034 </span> :<span class="lineCov"> 6 : assert(parent_na &lt;= 2);</span></a>
+<a name="1035"><span class="lineNum"> 1035 </span> : : </a>
+<a name="1036"><span class="lineNum"> 1036 </span> : : /* We should never be trying to translate an address without a ranges */</a>
+<a name="1037"><span class="lineNum"> 1037 </span> :<span class="lineCov"> 6 : p = dt_require_property(bus, &quot;ranges&quot;, -1);</span></a>
+<a name="1038"><span class="lineNum"> 1038 </span> : : </a>
+<a name="1039"><span class="lineNum"> 1039 </span> :<span class="lineCov"> 6 : ranges = (u32 *) &amp;p-&gt;prop;</span></a>
+<a name="1040"><span class="lineNum"> 1040 </span> :<span class="lineCov"> 6 : ranges_count = (p-&gt;len / 4) / (na + parent_na + ns);</span></a>
+<a name="1041"><span class="lineNum"> 1041 </span> : : </a>
+<a name="1042"><span class="lineNum"> 1042 </span> : : /* An empty ranges property implies 1-1 translation */</a>
+<a name="1043"><span class="lineNum"> 1043 </span> :<span class="lineCov"> 6 : if (ranges_count == 0)</span></a>
+<a name="1044"><span class="lineNum"> 1044 </span> :<span class="lineNoCov"> 0 : return addr;</span></a>
+<a name="1045"><span class="lineNum"> 1045 </span> : : </a>
+<a name="1046"><span class="lineNum"> 1046 </span> :<span class="lineCov"> 7 : for (i = 0; i &lt; ranges_count; i++, ranges += stride) {</span></a>
+<a name="1047"><span class="lineNum"> 1047 </span> : : /* ranges format: &lt;child base&gt; &lt;parent base&gt; &lt;size&gt; */</a>
+<a name="1048"><span class="lineNum"> 1048 </span> :<span class="lineCov"> 7 : u64 child_base = dt_get_number(ranges, na);</span></a>
+<a name="1049"><span class="lineNum"> 1049 </span> :<span class="lineCov"> 7 : u64 parent_base = dt_get_number(ranges + na, parent_na);</span></a>
+<a name="1050"><span class="lineNum"> 1050 </span> :<span class="lineCov"> 7 : u64 size = dt_get_number(ranges + na + parent_na, ns);</span></a>
+<a name="1051"><span class="lineNum"> 1051 </span> : : </a>
+<a name="1052"><span class="lineNum"> 1052 </span> :<span class="lineCov"> 7 : if (addr &gt;= child_base &amp;&amp; addr &lt; child_base + size)</span></a>
+<a name="1053"><span class="lineNum"> 1053 </span> :<span class="lineCov"> 6 : return (addr - child_base) + parent_base;</span></a>
+<a name="1054"><span class="lineNum"> 1054 </span> : : }</a>
+<a name="1055"><span class="lineNum"> 1055 </span> : : </a>
+<a name="1056"><span class="lineNum"> 1056 </span> : : /* input address was outside the any of our mapped ranges */</a>
+<a name="1057"><span class="lineNum"> 1057 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="1058"><span class="lineNum"> 1058 </span> : : }</a>
+<a name="1059"><span class="lineNum"> 1059 </span> : : </a>
+<a name="1060"><span class="lineNum"> 1060 </span> :<span class="lineCov"> 4 : u64 dt_translate_address(const struct dt_node *node, unsigned int index,</span></a>
+<a name="1061"><span class="lineNum"> 1061 </span> : : u64 *out_size)</a>
+<a name="1062"><span class="lineNum"> 1062 </span> : : {</a>
+<a name="1063"><span class="lineNum"> 1063 </span> :<span class="lineCov"> 4 : u64 addr = dt_get_address(node, index, NULL);</span></a>
+<a name="1064"><span class="lineNum"> 1064 </span> :<span class="lineCov"> 4 : struct dt_node *bus = node-&gt;parent;</span></a>
+<a name="1065"><span class="lineNum"> 1065 </span> : : </a>
+<a name="1066"><span class="lineNum"> 1066 </span> : : /* FIXME: One day we will probably want to use this, but for now just</a>
+<a name="1067"><span class="lineNum"> 1067 </span> : : * force it it to be zero since we only support returning a u64 or u32</a>
+<a name="1068"><span class="lineNum"> 1068 </span> : : */</a>
+<a name="1069"><span class="lineNum"> 1069 </span> :<span class="lineCov"> 4 : assert(!out_size);</span></a>
+<a name="1070"><span class="lineNum"> 1070 </span> : : </a>
+<a name="1071"><span class="lineNum"> 1071 </span> : : /* apply each translation until we hit the root bus */</a>
+<a name="1072"><span class="lineNum"> 1072 </span> :<span class="lineCov"> 10 : while (bus-&gt;parent) {</span></a>
+<a name="1073"><span class="lineNum"> 1073 </span> :<span class="lineCov"> 6 : addr = dt_translate_one(bus, addr);</span></a>
+<a name="1074"><span class="lineNum"> 1074 </span> :<span class="lineCov"> 6 : bus = bus-&gt;parent;</span></a>
+<a name="1075"><span class="lineNum"> 1075 </span> : : }</a>
+<a name="1076"><span class="lineNum"> 1076 </span> : : </a>
+<a name="1077"><span class="lineNum"> 1077 </span> :<span class="lineCov"> 4 : return addr;</span></a>
+<a name="1078"><span class="lineNum"> 1078 </span> : : }</a>
+<a name="1079"><span class="lineNum"> 1079 </span> : : </a>
+<a name="1080"><span class="lineNum"> 1080 </span> :<span class="lineNoCov"> 0 : bool dt_node_is_enabled(struct dt_node *node)</span></a>
+<a name="1081"><span class="lineNum"> 1081 </span> : : {</a>
+<a name="1082"><span class="lineNum"> 1082 </span> :<span class="lineNoCov"> 0 : const struct dt_property *p = dt_find_property(node, &quot;status&quot;);</span></a>
+<a name="1083"><span class="lineNum"> 1083 </span> : : </a>
+<a name="1084"><span class="lineNum"> 1084 </span> :<span class="lineNoCov"> 0 : if (!p)</span></a>
+<a name="1085"><span class="lineNum"> 1085 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="1086"><span class="lineNum"> 1086 </span> : : </a>
+<a name="1087"><span class="lineNum"> 1087 </span> :<span class="lineNoCov"> 0 : return p-&gt;len &gt; 1 &amp;&amp; p-&gt;prop[0] == 'o' &amp;&amp; p-&gt;prop[1] == 'k';</span></a>
+<a name="1088"><span class="lineNum"> 1088 </span> : : }</a>
+<a name="1089"><span class="lineNum"> 1089 </span> : : </a>
+<a name="1090"><span class="lineNum"> 1090 </span> : : /*</a>
+<a name="1091"><span class="lineNum"> 1091 </span> : : * Function to fixup the phandle in the subtree.</a>
+<a name="1092"><span class="lineNum"> 1092 </span> : : */</a>
+<a name="1093"><span class="lineNum"> 1093 </span> :<span class="lineCov"> 1 : void dt_adjust_subtree_phandle(struct dt_node *dev,</span></a>
+<a name="1094"><span class="lineNum"> 1094 </span> : : const char** (get_properties_to_fix)(struct dt_node *n))</a>
+<a name="1095"><span class="lineNum"> 1095 </span> : : {</a>
+<a name="1096"><span class="lineNum"> 1096 </span> : : struct dt_node *node;</a>
+<a name="1097"><span class="lineNum"> 1097 </span> : : struct dt_property *prop;</a>
+<a name="1098"><span class="lineNum"> 1098 </span> :<span class="lineCov"> 1 : u32 phandle, max_phandle = 0, import_phandle = new_phandle();</span></a>
+<a name="1099"><span class="lineNum"> 1099 </span> : : __be32 p;</a>
+<a name="1100"><span class="lineNum"> 1100 </span> : : const char **name;</a>
+<a name="1101"><span class="lineNum"> 1101 </span> : : </a>
+<a name="1102"><span class="lineNum"> 1102 </span> :<span class="lineCov"> 7 : dt_for_each_node(dev, node) {</span></a>
+<a name="1103"><span class="lineNum"> 1103 </span> : : const char **props_to_update;</a>
+<a name="1104"><span class="lineNum"> 1104 </span> :<span class="lineCov"> 6 : node-&gt;phandle += import_phandle;</span></a>
+<a name="1105"><span class="lineNum"> 1105 </span> : : </a>
+<a name="1106"><span class="lineNum"> 1106 </span> : : /*</a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : * calculate max_phandle(new_tree), needed to update</a>
+<a name="1108"><span class="lineNum"> 1108 </span> : : * last_phandle.</a>
+<a name="1109"><span class="lineNum"> 1109 </span> : : */</a>
+<a name="1110"><span class="lineNum"> 1110 </span> :<span class="lineCov"> 6 : if (node-&gt;phandle &gt;= max_phandle)</span></a>
+<a name="1111"><span class="lineNum"> 1111 </span> :<span class="lineCov"> 6 : max_phandle = node-&gt;phandle;</span></a>
+<a name="1112"><span class="lineNum"> 1112 </span> : : </a>
+<a name="1113"><span class="lineNum"> 1113 </span> :<span class="lineCov"> 6 : props_to_update = get_properties_to_fix(node);</span></a>
+<a name="1114"><span class="lineNum"> 1114 </span> :<span class="lineCov"> 6 : if (!props_to_update)</span></a>
+<a name="1115"><span class="lineNum"> 1115 </span> :<span class="lineCov"> 4 : continue;</span></a>
+<a name="1116"><span class="lineNum"> 1116 </span> :<span class="lineCov"> 4 : for (name = props_to_update; *name != NULL; name++) {</span></a>
+<a name="1117"><span class="lineNum"> 1117 </span> :<span class="lineCov"> 2 : prop = __dt_find_property(node, *name);</span></a>
+<a name="1118"><span class="lineNum"> 1118 </span> :<span class="lineCov"> 2 : if (!prop)</span></a>
+<a name="1119"><span class="lineNum"> 1119 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1120"><span class="lineNum"> 1120 </span> :<span class="lineCov"> 2 : phandle = dt_prop_get_u32(node, *name);</span></a>
+<a name="1121"><span class="lineNum"> 1121 </span> :<span class="lineCov"> 2 : phandle += import_phandle;</span></a>
+<a name="1122"><span class="lineNum"> 1122 </span> :<span class="lineCov"> 2 : p = cpu_to_be32(phandle);</span></a>
+<a name="1123"><span class="lineNum"> 1123 </span> :<span class="lineCov"> 2 : memcpy((char *)&amp;prop-&gt;prop, &amp;p, prop-&gt;len);</span></a>
+<a name="1124"><span class="lineNum"> 1124 </span> : : }</a>
+<a name="1125"><span class="lineNum"> 1125 </span> : : }</a>
+<a name="1126"><span class="lineNum"> 1126 </span> : : </a>
+<a name="1127"><span class="lineNum"> 1127 </span> :<span class="lineCov"> 1 : set_last_phandle(max_phandle);</span></a>
+<a name="1128"><span class="lineNum"> 1128 </span> :<span class="lineCov"> 1 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/fdt.c.func-sort-c.html b/coverage-report/core/fdt.c.func-sort-c.html
new file mode 100644
index 0000000..3b63d2f
--- /dev/null
+++ b/coverage-report/core/fdt.c.func-sort-c.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/fdt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - fdt.c<span style="font-size: 80%;"> (<a href="fdt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">101</td>
+ <td class="headerCovTableEntryLo">63.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">90.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="fdt.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#215">opal_get_device_tree</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#156">__create_dtb</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#187">create_dtb</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#134">create_dtb_reservemap</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#44">dt_begin_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#56">dt_end_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#39">dt_property_cell</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#116">flatten_dt_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#103">flatten_dt_properties</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#51">dt_property</a></td>
+ <td class="coverFnHi">2549</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#28">__save_err</a></td>
+ <td class="coverFnHi">3269</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/fdt.c.func.html b/coverage-report/core/fdt.c.func.html
new file mode 100644
index 0000000..d69aea5
--- /dev/null
+++ b/coverage-report/core/fdt.c.func.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/fdt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - fdt.c<span style="font-size: 80%;"> (<a href="fdt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">101</td>
+ <td class="headerCovTableEntryLo">63.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">90.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="fdt.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#156">__create_dtb</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#28">__save_err</a></td>
+ <td class="coverFnHi">3269</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#187">create_dtb</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#134">create_dtb_reservemap</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#44">dt_begin_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#56">dt_end_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#51">dt_property</a></td>
+ <td class="coverFnHi">2549</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#39">dt_property_cell</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#116">flatten_dt_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#103">flatten_dt_properties</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#215">opal_get_device_tree</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/fdt.c.gcov.html b/coverage-report/core/fdt.c.gcov.html
new file mode 100644
index 0000000..58e0792
--- /dev/null
+++ b/coverage-report/core/fdt.c.gcov.html
@@ -0,0 +1,343 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/fdt.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - fdt.c<span style="font-size: 80%;"> (source / <a href="fdt.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">101</td>
+ <td class="headerCovTableEntryLo">63.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">90.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Produce and consume flattened device trees</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;libfdt.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;device.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;chip.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;opal.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;interrupts.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;fsp.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;cec.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : static int fdt_error;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : #undef DEBUG_FDT</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #ifdef DEBUG_FDT</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #define FDT_DBG(fmt, a...) prlog(PR_DEBUG, &quot;FDT: &quot; fmt, ##a)</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #else</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define FDT_DBG(fmt, a...)</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #endif</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 3269 : static void __save_err(int err, const char *str)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : {</a>
+<a name="32"><span class="lineNum"> 32 </span> : : FDT_DBG(&quot;rc: %d from \&quot;%s\&quot;\n&quot;, err, str);</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 3269 : if (err &amp;&amp; !fdt_error) {</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FDT: Error %d from \&quot;%s\&quot;\n&quot;, err, str);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : fdt_error = err;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 3269 : }</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define save_err(...) __save_err(__VA_ARGS__, #__VA_ARGS__)</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 236 : static void dt_property_cell(void *fdt, const char *name, u32 cell)</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : {</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 236 : save_err(fdt_property_cell(fdt, name, cell));</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 236 : }</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 236 : static void dt_begin_node(void *fdt, const struct dt_node *dn)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 236 : save_err(fdt_begin_node(fdt, dn-&gt;name));</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 236 : dt_property_cell(fdt, &quot;phandle&quot;, dn-&gt;phandle);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 236 : }</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 2549 : static void dt_property(void *fdt, const struct dt_property *p)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 2549 : save_err(fdt_property(fdt, p-&gt;name, p-&gt;prop, p-&gt;len));</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 2549 : }</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 236 : static void dt_end_node(void *fdt)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 236 : save_err(fdt_end_node(fdt));</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 236 : }</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : #ifdef DEBUG_FDT</a>
+<a name="64"><span class="lineNum"> 64 </span> : : static void dump_fdt(void *fdt)</a>
+<a name="65"><span class="lineNum"> 65 </span> : : {</a>
+<a name="66"><span class="lineNum"> 66 </span> : : int i, off, depth, err;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> : : prlog(PR_INFO, &quot;Device tree %u@%p\n&quot;, fdt_totalsize(fdt), fdt);</a>
+<a name="69"><span class="lineNum"> 69 </span> : : err = fdt_check_header(fdt);</a>
+<a name="70"><span class="lineNum"> 70 </span> : : if (err) {</a>
+<a name="71"><span class="lineNum"> 71 </span> : : prerror(&quot;fdt_check_header: %s\n&quot;, fdt_strerror(err));</a>
+<a name="72"><span class="lineNum"> 72 </span> : : return;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : prlog(PR_INFO, &quot;fdt_check_header passed\n&quot;);</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : prlog(PR_INFO, &quot;fdt_num_mem_rsv = %u\n&quot;, fdt_num_mem_rsv(fdt));</a>
+<a name="77"><span class="lineNum"> 77 </span> : : for (i = 0; i &lt; fdt_num_mem_rsv(fdt); i++) {</a>
+<a name="78"><span class="lineNum"> 78 </span> : : u64 addr, size;</a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : err = fdt_get_mem_rsv(fdt, i, &amp;addr, &amp;size);</a>
+<a name="81"><span class="lineNum"> 81 </span> : : if (err) {</a>
+<a name="82"><span class="lineNum"> 82 </span> : : prlog(PR_INFO, &quot; ERR %s\n&quot;, fdt_strerror(err));</a>
+<a name="83"><span class="lineNum"> 83 </span> : : return;</a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : prlog(PR_INFO, &quot; mem_rsv[%i] = %lu@%#lx\n&quot;,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : i, (long)addr, (long)size);</a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : for (off = fdt_next_node(fdt, 0, &amp;depth);</a>
+<a name="90"><span class="lineNum"> 90 </span> : : off &gt; 0;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : off = fdt_next_node(fdt, off, &amp;depth)) {</a>
+<a name="92"><span class="lineNum"> 92 </span> : : int len;</a>
+<a name="93"><span class="lineNum"> 93 </span> : : const char *name;</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : name = fdt_get_name(fdt, off, &amp;len);</a>
+<a name="96"><span class="lineNum"> 96 </span> : : if (!name) {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : prerror(&quot;fdt: offset %i no name!\n&quot;, off);</a>
+<a name="98"><span class="lineNum"> 98 </span> : : return;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : }</a>
+<a name="100"><span class="lineNum"> 100 </span> : : prlog(PR_INFO, &quot;name: %s [%u]\n&quot;, name, off);</a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : }</a>
+<a name="103"><span class="lineNum"> 103 </span> : : #endif</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 236 : static void flatten_dt_properties(void *fdt, const struct dt_node *dn)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : {</a>
+<a name="107"><span class="lineNum"> 107 </span> : : const struct dt_property *p;</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 2793 : list_for_each(&amp;dn-&gt;properties, p, list) {</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 2557 : if (strstarts(p-&gt;name, DT_PRIVATE))</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 8 : continue;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : FDT_DBG(&quot; prop: %s size: %ld\n&quot;, p-&gt;name, p-&gt;len);</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 2549 : dt_property(fdt, p);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : }</a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 236 : }</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 236 : static void flatten_dt_node(void *fdt, const struct dt_node *root,</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : bool exclusive)</a>
+<a name="120"><span class="lineNum"> 120 </span> : : {</a>
+<a name="121"><span class="lineNum"> 121 </span> : : const struct dt_node *i;</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 236 : if (!exclusive) {</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : FDT_DBG(&quot;node: %s\n&quot;, root-&gt;name);</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 236 : dt_begin_node(fdt, root);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 236 : flatten_dt_properties(fdt, root);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : }</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 470 : list_for_each(&amp;root-&gt;children, i, list)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 234 : flatten_dt_node(fdt, i, false);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 236 : if (!exclusive)</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 236 : dt_end_node(fdt);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 236 : }</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 2 : static void create_dtb_reservemap(void *fdt, const struct dt_node *root)</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : {</a>
+<a name="138"><span class="lineNum"> 138 </span> : : uint64_t base, size;</a>
+<a name="139"><span class="lineNum"> 139 </span> : : const __be64 *ranges;</a>
+<a name="140"><span class="lineNum"> 140 </span> : : const struct dt_property *prop;</a>
+<a name="141"><span class="lineNum"> 141 </span> : : int i;</a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : /* Duplicate the reserved-ranges property into the fdt reservemap */</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 2 : prop = dt_find_property(root, &quot;reserved-ranges&quot;);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 2 : if (prop) {</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 2 : ranges = (const void *)prop-&gt;prop;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 8 : for (i = 0; i &lt; prop-&gt;len / (sizeof(uint64_t) * 2); i++) {</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 6 : base = be64_to_cpu(*(ranges++));</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 6 : size = be64_to_cpu(*(ranges++));</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 6 : save_err(fdt_add_reservemap_entry(fdt, base, size));</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : }</a>
+<a name="153"><span class="lineNum"> 153 </span> : : }</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 2 : save_err(fdt_finish_reservemap(fdt));</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 2 : static int __create_dtb(void *fdt, size_t len,</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : const struct dt_node *root,</a>
+<a name="160"><span class="lineNum"> 160 </span> : : bool exclusive)</a>
+<a name="161"><span class="lineNum"> 161 </span> : : {</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 2 : if (chip_quirk(QUIRK_SLOW_SIM))</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : save_err(fdt_create_with_flags(fdt, len, FDT_CREATE_FLAG_NO_NAME_DEDUP));</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : else</a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 2 : save_err(fdt_create_with_flags(fdt, len, 0));</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 2 : if (fdt_error)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 2 : if (root == dt_root &amp;&amp; !exclusive)</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 2 : create_dtb_reservemap(fdt, root);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : else</a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineNoCov"> 0 : save_err(fdt_finish_reservemap(fdt));</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 2 : flatten_dt_node(fdt, root, exclusive);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 2 : save_err(fdt_finish(fdt));</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 2 : if (fdt_error) {</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : prerror(&quot;dtb: error %s\n&quot;, fdt_strerror(fdt_error));</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : return fdt_error;</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : }</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> : : #ifdef DEBUG_FDT</a>
+<a name="184"><span class="lineNum"> 184 </span> : : dump_fdt(fdt);</a>
+<a name="185"><span class="lineNum"> 185 </span> : : #endif</a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : }</a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 2 : void *create_dtb(const struct dt_node *root, bool exclusive)</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : {</a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 2 : void *fdt = NULL;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 2 : size_t len = DEVICE_TREE_MAX_SIZE;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 2 : uint32_t old_last_phandle = get_last_phandle();</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : int ret;</a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> : : do {</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 2 : set_last_phandle(old_last_phandle);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 2 : fdt_error = 0;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 2 : fdt = malloc(len);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 2 : if (!fdt) {</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : prerror(&quot;dtb: could not malloc %lu\n&quot;, (long)len);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="203"><span class="lineNum"> 203 </span> : : }</a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 2 : ret = __create_dtb(fdt, len, root, exclusive);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 2 : if (ret) {</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : free(fdt);</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : fdt = NULL;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 2 : len *= 2;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 2 : } while (ret == -FDT_ERR_NOSPACE);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 2 : return fdt;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : static int64_t opal_get_device_tree(uint32_t phandle,</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : uint64_t buf, uint64_t len)</a>
+<a name="219"><span class="lineNum"> 219 </span> : : {</a>
+<a name="220"><span class="lineNum"> 220 </span> : : struct dt_node *root;</a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : void *fdt = (void *)buf;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : uint32_t old_last_phandle;</a>
+<a name="223"><span class="lineNum"> 223 </span> : : int64_t totalsize;</a>
+<a name="224"><span class="lineNum"> 224 </span> : : int ret;</a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : if (!opal_addr_valid(fdt))</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : root = dt_find_by_phandle(dt_root, phandle);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : if (!root)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : if (!fdt) {</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : fdt = create_dtb(root, true);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : if (!fdt)</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : totalsize = fdt_totalsize(fdt);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : free(fdt);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : return totalsize;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : if (!len)</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : fdt_error = 0;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : old_last_phandle = get_last_phandle();</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : ret = __create_dtb(fdt, len, root, true);</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : set_last_phandle(old_last_phandle);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : if (ret == -FDT_ERR_NOSPACE)</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : return OPAL_EMPTY;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : }</a>
+<a name="258"><span class="lineNum"> 258 </span> : : opal_call(OPAL_GET_DEVICE_TREE, opal_get_device_tree, 3);</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/flash-firmware-versions.c.func-sort-c.html b/coverage-report/core/flash-firmware-versions.c.func-sort-c.html
new file mode 100644
index 0000000..3dd97c0
--- /dev/null
+++ b/coverage-report/core/flash-firmware-versions.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/flash-firmware-versions.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - flash-firmware-versions.c<span style="font-size: 80%;"> (<a href="flash-firmware-versions.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">58</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntryMed">85.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="flash-firmware-versions.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-firmware-versions.c.gcov.html#95">flash_dt_add_fw_version</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-firmware-versions.c.gcov.html#139">flash_fw_version_preload</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-firmware-versions.c.gcov.html#16">__flash_dt_add_fw_version</a></td>
+ <td class="coverFnHi">96</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/flash-firmware-versions.c.func.html b/coverage-report/core/flash-firmware-versions.c.func.html
new file mode 100644
index 0000000..27d92fe
--- /dev/null
+++ b/coverage-report/core/flash-firmware-versions.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/flash-firmware-versions.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - flash-firmware-versions.c<span style="font-size: 80%;"> (<a href="flash-firmware-versions.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">58</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntryMed">85.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="flash-firmware-versions.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-firmware-versions.c.gcov.html#16">__flash_dt_add_fw_version</a></td>
+ <td class="coverFnHi">96</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-firmware-versions.c.gcov.html#95">flash_dt_add_fw_version</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-firmware-versions.c.gcov.html#139">flash_fw_version_preload</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/flash-firmware-versions.c.gcov.html b/coverage-report/core/flash-firmware-versions.c.gcov.html
new file mode 100644
index 0000000..b6f601d
--- /dev/null
+++ b/coverage-report/core/flash-firmware-versions.c.gcov.html
@@ -0,0 +1,249 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/flash-firmware-versions.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - flash-firmware-versions.c<span style="font-size: 80%;"> (source / <a href="flash-firmware-versions.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">58</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntryMed">85.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Parse VERSION partition, add to device tree</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;device.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;opal.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;libstb/secureboot.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;libstb/trustedboot.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : /* ibm,firmware-versions support */</a>
+<a name="15"><span class="lineNum"> 15 </span> : : static char *version_buf;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : static size_t version_buf_size = 0x2000;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 96 : static void __flash_dt_add_fw_version(struct dt_node *fw_version, char* data)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : static bool first = true;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : char *prop;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : int version_len, i;</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 96 : int len = strlen(data);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : const char *skiboot_version;</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 96 : const char * version_str[] = {&quot;open-power&quot;, &quot;buildroot&quot;, &quot;skiboot&quot;,</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : &quot;hostboot-binaries&quot;, &quot;hostboot&quot;, &quot;linux&quot;,</a>
+<a name="27"><span class="lineNum"> 27 </span> : : &quot;petitboot&quot;, &quot;occ&quot;, &quot;capp-ucode&quot;, &quot;sbe&quot;,</a>
+<a name="28"><span class="lineNum"> 28 </span> : : &quot;machine-xml&quot;, &quot;hcode&quot;};</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 96 : if (first) {</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 12 : first = false;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* Increment past &quot;key-&quot; */</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 12 : if (memcmp(data, &quot;open-power&quot;, strlen(&quot;open-power&quot;)) == 0)</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 10 : prop = data + strlen(&quot;open-power&quot;);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : else</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 2 : prop = strchr(data, '-');</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 12 : if (!prop) {</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : prlog(PR_DEBUG,</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : &quot;FLASH: Invalid fw version format (%s)\n&quot;, data);</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 12 : return;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 11 : prop++;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 11 : dt_add_property_string(fw_version, &quot;version&quot;, prop);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 11 : return;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : /*</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * PNOR version strings are not easily consumable. Split them into</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * property, value.</a>
+<a name="52"><span class="lineNum"> 52 </span> : : *</a>
+<a name="53"><span class="lineNum"> 53 </span> : : * Example input from PNOR :</a>
+<a name="54"><span class="lineNum"> 54 </span> : : * &quot;open-power-firestone-v1.8&quot;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * &quot;linux-4.4.6-openpower1-8420e0f&quot;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : *</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * Desired output in device tree:</a>
+<a name="58"><span class="lineNum"> 58 </span> : : * open-power = &quot;firestone-v1.8&quot;;</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * linux = &quot;4.4.6-openpower1-8420e0f&quot;;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : */</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1092 : for(i = 0; i &lt; ARRAY_SIZE(version_str); i++)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : {</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1008 : version_len = strlen(version_str[i]);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1008 : if (len &lt; version_len)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 39 : continue;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 969 : if (memcmp(data, version_str[i], version_len) != 0)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 887 : continue;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* Found a match, add property */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 82 : if (dt_find_property(fw_version, version_str[i]))</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 6 : continue;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* Increment past &quot;key-&quot; */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 76 : prop = data + version_len + 1;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 76 : dt_add_property_string(fw_version, version_str[i], prop);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* Sanity check against what Skiboot thinks its version is. */</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 76 : if (strncmp(version_str[i], &quot;skiboot&quot;,</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : strlen(&quot;skiboot&quot;)) == 0) {</a>
+<a name="81"><span class="lineNum"> 81 </span> : : /*</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * If Skiboot was built with Buildroot its version may</a>
+<a name="83"><span class="lineNum"> 83 </span> : : * include a 'skiboot-' prefix; ignore it.</a>
+<a name="84"><span class="lineNum"> 84 </span> : : */</a>
+<a name="85"><span class="lineNum"> 85 </span> : : if (strncmp(version, &quot;skiboot-&quot;,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : strlen(&quot;skiboot-&quot;)) == 0)</a>
+<a name="87"><span class="lineNum"> 87 </span> : : skiboot_version = version + strlen(&quot;skiboot-&quot;);</a>
+<a name="88"><span class="lineNum"> 88 </span> : : else</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 9 : skiboot_version = version;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 9 : if (strncmp(prop, skiboot_version,</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : strlen(skiboot_version)) != 0)</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 9 : prlog(PR_WARNING, &quot;WARNING! Skiboot version does not match VERSION partition!\n&quot;);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : }</a>
+<a name="94"><span class="lineNum"> 94 </span> : : }</a>
+<a name="95"><span class="lineNum"> 95 </span> : : }</a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 13 : void flash_dt_add_fw_version(void)</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : {</a>
+<a name="99"><span class="lineNum"> 99 </span> : : uint8_t version_data[80];</a>
+<a name="100"><span class="lineNum"> 100 </span> : : int rc;</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 13 : int numbytes = 0, i = 0;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : struct dt_node *fw_version;</a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 13 : if (version_buf == NULL)</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 13 : rc = wait_for_resource_loaded(RESOURCE_ID_VERSION, RESOURCE_SUBID_NONE);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 13 : if (rc != OPAL_SUCCESS) {</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;FLASH: Failed to load VERSION data\n&quot;);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : free(version_buf);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : }</a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 13 : fw_version = dt_new(dt_root, &quot;ibm,firmware-versions&quot;);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 13 : assert(fw_version);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 13 : if (stb_is_container(version_buf, version_buf_size))</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : numbytes += SECURE_BOOT_HEADERS_SIZE;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 2520 : for ( ; (numbytes &lt; version_buf_size) &amp;&amp; version_buf[numbytes]; numbytes++) {</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 2508 : if (version_buf[numbytes] == '\n') {</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 96 : version_data[i] = '\0';</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 96 : __flash_dt_add_fw_version(fw_version, version_data);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 96 : memset(version_data, 0, sizeof(version_data));</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 96 : i = 0;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 96 : continue;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 2412 : } else if (version_buf[numbytes] == '\t') {</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 85 : continue; /* skip tabs */</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : }</a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 2327 : version_data[i++] = version_buf[numbytes];</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 2327 : if (i == sizeof(version_data)) {</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : prlog(PR_WARNING, &quot;VERSION item &gt;%lu chars, skipping\n&quot;,</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : sizeof(version_data));</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : }</a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 13 : free(version_buf);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 26 : void flash_fw_version_preload(void)</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : {</a>
+<a name="143"><span class="lineNum"> 143 </span> : : int rc;</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 26 : if (proc_gen &lt; proc_gen_p9)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 13 : return;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 13 : prlog(PR_INFO, &quot;FLASH: Loading VERSION section\n&quot;);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 13 : version_buf = malloc(version_buf_size);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 13 : if (!version_buf) {</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;FLASH: Failed to allocate memory\n&quot;);</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : }</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 13 : rc = start_preload_resource(RESOURCE_ID_VERSION, RESOURCE_SUBID_NONE,</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : version_buf, &amp;version_buf_size);</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 13 : if (rc != OPAL_SUCCESS) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING,</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : &quot;FLASH: Failed to start loading VERSION data\n&quot;);</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : free(version_buf);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : version_buf = NULL;</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : }</a>
+<a name="164"><span class="lineNum"> 164 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/flash-subpartition.c.func-sort-c.html b/coverage-report/core/flash-subpartition.c.func-sort-c.html
new file mode 100644
index 0000000..340ea15
--- /dev/null
+++ b/coverage-report/core/flash-subpartition.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/flash-subpartition.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - flash-subpartition.c<span style="font-size: 80%;"> (<a href="flash-subpartition.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntryLo">69.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="flash-subpartition.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-subpartition.c.gcov.html#23">flash_subpart_info</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/flash-subpartition.c.func.html b/coverage-report/core/flash-subpartition.c.func.html
new file mode 100644
index 0000000..aaaae9d
--- /dev/null
+++ b/coverage-report/core/flash-subpartition.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/flash-subpartition.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - flash-subpartition.c<span style="font-size: 80%;"> (<a href="flash-subpartition.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntryLo">69.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="flash-subpartition.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="flash-subpartition.c.gcov.html#23">flash_subpart_info</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/flash-subpartition.c.gcov.html b/coverage-report/core/flash-subpartition.c.gcov.html
new file mode 100644
index 0000000..b3e1902
--- /dev/null
+++ b/coverage-report/core/flash-subpartition.c.gcov.html
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/flash-subpartition.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - flash-subpartition.c<span style="font-size: 80%;"> (source / <a href="flash-subpartition.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntryLo">69.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Parse flash sub-partitions</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;opal-api.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : struct flash_hostboot_toc {</a>
+<a name="12"><span class="lineNum"> 12 </span> : : be32 ec;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : be32 offset; /* From start of header. 4K aligned */</a>
+<a name="14"><span class="lineNum"> 14 </span> : : be32 size;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : };</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define FLASH_HOSTBOOT_TOC_MAX_ENTRIES ((FLASH_SUBPART_HEADER_SIZE - 8) \</a>
+<a name="17"><span class="lineNum"> 17 </span> : : /sizeof(struct flash_hostboot_toc))</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct flash_hostboot_header {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : char eyecatcher[4];</a>
+<a name="21"><span class="lineNum"> 21 </span> : : be32 version;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct flash_hostboot_toc toc[FLASH_HOSTBOOT_TOC_MAX_ENTRIES];</a>
+<a name="23"><span class="lineNum"> 23 </span> : : };</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 5 : int flash_subpart_info(void *part_header, uint32_t header_len,</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : uint32_t part_size, uint32_t *part_actualp,</a>
+<a name="27"><span class="lineNum"> 27 </span> : : uint32_t subid, uint32_t *offset, uint32_t *size)</a>
+<a name="28"><span class="lineNum"> 28 </span> : : {</a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct flash_hostboot_header *header;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : char eyecatcher[5];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : uint32_t i, ec, o, s;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : uint32_t part_actual;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : bool subpart_found;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 5 : if (!part_header || ( !offset &amp;&amp; !size &amp;&amp; !part_actualp)) {</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;FLASH: invalid parameters: ph %p of %p sz %p &quot;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : &quot;tsz %p\n&quot;, part_header, offset, size, part_actualp);</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : }</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 5 : if (header_len &lt; FLASH_SUBPART_HEADER_SIZE) {</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;FLASH: subpartition header too small 0x%x\n&quot;,</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : header_len);</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : }</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 5 : header = (struct flash_hostboot_header*) part_header;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : /* Perform sanity */</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 5 : i = be32_to_cpu(header-&gt;version);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 5 : if (i != 1) {</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FLASH: flash subpartition TOC version unknown %i\n&quot;, i);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : /* NULL terminate eyecatcher */</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 5 : strncpy(eyecatcher, header-&gt;eyecatcher, 4);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 5 : eyecatcher[4] = '\0';</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 5 : prlog(PR_DEBUG, &quot;FLASH: flash subpartition eyecatcher %s\n&quot;,</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : eyecatcher);</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 5 : subpart_found = false;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 5 : part_actual = 0;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 30 : for (i = 0; i &lt; FLASH_HOSTBOOT_TOC_MAX_ENTRIES; i++) {</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 30 : ec = be32_to_cpu(header-&gt;toc[i].ec);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 30 : o = be32_to_cpu(header-&gt;toc[i].offset);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 30 : s = be32_to_cpu(header-&gt;toc[i].size);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* Check for null terminating entry */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 30 : if (!ec &amp;&amp; !o &amp;&amp; !s)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 5 : break;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* Sanity check the offset and size. */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 25 : if (o + s &gt; part_size) {</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FLASH: flash subpartition too big: %i\n&quot;, i);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 25 : if (!s) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FLASH: flash subpartition zero size: %i\n&quot;, i);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 25 : if (o &lt; FLASH_SUBPART_HEADER_SIZE) {</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FLASH: flash subpartition offset too small: &quot;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : &quot;%i\n&quot;, i);</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : /*</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * Subpartitions content are different, but multiple toc entries</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * may point to the same subpartition.</a>
+<a name="91"><span class="lineNum"> 91 </span> : : */</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 25 : if (ALIGN_UP(o + s, FLASH_SUBPART_HEADER_SIZE) &gt; part_actual)</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 5 : part_actual = ALIGN_UP(o + s, FLASH_SUBPART_HEADER_SIZE);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 25 : if (ec == subid) {</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 5 : if (offset)</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 5 : *offset += o;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 5 : if (size)</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 5 : *size = s;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 5 : subpart_found = true;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : }</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 5 : if (!subpart_found &amp;&amp; (offset || size)) {</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FLASH: flash subpartition not found.\n&quot;);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : }</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 5 : if (part_actualp)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 5 : *part_actualp = part_actual;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 5 : return OPAL_SUCCESS;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/index-sort-b.html b/coverage-report/core/index-sort-b.html
new file mode 100644
index 0000000..0c88363
--- /dev/null
+++ b/coverage-report/core/index-sort-b.html
@@ -0,0 +1,335 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - core</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2002</td>
+ <td class="headerCovTableEntry">2683</td>
+ <td class="headerCovTableEntryLo">74.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">186</td>
+ <td class="headerCovTableEntry">227</td>
+ <td class="headerCovTableEntryMed">81.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="console-log.c.gcov.html">console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.2%"><img src="../snow.png" width=12 height=10 alt="88.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.2&nbsp;%</td>
+ <td class="coverNumMed">112 / 127</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.c.gcov.html">bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci-quirk.c.gcov.html">pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=13 height=10 alt="13.3%"><img src="../snow.png" width=87 height=10 alt="13.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">13.3&nbsp;%</td>
+ <td class="coverNumLo">8 / 60</td>
+ <td class="coverPerLo">20.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="malloc.c.gcov.html">malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.1%"><img src="../snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">34 / 35</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pool.c.gcov.html">pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=96 height=10 alt="96.4%"><img src="../snow.png" width=4 height=10 alt="96.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.4&nbsp;%</td>
+ <td class="coverNumHi">27 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=63 height=10 alt="63.4%"><img src="../snow.png" width=37 height=10 alt="63.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.4&nbsp;%</td>
+ <td class="coverNumLo">64 / 101</td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pel.c.gcov.html">pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.5%"><img src="../snow.png" width=3 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">155 / 159</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.c.gcov.html">chip.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 87</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-firmware-versions.c.gcov.html">flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="85.3%"><img src="../snow.png" width=15 height=10 alt="85.3%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.3&nbsp;%</td>
+ <td class="coverNumMed">58 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timer.c.gcov.html">timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=61 height=10 alt="61.3%"><img src="../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">68 / 111</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="buddy.c.gcov.html">buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="99.0%"><img src="../snow.png" width=1 height=10 alt="99.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 96</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-msg.c.gcov.html">opal-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=73 height=10 alt="73.1%"><img src="../snow.png" width=27 height=10 alt="73.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.1&nbsp;%</td>
+ <td class="coverNumLo">68 / 93</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">471 / 555</td>
+ <td class="coverPerMed">89.6&nbsp;%</td>
+ <td class="coverNumMed">60 / 67</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="nvram-format.c.gcov.html">nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=77 height=10 alt="76.9%"><img src="../snow.png" width=23 height=10 alt="76.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.9&nbsp;%</td>
+ <td class="coverNumMed">113 / 147</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpufeatures.c.gcov.html">cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">118 / 139</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-subpartition.c.gcov.html">flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=70 height=10 alt="69.6%"><img src="../snow.png" width=30 height=10 alt="69.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.6&nbsp;%</td>
+ <td class="coverNumLo">32 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.c.gcov.html">time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mem_region.c.gcov.html">mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=66 height=10 alt="65.6%"><img src="../snow.png" width=34 height=10 alt="65.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">65.6&nbsp;%</td>
+ <td class="coverNumLo">467 / 712</td>
+ <td class="coverPerMed">79.6&nbsp;%</td>
+ <td class="coverNumMed">39 / 49</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.1%"><img src="../snow.png" width=12 height=10 alt="88.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.1&nbsp;%</td>
+ <td class="coverNumMed">52 / 59</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/index-sort-f.html b/coverage-report/core/index-sort-f.html
new file mode 100644
index 0000000..d77583e
--- /dev/null
+++ b/coverage-report/core/index-sort-f.html
@@ -0,0 +1,335 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - core</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2002</td>
+ <td class="headerCovTableEntry">2683</td>
+ <td class="headerCovTableEntryLo">74.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">186</td>
+ <td class="headerCovTableEntry">227</td>
+ <td class="headerCovTableEntryMed">81.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.c.gcov.html">chip.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 87</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci-quirk.c.gcov.html">pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=13 height=10 alt="13.3%"><img src="../snow.png" width=87 height=10 alt="13.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">13.3&nbsp;%</td>
+ <td class="coverNumLo">8 / 60</td>
+ <td class="coverPerLo">20.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="nvram-format.c.gcov.html">nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=77 height=10 alt="76.9%"><img src="../snow.png" width=23 height=10 alt="76.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.9&nbsp;%</td>
+ <td class="coverNumMed">113 / 147</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timer.c.gcov.html">timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=61 height=10 alt="61.3%"><img src="../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">68 / 111</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-msg.c.gcov.html">opal-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=73 height=10 alt="73.1%"><img src="../snow.png" width=27 height=10 alt="73.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.1&nbsp;%</td>
+ <td class="coverNumLo">68 / 93</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mem_region.c.gcov.html">mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=66 height=10 alt="65.6%"><img src="../snow.png" width=34 height=10 alt="65.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">65.6&nbsp;%</td>
+ <td class="coverNumLo">467 / 712</td>
+ <td class="coverPerMed">79.6&nbsp;%</td>
+ <td class="coverNumMed">39 / 49</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.2%"><img src="../snow.png" width=12 height=10 alt="88.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.2&nbsp;%</td>
+ <td class="coverNumMed">112 / 127</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">471 / 555</td>
+ <td class="coverPerMed">89.6&nbsp;%</td>
+ <td class="coverNumMed">60 / 67</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=63 height=10 alt="63.4%"><img src="../snow.png" width=37 height=10 alt="63.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.4&nbsp;%</td>
+ <td class="coverNumLo">64 / 101</td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-subpartition.c.gcov.html">flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=70 height=10 alt="69.6%"><img src="../snow.png" width=30 height=10 alt="69.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.6&nbsp;%</td>
+ <td class="coverNumLo">32 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.c.gcov.html">time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="console-log.c.gcov.html">console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.c.gcov.html">bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pool.c.gcov.html">pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=96 height=10 alt="96.4%"><img src="../snow.png" width=4 height=10 alt="96.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.4&nbsp;%</td>
+ <td class="coverNumHi">27 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-firmware-versions.c.gcov.html">flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="85.3%"><img src="../snow.png" width=15 height=10 alt="85.3%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.3&nbsp;%</td>
+ <td class="coverNumMed">58 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpufeatures.c.gcov.html">cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">118 / 139</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.1%"><img src="../snow.png" width=12 height=10 alt="88.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.1&nbsp;%</td>
+ <td class="coverNumMed">52 / 59</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="malloc.c.gcov.html">malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.1%"><img src="../snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">34 / 35</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pel.c.gcov.html">pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.5%"><img src="../snow.png" width=3 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">155 / 159</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="buddy.c.gcov.html">buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="99.0%"><img src="../snow.png" width=1 height=10 alt="99.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 96</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/index-sort-l.html b/coverage-report/core/index-sort-l.html
new file mode 100644
index 0000000..cb951e8
--- /dev/null
+++ b/coverage-report/core/index-sort-l.html
@@ -0,0 +1,335 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - core</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2002</td>
+ <td class="headerCovTableEntry">2683</td>
+ <td class="headerCovTableEntryLo">74.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">186</td>
+ <td class="headerCovTableEntry">227</td>
+ <td class="headerCovTableEntryMed">81.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.c.gcov.html">chip.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 87</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci-quirk.c.gcov.html">pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=13 height=10 alt="13.3%"><img src="../snow.png" width=87 height=10 alt="13.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">13.3&nbsp;%</td>
+ <td class="coverNumLo">8 / 60</td>
+ <td class="coverPerLo">20.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timer.c.gcov.html">timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=61 height=10 alt="61.3%"><img src="../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">68 / 111</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=63 height=10 alt="63.4%"><img src="../snow.png" width=37 height=10 alt="63.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.4&nbsp;%</td>
+ <td class="coverNumLo">64 / 101</td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mem_region.c.gcov.html">mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=66 height=10 alt="65.6%"><img src="../snow.png" width=34 height=10 alt="65.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">65.6&nbsp;%</td>
+ <td class="coverNumLo">467 / 712</td>
+ <td class="coverPerMed">79.6&nbsp;%</td>
+ <td class="coverNumMed">39 / 49</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-subpartition.c.gcov.html">flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=70 height=10 alt="69.6%"><img src="../snow.png" width=30 height=10 alt="69.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.6&nbsp;%</td>
+ <td class="coverNumLo">32 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-msg.c.gcov.html">opal-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=73 height=10 alt="73.1%"><img src="../snow.png" width=27 height=10 alt="73.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.1&nbsp;%</td>
+ <td class="coverNumLo">68 / 93</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="nvram-format.c.gcov.html">nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=77 height=10 alt="76.9%"><img src="../snow.png" width=23 height=10 alt="76.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.9&nbsp;%</td>
+ <td class="coverNumMed">113 / 147</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpufeatures.c.gcov.html">cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">118 / 139</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">471 / 555</td>
+ <td class="coverPerMed">89.6&nbsp;%</td>
+ <td class="coverNumMed">60 / 67</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-firmware-versions.c.gcov.html">flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="85.3%"><img src="../snow.png" width=15 height=10 alt="85.3%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.3&nbsp;%</td>
+ <td class="coverNumMed">58 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.1%"><img src="../snow.png" width=12 height=10 alt="88.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.1&nbsp;%</td>
+ <td class="coverNumMed">52 / 59</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.2%"><img src="../snow.png" width=12 height=10 alt="88.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.2&nbsp;%</td>
+ <td class="coverNumMed">112 / 127</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pool.c.gcov.html">pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=96 height=10 alt="96.4%"><img src="../snow.png" width=4 height=10 alt="96.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.4&nbsp;%</td>
+ <td class="coverNumHi">27 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="malloc.c.gcov.html">malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.1%"><img src="../snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">34 / 35</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pel.c.gcov.html">pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.5%"><img src="../snow.png" width=3 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">155 / 159</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="buddy.c.gcov.html">buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="99.0%"><img src="../snow.png" width=1 height=10 alt="99.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 96</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.c.gcov.html">time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="console-log.c.gcov.html">console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.c.gcov.html">bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/index.html b/coverage-report/core/index.html
new file mode 100644
index 0000000..a6d0c60
--- /dev/null
+++ b/coverage-report/core/index.html
@@ -0,0 +1,335 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - core</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2002</td>
+ <td class="headerCovTableEntry">2683</td>
+ <td class="headerCovTableEntryLo">74.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">186</td>
+ <td class="headerCovTableEntry">227</td>
+ <td class="headerCovTableEntryMed">81.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.c.gcov.html">bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="buddy.c.gcov.html">buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="99.0%"><img src="../snow.png" width=1 height=10 alt="99.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 96</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.c.gcov.html">chip.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 87</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="console-log.c.gcov.html">console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpufeatures.c.gcov.html">cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">118 / 139</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="84.9%"><img src="../snow.png" width=15 height=10 alt="84.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.9&nbsp;%</td>
+ <td class="coverNumMed">471 / 555</td>
+ <td class="coverPerMed">89.6&nbsp;%</td>
+ <td class="coverNumMed">60 / 67</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=63 height=10 alt="63.4%"><img src="../snow.png" width=37 height=10 alt="63.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.4&nbsp;%</td>
+ <td class="coverNumLo">64 / 101</td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-firmware-versions.c.gcov.html">flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=85 height=10 alt="85.3%"><img src="../snow.png" width=15 height=10 alt="85.3%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.3&nbsp;%</td>
+ <td class="coverNumMed">58 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="flash-subpartition.c.gcov.html">flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=70 height=10 alt="69.6%"><img src="../snow.png" width=30 height=10 alt="69.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.6&nbsp;%</td>
+ <td class="coverNumLo">32 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="malloc.c.gcov.html">malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.1%"><img src="../snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">34 / 35</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mem_region.c.gcov.html">mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=66 height=10 alt="65.6%"><img src="../snow.png" width=34 height=10 alt="65.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">65.6&nbsp;%</td>
+ <td class="coverNumLo">467 / 712</td>
+ <td class="coverPerMed">79.6&nbsp;%</td>
+ <td class="coverNumMed">39 / 49</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="nvram-format.c.gcov.html">nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=77 height=10 alt="76.9%"><img src="../snow.png" width=23 height=10 alt="76.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.9&nbsp;%</td>
+ <td class="coverNumMed">113 / 147</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-msg.c.gcov.html">opal-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=73 height=10 alt="73.1%"><img src="../snow.png" width=27 height=10 alt="73.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.1&nbsp;%</td>
+ <td class="coverNumLo">68 / 93</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci-quirk.c.gcov.html">pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=13 height=10 alt="13.3%"><img src="../snow.png" width=87 height=10 alt="13.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">13.3&nbsp;%</td>
+ <td class="coverNumLo">8 / 60</td>
+ <td class="coverPerLo">20.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pel.c.gcov.html">pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=97 height=10 alt="97.5%"><img src="../snow.png" width=3 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">155 / 159</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pool.c.gcov.html">pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=96 height=10 alt="96.4%"><img src="../snow.png" width=4 height=10 alt="96.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.4&nbsp;%</td>
+ <td class="coverNumHi">27 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.c.gcov.html">time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timer.c.gcov.html">timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=61 height=10 alt="61.3%"><img src="../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">68 / 111</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.2%"><img src="../snow.png" width=12 height=10 alt="88.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.2&nbsp;%</td>
+ <td class="coverNumMed">112 / 127</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="88.1%"><img src="../snow.png" width=12 height=10 alt="88.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.1&nbsp;%</td>
+ <td class="coverNumMed">52 / 59</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/malloc.c.func-sort-c.html b/coverage-report/core/malloc.c.func-sort-c.html
new file mode 100644
index 0000000..b4f0bac
--- /dev/null
+++ b/coverage-report/core/malloc.c.func-sort-c.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/malloc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - malloc.c<span style="font-size: 80%;"> (<a href="malloc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">34</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryHi">97.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="malloc.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#37">__realloc</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#67">__zalloc</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#30">__free</a></td>
+ <td class="coverFnHi">149</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#25">__malloc</a></td>
+ <td class="coverFnHi">4311</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#14">__memalign</a></td>
+ <td class="coverFnHi">4311</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/malloc.c.func.html b/coverage-report/core/malloc.c.func.html
new file mode 100644
index 0000000..d4d633f
--- /dev/null
+++ b/coverage-report/core/malloc.c.func.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/malloc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - malloc.c<span style="font-size: 80%;"> (<a href="malloc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">34</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryHi">97.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="malloc.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#30">__free</a></td>
+ <td class="coverFnHi">149</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#25">__malloc</a></td>
+ <td class="coverFnHi">4311</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#14">__memalign</a></td>
+ <td class="coverFnHi">4311</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#37">__realloc</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="malloc.c.gcov.html#67">__zalloc</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/malloc.c.gcov.html b/coverage-report/core/malloc.c.gcov.html
new file mode 100644
index 0000000..60537aa
--- /dev/null
+++ b/coverage-report/core/malloc.c.gcov.html
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/malloc.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - malloc.c<span style="font-size: 80%;"> (source / <a href="malloc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">34</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryHi">97.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Implement malloc()/free() etc on top of our memory region allocator,</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * which provides mem_alloc()/mem_free().</a>
+<a name="5"><span class="lineNum"> 5 </span> : : *</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : */</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;mem_region.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;lock.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;string.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define DEFAULT_ALIGN __alignof__(long)</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 4311 : void *__memalign(size_t blocksize, size_t bytes, const char *location)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : void *p;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 4311 : lock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 4311 : p = mem_alloc(&amp;skiboot_heap, bytes, blocksize, location);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 4311 : unlock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 4311 : return p;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 4311 : void *__malloc(size_t bytes, const char *location)</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : {</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 4311 : return __memalign(DEFAULT_ALIGN, bytes, location);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 149 : void __free(void *p, const char *location)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 149 : lock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 149 : mem_free(&amp;skiboot_heap, p, location);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 149 : unlock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 149 : }</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 9 : void *__realloc(void *ptr, size_t size, const char *location)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> : : void *newptr;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : /* Two classic malloc corner cases. */</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 9 : if (!size) {</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : __free(ptr, location);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 8 : if (!ptr)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 3 : return __malloc(size, location);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 5 : lock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 5 : if (mem_resize(&amp;skiboot_heap, ptr, size, location)) {</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 3 : newptr = ptr;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : } else {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 2 : newptr = mem_alloc(&amp;skiboot_heap, size, DEFAULT_ALIGN,</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : location);</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 2 : if (newptr) {</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : size_t copy = mem_allocated_size(ptr);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : if (copy &gt; size)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : copy = size;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : memcpy(newptr, ptr, copy);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, ptr, location);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 5 : unlock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 5 : return newptr;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : }</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 18 : void *__zalloc(size_t bytes, const char *location)</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : {</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 18 : void *p = __malloc(bytes, location);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 18 : if (p)</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 17 : memset(p, 0, bytes);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 18 : return p;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/mem_region.c.func-sort-c.html b/coverage-report/core/mem_region.c.func-sort-c.html
new file mode 100644
index 0000000..496c643
--- /dev/null
+++ b/coverage-report/core/mem_region.c.func-sort-c.html
@@ -0,0 +1,277 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/mem_region.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - mem_region.c<span style="font-size: 80%;"> (<a href="mem_region.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">467</td>
+ <td class="headerCovTableEntry">712</td>
+ <td class="headerCovTableEntryLo">65.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">49</td>
+ <td class="headerCovTableEntryMed">79.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="mem_region.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#866">__local_alloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#270">bad_header</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#921">find_mem_region</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#855">matches_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#666">mem_check_all</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1232">mem_clear_range</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1282">mem_region_clear_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#850">mem_reserve_hwbuf</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1294">start_mem_region_clear_unused</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1394">wait_mem_region_clear_unused</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1458">mem_region_add_dt_reserved</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#352">mem_dump_free</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#295">mem_dump_allocs</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1541">mem_region_next</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1183">mem_region_release_unused</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#262">hdr_location</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#157">init_allocatable_region</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1416">mem_region_add_dt_reserved_node</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#932">mem_range_is_reserved</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1159">allocated_length</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1067">mem_region_init</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#982">mem_region_parse_reserved_properties</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#285">region_is_reservable</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#826">mem_reserve</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#845">mem_reserve_fw</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1023">mem_region_parse_reserved_nodes</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#701">split_region</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#745">contains</a></td>
+ <td class="coverFnHi">45</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#678">new_region</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#290">region_is_reserved</a></td>
+ <td class="coverFnHi">128</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#778">add_region</a></td>
+ <td class="coverFnHi">136</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#764">add_region_to_regions</a></td>
+ <td class="coverFnHi">158</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#753">get_overlap</a></td>
+ <td class="coverFnHi">165</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#500">mem_free</a></td>
+ <td class="coverFnHi">299</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#717">intersects</a></td>
+ <td class="coverFnHi">1170</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#723">maybe_split</a></td>
+ <td class="coverFnHi">1170</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#739">overlaps</a></td>
+ <td class="coverFnHi">1357</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#143">mem_poison</a></td>
+ <td class="coverFnHi">1672</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#387">__mem_alloc</a></td>
+ <td class="coverFnHi">4461</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#478">mem_alloc</a></td>
+ <td class="coverFnHi">4461</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#220">fits</a></td>
+ <td class="coverFnHi">4469</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#173">make_free</a></td>
+ <td class="coverFnHi">15898</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#125">tailer</a></td>
+ <td class="coverFnHi">30220</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#526">mem_allocated_size</a></td>
+ <td class="coverFnHi">65539</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#532">mem_resize</a></td>
+ <td class="coverFnHi">131048</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#588">mem_check</a></td>
+ <td class="coverFnHi">131270</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#241">discard_excess</a></td>
+ <td class="coverFnHi">135502</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#131">next_hdr</a></td>
+ <td class="coverFnHi">308459</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#119">region_start</a></td>
+ <td class="coverFnHi">448552</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/mem_region.c.func.html b/coverage-report/core/mem_region.c.func.html
new file mode 100644
index 0000000..4202e01
--- /dev/null
+++ b/coverage-report/core/mem_region.c.func.html
@@ -0,0 +1,277 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/mem_region.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - mem_region.c<span style="font-size: 80%;"> (<a href="mem_region.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">467</td>
+ <td class="headerCovTableEntry">712</td>
+ <td class="headerCovTableEntryLo">65.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">49</td>
+ <td class="headerCovTableEntryMed">79.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="mem_region.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#866">__local_alloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#387">__mem_alloc</a></td>
+ <td class="coverFnHi">4461</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#778">add_region</a></td>
+ <td class="coverFnHi">136</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#764">add_region_to_regions</a></td>
+ <td class="coverFnHi">158</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1159">allocated_length</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#270">bad_header</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#745">contains</a></td>
+ <td class="coverFnHi">45</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#241">discard_excess</a></td>
+ <td class="coverFnHi">135502</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#921">find_mem_region</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#220">fits</a></td>
+ <td class="coverFnHi">4469</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#753">get_overlap</a></td>
+ <td class="coverFnHi">165</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#262">hdr_location</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#157">init_allocatable_region</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#717">intersects</a></td>
+ <td class="coverFnHi">1170</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#173">make_free</a></td>
+ <td class="coverFnHi">15898</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#855">matches_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#723">maybe_split</a></td>
+ <td class="coverFnHi">1170</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#478">mem_alloc</a></td>
+ <td class="coverFnHi">4461</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#526">mem_allocated_size</a></td>
+ <td class="coverFnHi">65539</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#588">mem_check</a></td>
+ <td class="coverFnHi">131270</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#666">mem_check_all</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1232">mem_clear_range</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#295">mem_dump_allocs</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#352">mem_dump_free</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#500">mem_free</a></td>
+ <td class="coverFnHi">299</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#143">mem_poison</a></td>
+ <td class="coverFnHi">1672</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#932">mem_range_is_reserved</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1458">mem_region_add_dt_reserved</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1416">mem_region_add_dt_reserved_node</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1282">mem_region_clear_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1067">mem_region_init</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1541">mem_region_next</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1023">mem_region_parse_reserved_nodes</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#982">mem_region_parse_reserved_properties</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1183">mem_region_release_unused</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#826">mem_reserve</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#845">mem_reserve_fw</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#850">mem_reserve_hwbuf</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#532">mem_resize</a></td>
+ <td class="coverFnHi">131048</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#678">new_region</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#131">next_hdr</a></td>
+ <td class="coverFnHi">308459</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#739">overlaps</a></td>
+ <td class="coverFnHi">1357</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#285">region_is_reservable</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#290">region_is_reserved</a></td>
+ <td class="coverFnHi">128</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#119">region_start</a></td>
+ <td class="coverFnHi">448552</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#701">split_region</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1294">start_mem_region_clear_unused</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#125">tailer</a></td>
+ <td class="coverFnHi">30220</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mem_region.c.gcov.html#1394">wait_mem_region_clear_unused</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/mem_region.c.gcov.html b/coverage-report/core/mem_region.c.gcov.html
new file mode 100644
index 0000000..f3f8751
--- /dev/null
+++ b/coverage-report/core/mem_region.c.gcov.html
@@ -0,0 +1,1640 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/mem_region.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - mem_region.c<span style="font-size: 80%;"> (source / <a href="mem_region.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">467</td>
+ <td class="headerCovTableEntry">712</td>
+ <td class="headerCovTableEntryLo">65.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">49</td>
+ <td class="headerCovTableEntryMed">79.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Simple memory allocator</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;mem-map.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;libfdt_env.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;lock.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;device.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;chip.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;affinity.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;types.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;mem_region.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : /* Memory poisoning on free (if POISON_MEM_REGION set to 1) */</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #ifdef DEBUG</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #define POISON_MEM_REGION 1</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #else</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #define POISON_MEM_REGION 0</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #endif</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define POISON_MEM_REGION_WITH 0x99</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #define POISON_MEM_REGION_LIMIT 1*1024*1024*1024</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* Locking: The mem_region_lock protects the regions list from concurrent</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * updates. Additions to, or removals from, the region list must be done</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * with this lock held. This is typically done when we're establishing</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * the memory &amp; reserved regions.</a>
+<a name="34"><span class="lineNum"> 34 </span> : : *</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * Each region has a lock (region-&gt;free_list_lock) to protect the free list</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * from concurrent modification. This lock is used when we're allocating</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * memory out of a specific region.</a>
+<a name="38"><span class="lineNum"> 38 </span> : : *</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * If both locks are needed (eg, __local_alloc, where we need to find a region,</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * then allocate from it), the mem_region_lock must be acquired before (and</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * released after) the per-region lock.</a>
+<a name="42"><span class="lineNum"> 42 </span> : : */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct lock mem_region_lock = LOCK_UNLOCKED;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : static struct list_head regions = LIST_HEAD_INIT(regions);</a>
+<a name="46"><span class="lineNum"> 46 </span> : : static struct list_head early_reserves = LIST_HEAD_INIT(early_reserves);</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : static bool mem_region_init_done = false;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : static bool mem_regions_finalised = false;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> : : unsigned long top_of_ram = SKIBOOT_BASE + SKIBOOT_SIZE;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : static struct mem_region skiboot_os_reserve = {</a>
+<a name="54"><span class="lineNum"> 54 </span> : : .name = &quot;ibm,os-reserve&quot;,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : .start = 0,</a>
+<a name="56"><span class="lineNum"> 56 </span> : : .len = SKIBOOT_BASE,</a>
+<a name="57"><span class="lineNum"> 57 </span> : : .type = REGION_OS,</a>
+<a name="58"><span class="lineNum"> 58 </span> : : };</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : struct mem_region skiboot_heap = {</a>
+<a name="61"><span class="lineNum"> 61 </span> : : .name = &quot;ibm,firmware-heap&quot;,</a>
+<a name="62"><span class="lineNum"> 62 </span> : : .start = HEAP_BASE,</a>
+<a name="63"><span class="lineNum"> 63 </span> : : .len = HEAP_SIZE,</a>
+<a name="64"><span class="lineNum"> 64 </span> : : .type = REGION_SKIBOOT_HEAP,</a>
+<a name="65"><span class="lineNum"> 65 </span> : : };</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : static struct mem_region skiboot_code_and_text = {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : .name = &quot;ibm,firmware-code&quot;,</a>
+<a name="69"><span class="lineNum"> 69 </span> : : .start = SKIBOOT_BASE,</a>
+<a name="70"><span class="lineNum"> 70 </span> : : .len = HEAP_BASE - SKIBOOT_BASE,</a>
+<a name="71"><span class="lineNum"> 71 </span> : : .type = REGION_SKIBOOT_FIRMWARE,</a>
+<a name="72"><span class="lineNum"> 72 </span> : : };</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : static struct mem_region skiboot_after_heap = {</a>
+<a name="75"><span class="lineNum"> 75 </span> : : .name = &quot;ibm,firmware-data&quot;,</a>
+<a name="76"><span class="lineNum"> 76 </span> : : .start = HEAP_BASE + HEAP_SIZE,</a>
+<a name="77"><span class="lineNum"> 77 </span> : : .len = SKIBOOT_BASE + SKIBOOT_SIZE - (HEAP_BASE + HEAP_SIZE),</a>
+<a name="78"><span class="lineNum"> 78 </span> : : .type = REGION_SKIBOOT_FIRMWARE,</a>
+<a name="79"><span class="lineNum"> 79 </span> : : };</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : static struct mem_region skiboot_cpu_stacks = {</a>
+<a name="82"><span class="lineNum"> 82 </span> : : .name = &quot;ibm,firmware-stacks&quot;,</a>
+<a name="83"><span class="lineNum"> 83 </span> : : .start = CPU_STACKS_BASE,</a>
+<a name="84"><span class="lineNum"> 84 </span> : : .len = 0, /* TBA */</a>
+<a name="85"><span class="lineNum"> 85 </span> : : .type = REGION_SKIBOOT_FIRMWARE,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : };</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : static struct mem_region skiboot_mambo_kernel = {</a>
+<a name="89"><span class="lineNum"> 89 </span> : : .name = &quot;ibm,firmware-mambo-kernel&quot;,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : .start = (unsigned long)KERNEL_LOAD_BASE,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : .len = KERNEL_LOAD_SIZE,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : .type = REGION_SKIBOOT_FIRMWARE,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : };</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : static struct mem_region skiboot_mambo_initramfs = {</a>
+<a name="96"><span class="lineNum"> 96 </span> : : .name = &quot;ibm,firmware-mambo-initramfs&quot;,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : .start = (unsigned long)INITRAMFS_LOAD_BASE,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : .len = INITRAMFS_LOAD_SIZE,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : .type = REGION_SKIBOOT_FIRMWARE,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : };</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : struct alloc_hdr {</a>
+<a name="104"><span class="lineNum"> 104 </span> : : bool free : 1;</a>
+<a name="105"><span class="lineNum"> 105 </span> : : bool prev_free : 1;</a>
+<a name="106"><span class="lineNum"> 106 </span> : : bool printed : 1;</a>
+<a name="107"><span class="lineNum"> 107 </span> : : unsigned long num_longs : BITS_PER_LONG-3; /* Including header. */</a>
+<a name="108"><span class="lineNum"> 108 </span> : : const char *location;</a>
+<a name="109"><span class="lineNum"> 109 </span> : : };</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> : : struct free_hdr {</a>
+<a name="112"><span class="lineNum"> 112 </span> : : struct alloc_hdr hdr;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : struct list_node list;</a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* ... unsigned long tailer; */</a>
+<a name="115"><span class="lineNum"> 115 </span> : : };</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : #define ALLOC_HDR_LONGS (sizeof(struct alloc_hdr) / sizeof(long))</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #define ALLOC_MIN_LONGS (sizeof(struct free_hdr) / sizeof(long) + 1)</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /* Avoid ugly casts. */</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 448552 : static void *region_start(const struct mem_region *region)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : {</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 448552 : return (void *)(unsigned long)region-&gt;start;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : }</a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> : : /* Each free block has a tailer, so we can walk backwards. */</a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 30220 : static unsigned long *tailer(struct free_hdr *f)</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : {</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 30220 : return (unsigned long *)f + f-&gt;hdr.num_longs - 1;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : }</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* This walks forward to the next hdr (or NULL if at the end). */</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 308459 : static struct alloc_hdr *next_hdr(const struct mem_region *region,</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : const struct alloc_hdr *hdr)</a>
+<a name="135"><span class="lineNum"> 135 </span> : : {</a>
+<a name="136"><span class="lineNum"> 136 </span> : : void *next;</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 308459 : next = ((unsigned long *)hdr + hdr-&gt;num_longs);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 308459 : if (next &gt;= region_start(region) + region-&gt;len)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 157942 : next = NULL;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 308459 : return next;</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : }</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> : : #if POISON_MEM_REGION == 1</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1672 : static void mem_poison(struct free_hdr *f)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : {</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 1672 : size_t poison_size = (void*)tailer(f) - (void*)(f+1);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> : : /* We only poison up to a limit, as otherwise boot is</a>
+<a name="150"><span class="lineNum"> 150 </span> : : * kinda slow */</a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1672 : if (poison_size &gt; POISON_MEM_REGION_LIMIT)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : poison_size = POISON_MEM_REGION_LIMIT;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1672 : memset(f+1, POISON_MEM_REGION_WITH, poison_size);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1672 : }</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : #endif</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> : : /* Creates free block covering entire region. */</a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 8 : static void init_allocatable_region(struct mem_region *region)</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : {</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 8 : struct free_hdr *f = region_start(region);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 8 : assert(region-&gt;type == REGION_SKIBOOT_HEAP ||</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : region-&gt;type == REGION_MEMORY);</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 8 : f-&gt;hdr.num_longs = region-&gt;len / sizeof(long);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 8 : f-&gt;hdr.free = true;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 8 : f-&gt;hdr.prev_free = false;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 8 : *tailer(f) = f-&gt;hdr.num_longs;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 8 : list_head_init(&amp;region-&gt;free_list);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 8 : list_add(&amp;region-&gt;free_list, &amp;f-&gt;list);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : #if POISON_MEM_REGION == 1</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 8 : mem_poison(f);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : #endif</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 8 : }</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 15898 : static void make_free(struct mem_region *region, struct free_hdr *f,</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : const char *location, bool skip_poison)</a>
+<a name="177"><span class="lineNum"> 177 </span> : : {</a>
+<a name="178"><span class="lineNum"> 178 </span> : : struct alloc_hdr *next;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> : : #if POISON_MEM_REGION == 1</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 15898 : if (!skip_poison)</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 1664 : mem_poison(f);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : #else</a>
+<a name="184"><span class="lineNum"> 184 </span> : : (void)skip_poison;</a>
+<a name="185"><span class="lineNum"> 185 </span> : : #endif</a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 15898 : if (f-&gt;hdr.prev_free) {</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : struct free_hdr *prev;</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 1650 : unsigned long *prev_tailer = (unsigned long *)f - 1;</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 1650 : assert(*prev_tailer);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 1650 : prev = (void *)((unsigned long *)f - *prev_tailer);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1650 : assert(prev-&gt;hdr.free);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 1650 : assert(!prev-&gt;hdr.prev_free);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> : : /* Expand to cover the one we just freed. */</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 1650 : prev-&gt;hdr.num_longs += f-&gt;hdr.num_longs;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 1650 : f = prev;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : } else {</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 14248 : f-&gt;hdr.free = true;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 14248 : f-&gt;hdr.location = location;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 14248 : list_add(&amp;region-&gt;free_list, &amp;f-&gt;list);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> : : }</a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> : : /* Fix up tailer. */</a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 15898 : *tailer(f) = f-&gt;hdr.num_longs;</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> : : /* If next is free, coalesce it */</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 15898 : next = next_hdr(region, &amp;f-&gt;hdr);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 15898 : if (next) {</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 1787 : next-&gt;prev_free = true;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 1787 : if (next-&gt;free) {</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 1600 : struct free_hdr *next_free = (void *)next;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 1600 : list_del_from(&amp;region-&gt;free_list, &amp;next_free-&gt;list);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : /* Maximum of one level of recursion */</a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 1600 : make_free(region, next_free, location, true);</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : }</a>
+<a name="218"><span class="lineNum"> 218 </span> : : }</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 15898 : }</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : /* Can we fit this many longs with this alignment in this free block? */</a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 4469 : static bool fits(struct free_hdr *f, size_t longs, size_t align, size_t *offset)</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : {</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 4469 : *offset = 0;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 61396 : while (f-&gt;hdr.num_longs &gt;= *offset + longs) {</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : size_t addr;</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 61384 : addr = (unsigned long)f</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 61384 : + (*offset + ALLOC_HDR_LONGS) * sizeof(long);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 61384 : if ((addr &amp; (align - 1)) == 0)</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 4457 : return true;</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : </a>
+<a name="234"><span class="lineNum"> 234 </span> : : /* Don't make tiny chunks! */</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 56927 : if (*offset == 0)</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 19 : *offset = ALLOC_MIN_LONGS;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : else</a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 56908 : (*offset)++;</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 12 : return false;</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : }</a>
+<a name="242"><span class="lineNum"> 242 </span> : : </a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 135502 : static void discard_excess(struct mem_region *region,</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : struct alloc_hdr *hdr, size_t alloc_longs,</a>
+<a name="245"><span class="lineNum"> 245 </span> : : const char *location, bool skip_poison)</a>
+<a name="246"><span class="lineNum"> 246 </span> : : {</a>
+<a name="247"><span class="lineNum"> 247 </span> : : /* Do we have excess? */</a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 135502 : if (hdr-&gt;num_longs &gt; alloc_longs + ALLOC_MIN_LONGS) {</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : struct free_hdr *post;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> : : /* Set up post block. */</a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 13982 : post = (void *)hdr + alloc_longs * sizeof(long);</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 13982 : post-&gt;hdr.num_longs = hdr-&gt;num_longs - alloc_longs;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 13982 : post-&gt;hdr.prev_free = false;</span></a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> : : /* Trim our block. */</a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 13982 : hdr-&gt;num_longs = alloc_longs;</span></a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> : : /* This coalesces as required. */</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 13982 : make_free(region, post, location, skip_poison);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : }</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 135502 : }</span></a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 6 : static const char *hdr_location(const struct alloc_hdr *hdr)</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : {</a>
+<a name="266"><span class="lineNum"> 266 </span> : : /* Corrupt: step carefully! */</a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : if (is_rodata(hdr-&gt;location))</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 6 : return hdr-&gt;location;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : return &quot;*CORRUPT*&quot;;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : }</a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : static void bad_header(const struct mem_region *region,</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : const struct alloc_hdr *hdr,</a>
+<a name="274"><span class="lineNum"> 274 </span> : : const char *during,</a>
+<a name="275"><span class="lineNum"> 275 </span> : : const char *location)</a>
+<a name="276"><span class="lineNum"> 276 </span> : : {</a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* Corrupt: step carefully! */</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : if (is_rodata(hdr-&gt;location))</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : prerror(&quot;%p (in %s) %s at %s, previously %s\n&quot;,</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : hdr-1, region-&gt;name, during, location, hdr-&gt;location);</a>
+<a name="281"><span class="lineNum"> 281 </span> : : else</a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : prerror(&quot;%p (in %s) %s at %s, previously %p\n&quot;,</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : hdr-1, region-&gt;name, during, location, hdr-&gt;location);</a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 24 : static bool region_is_reservable(struct mem_region *region)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : {</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 24 : return region-&gt;type != REGION_OS;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : }</a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 128 : static bool region_is_reserved(struct mem_region *region)</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : {</a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 128 : return region-&gt;type != REGION_OS &amp;&amp; region-&gt;type != REGION_MEMORY;</span></a>
+<a name="295"><span class="lineNum"> 295 </span> : : }</a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 3 : void mem_dump_allocs(void)</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : {</a>
+<a name="299"><span class="lineNum"> 299 </span> : : struct mem_region *region;</a>
+<a name="300"><span class="lineNum"> 300 </span> : : struct alloc_hdr *h, *i;</a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> : : /* Second pass: populate property data */</a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 3 : prlog(PR_INFO, &quot;Memory regions:\n&quot;);</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 13 : list_for_each(&amp;regions, region, list) {</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 10 : if (!(region-&gt;type == REGION_SKIBOOT_HEAP ||</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 9 : region-&gt;type == REGION_MEMORY))</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 4 : continue;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 6 : prlog(PR_INFO, &quot; 0x%012llx..%012llx : %s\n&quot;,</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : (long long)region-&gt;start,</a>
+<a name="310"><span class="lineNum"> 310 </span> : : (long long)(region-&gt;start + region-&gt;len - 1),</a>
+<a name="311"><span class="lineNum"> 311 </span> : : region-&gt;name);</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 6 : if (region-&gt;free_list.n.next == NULL) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 5 : prlog(PR_INFO, &quot; no allocs\n&quot;);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 5 : continue;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : }</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> : : /*</a>
+<a name="318"><span class="lineNum"> 318 </span> : : * XXX: When dumping the allocation list we coalase allocations</a>
+<a name="319"><span class="lineNum"> 319 </span> : : * with the same location and size into a single line. This is</a>
+<a name="320"><span class="lineNum"> 320 </span> : : * quadratic, but it makes the dump human-readable and the raw</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * dump sometimes causes the log buffer to wrap.</a>
+<a name="322"><span class="lineNum"> 322 </span> : : */</a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 27 : for (h = region_start(region); h; h = next_hdr(region, h))</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 26 : h-&gt;printed = false;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 27 : for (h = region_start(region); h; h = next_hdr(region, h)) {</span></a>
+<a name="327"><span class="lineNum"> 327 </span> : : unsigned long bytes;</a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 26 : int count = 0;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 26 : if (h-&gt;free)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 25 : if (h-&gt;printed)</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 19 : continue;</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 123 : for (i = h; i; i = next_hdr(region, i)) {</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 117 : if (i-&gt;free)</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 6 : continue;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 111 : if (i-&gt;num_longs != h-&gt;num_longs)</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 82 : continue;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 29 : if (strcmp(i-&gt;location, h-&gt;location))</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 4 : continue;</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : </a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 25 : i-&gt;printed = true;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 25 : count++;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : }</a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 6 : bytes = h-&gt;num_longs * sizeof(long);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 6 : prlog(PR_NOTICE, &quot; % 8d allocs of 0x%.8lx bytes at %s (total 0x%lx)\n&quot;,</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : count, bytes, hdr_location(h), bytes * count);</a>
+<a name="350"><span class="lineNum"> 350 </span> : : }</a>
+<a name="351"><span class="lineNum"> 351 </span> : : }</a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 3 : }</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : </a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 2 : int64_t mem_dump_free(void)</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : {</a>
+<a name="356"><span class="lineNum"> 356 </span> : : struct mem_region *region;</a>
+<a name="357"><span class="lineNum"> 357 </span> : : struct alloc_hdr *hdr;</a>
+<a name="358"><span class="lineNum"> 358 </span> : : int64_t total_free;</a>
+<a name="359"><span class="lineNum"> 359 </span> : : int64_t region_free;</a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 2 : total_free = 0;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 2 : prlog(PR_INFO, &quot;Free space in HEAP memory regions:\n&quot;);</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 5 : list_for_each(&amp;regions, region, list) {</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 3 : if (!(region-&gt;type == REGION_SKIBOOT_HEAP ||</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1 : region-&gt;type == REGION_MEMORY))</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 2 : region_free = 0;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 2 : if (region-&gt;free_list.n.next == NULL) {</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 2 : continue;</span></a>
+<a name="372"><span class="lineNum"> 372 </span> : : }</a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : for (hdr = region_start(region); hdr; hdr = next_hdr(region, hdr)) {</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : if (!hdr-&gt;free)</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="376"><span class="lineNum"> 376 </span> : : </a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineNoCov"> 0 : region_free+= hdr-&gt;num_longs * sizeof(long);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> : : }</a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;Region %s free: %&quot;PRIx64&quot;\n&quot;,</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : region-&gt;name, region_free);</a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : total_free += region_free;</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : }</a>
+<a name="383"><span class="lineNum"> 383 </span> : : </a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 2 : prlog(PR_INFO, &quot;Total free: %&quot;PRIu64&quot;\n&quot;, total_free);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 2 : return total_free;</span></a>
+<a name="387"><span class="lineNum"> 387 </span> : : }</a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 4461 : static void *__mem_alloc(struct mem_region *region, size_t size, size_t align,</span></a>
+<a name="390"><span class="lineNum"> 390 </span> : : const char *location)</a>
+<a name="391"><span class="lineNum"> 391 </span> : : {</a>
+<a name="392"><span class="lineNum"> 392 </span> : : size_t alloc_longs, offset;</a>
+<a name="393"><span class="lineNum"> 393 </span> : : struct free_hdr *f;</a>
+<a name="394"><span class="lineNum"> 394 </span> : : struct alloc_hdr *next;</a>
+<a name="395"><span class="lineNum"> 395 </span> : : </a>
+<a name="396"><span class="lineNum"> 396 </span> : : /* Align must be power of 2. */</a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 4461 : assert(!((align - 1) &amp; align));</span></a>
+<a name="398"><span class="lineNum"> 398 </span> : : </a>
+<a name="399"><span class="lineNum"> 399 </span> : : /* This should be a constant. */</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : assert(is_rodata(location));</span></a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> : : /* Unallocatable region? */</a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 4461 : if (!(region-&gt;type == REGION_SKIBOOT_HEAP ||</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 1 : region-&gt;type == REGION_MEMORY))</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* First allocation? */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 4461 : if (region-&gt;free_list.n.next == NULL)</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 8 : init_allocatable_region(region);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : /* Don't do screwy sizes. */</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 4461 : if (size &gt; region-&gt;len)</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
+<a name="414"><span class="lineNum"> 414 </span> : : </a>
+<a name="415"><span class="lineNum"> 415 </span> : : /* Don't do tiny alignments, we deal in long increments. */</a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 4459 : if (align &lt; sizeof(long))</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 128 : align = sizeof(long);</span></a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> : : /* Convert size to number of longs, too. */</a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 4459 : alloc_longs = (size + sizeof(long)-1) / sizeof(long) + ALLOC_HDR_LONGS;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : </a>
+<a name="422"><span class="lineNum"> 422 </span> : : /* Can't be too small for when we free it, either. */</a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 4459 : if (alloc_longs &lt; ALLOC_MIN_LONGS)</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 179 : alloc_longs = ALLOC_MIN_LONGS;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : </a>
+<a name="426"><span class="lineNum"> 426 </span> : : /* Walk free list. */</a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 4471 : list_for_each(&amp;region-&gt;free_list, f, list) {</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : /* We may have to skip some to meet alignment. */</a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 4469 : if (fits(f, alloc_longs, align, &amp;offset))</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 4457 : goto found;</span></a>
+<a name="431"><span class="lineNum"> 431 </span> : : }</a>
+<a name="432"><span class="lineNum"> 432 </span> : : </a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineCov"> 4457 : found:</span></a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineCov"> 4457 : assert(f-&gt;hdr.free);</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 4457 : assert(!f-&gt;hdr.prev_free);</span></a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> : : /* This block is no longer free. */</a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 4457 : list_del_from(&amp;region-&gt;free_list, &amp;f-&gt;list);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 4457 : f-&gt;hdr.free = false;</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 4457 : f-&gt;hdr.location = location;</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 4457 : next = next_hdr(region, &amp;f-&gt;hdr);</span></a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 4457 : if (next) {</span></a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 63 : assert(next-&gt;prev_free);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 63 : next-&gt;prev_free = false;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> : : }</a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineCov"> 4457 : if (offset != 0) {</span></a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineCov"> 18 : struct free_hdr *pre = f;</span></a>
+<a name="452"><span class="lineNum"> 452 </span> : : </a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 18 : f = (void *)f + offset * sizeof(long);</span></a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 18 : assert(f &gt;= pre + 1);</span></a>
+<a name="455"><span class="lineNum"> 455 </span> : : </a>
+<a name="456"><span class="lineNum"> 456 </span> : : /* Set up new header. */</a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 18 : f-&gt;hdr.num_longs = pre-&gt;hdr.num_longs - offset;</span></a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* f-&gt;hdr.prev_free will be set by make_free below. */</a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 18 : f-&gt;hdr.free = false;</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 18 : f-&gt;hdr.location = location;</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : </a>
+<a name="462"><span class="lineNum"> 462 </span> : : /* Fix up old header. */</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 18 : pre-&gt;hdr.num_longs = offset;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 18 : pre-&gt;hdr.prev_free = false;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> : : /* This coalesces as required. */</a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 18 : make_free(region, pre, location, true);</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : }</a>
+<a name="469"><span class="lineNum"> 469 </span> : : </a>
+<a name="470"><span class="lineNum"> 470 </span> : : /* We might be too long; put the rest back. */</a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 4457 : discard_excess(region, &amp;f-&gt;hdr, alloc_longs, location, true);</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : </a>
+<a name="473"><span class="lineNum"> 473 </span> : : /* Clear tailer for debugging */</a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 4457 : *tailer(f) = 0;</span></a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> : : /* Their pointer is immediately after header. */</a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 4457 : return &amp;f-&gt;hdr + 1;</span></a>
+<a name="478"><span class="lineNum"> 478 </span> : : }</a>
+<a name="479"><span class="lineNum"> 479 </span> : : </a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineCov"> 4461 : void *mem_alloc(struct mem_region *region, size_t size, size_t align,</span></a>
+<a name="481"><span class="lineNum"> 481 </span> : : const char *location)</a>
+<a name="482"><span class="lineNum"> 482 </span> : : {</a>
+<a name="483"><span class="lineNum"> 483 </span> : : static bool dumped = false;</a>
+<a name="484"><span class="lineNum"> 484 </span> : : void *r;</a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineCov"> 4461 : assert(lock_held_by_me(&amp;region-&gt;free_list_lock));</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineCov"> 4461 : r = __mem_alloc(region, size, align, location);</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 4461 : if (r)</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 4457 : return r;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 4 : prerror(&quot;mem_alloc(0x%lx, 0x%lx, \&quot;%s\&quot;, %s) failed !\n&quot;,</span></a>
+<a name="493"><span class="lineNum"> 493 </span> : : size, align, location, region-&gt;name);</a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 4 : if (!dumped) {</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineCov"> 2 : mem_dump_allocs();</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 2 : dumped = true;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> : : }</a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 4 : return NULL;</span></a>
+<a name="500"><span class="lineNum"> 500 </span> : : }</a>
+<a name="501"><span class="lineNum"> 501 </span> : : </a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 299 : void mem_free(struct mem_region *region, void *mem, const char *location)</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : {</a>
+<a name="504"><span class="lineNum"> 504 </span> : : struct alloc_hdr *hdr;</a>
+<a name="505"><span class="lineNum"> 505 </span> : : </a>
+<a name="506"><span class="lineNum"> 506 </span> : : /* This should be a constant. */</a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : assert(is_rodata(location));</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 299 : assert(lock_held_by_me(&amp;region-&gt;free_list_lock));</span></a>
+<a name="510"><span class="lineNum"> 510 </span> : : </a>
+<a name="511"><span class="lineNum"> 511 </span> : : /* Freeing NULL is always a noop. */</a>
+<a name="512"><span class="lineNum"> 512 </span> :<span class="lineCov"> 299 : if (!mem)</span></a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 1 : return;</span></a>
+<a name="514"><span class="lineNum"> 514 </span> : : </a>
+<a name="515"><span class="lineNum"> 515 </span> : : /* Your memory is in the region, right? */</a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineCov"> 298 : assert(mem &gt;= region_start(region) + sizeof(*hdr));</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 298 : assert(mem &lt; region_start(region) + region-&gt;len);</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : </a>
+<a name="519"><span class="lineNum"> 519 </span> : : /* Grab header. */</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 298 : hdr = mem - sizeof(*hdr);</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 298 : if (hdr-&gt;free)</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : bad_header(region, hdr, &quot;re-freed&quot;, location);</span></a>
+<a name="524"><span class="lineNum"> 524 </span> : : </a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineCov"> 298 : make_free(region, (struct free_hdr *)hdr, location, false);</span></a>
+<a name="526"><span class="lineNum"> 526 </span> : : }</a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 65539 : size_t mem_allocated_size(const void *ptr)</span></a>
+<a name="529"><span class="lineNum"> 529 </span> : : {</a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 65539 : const struct alloc_hdr *hdr = ptr - sizeof(*hdr);</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 65539 : return hdr-&gt;num_longs * sizeof(long) - sizeof(struct alloc_hdr);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineCov"> 131048 : bool mem_resize(struct mem_region *region, void *mem, size_t len,</span></a>
+<a name="535"><span class="lineNum"> 535 </span> : : const char *location)</a>
+<a name="536"><span class="lineNum"> 536 </span> : : {</a>
+<a name="537"><span class="lineNum"> 537 </span> : : struct alloc_hdr *hdr, *next;</a>
+<a name="538"><span class="lineNum"> 538 </span> : : struct free_hdr *f;</a>
+<a name="539"><span class="lineNum"> 539 </span> : : </a>
+<a name="540"><span class="lineNum"> 540 </span> : : /* This should be a constant. */</a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : assert(is_rodata(location));</span></a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 131048 : assert(lock_held_by_me(&amp;region-&gt;free_list_lock));</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> : : /* Get header. */</a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineCov"> 131048 : hdr = mem - sizeof(*hdr);</span></a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineCov"> 131048 : if (hdr-&gt;free)</span></a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : bad_header(region, hdr, &quot;resize&quot;, location);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> : : /* Round up size to multiple of longs. */</a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineCov"> 131048 : len = (sizeof(*hdr) + len + sizeof(long) - 1) / sizeof(long);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> : : </a>
+<a name="553"><span class="lineNum"> 553 </span> : : /* Can't be too small for when we free it, either. */</a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineCov"> 131048 : if (len &lt; ALLOC_MIN_LONGS)</span></a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineCov"> 34 : len = ALLOC_MIN_LONGS;</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : </a>
+<a name="557"><span class="lineNum"> 557 </span> : : /* Shrinking is simple. */</a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 131048 : if (len &lt;= hdr-&gt;num_longs) {</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 122860 : hdr-&gt;location = location;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineCov"> 122860 : discard_excess(region, hdr, len, location, false);</span></a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineCov"> 122860 : return true;</span></a>
+<a name="562"><span class="lineNum"> 562 </span> : : }</a>
+<a name="563"><span class="lineNum"> 563 </span> : : </a>
+<a name="564"><span class="lineNum"> 564 </span> : : /* Check if we can expand. */</a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineCov"> 8188 : next = next_hdr(region, hdr);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 8188 : if (!next || !next-&gt;free || hdr-&gt;num_longs + next-&gt;num_longs &lt; len)</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineCov"> 3 : return false;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : </a>
+<a name="569"><span class="lineNum"> 569 </span> : : /* OK, it's free and big enough, absorb it. */</a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineCov"> 8185 : f = (struct free_hdr *)next;</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineCov"> 8185 : list_del_from(&amp;region-&gt;free_list, &amp;f-&gt;list);</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineCov"> 8185 : hdr-&gt;num_longs += next-&gt;num_longs;</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineCov"> 8185 : hdr-&gt;location = location;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : </a>
+<a name="575"><span class="lineNum"> 575 </span> : : /* Update next prev_free */</a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineCov"> 8185 : next = next_hdr(region, &amp;f-&gt;hdr);</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineCov"> 8185 : if (next) {</span></a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineCov"> 1 : assert(next-&gt;prev_free);</span></a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineCov"> 1 : next-&gt;prev_free = false;</span></a>
+<a name="580"><span class="lineNum"> 580 </span> : : }</a>
+<a name="581"><span class="lineNum"> 581 </span> : : </a>
+<a name="582"><span class="lineNum"> 582 </span> : : /* Clear tailer for debugging */</a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineCov"> 8185 : *tailer(f) = 0;</span></a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> : : /* Now we might have *too* much. */</a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 8185 : discard_excess(region, hdr, len, location, true);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 8185 : return true;</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : }</a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 131270 : bool mem_check(const struct mem_region *region)</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : {</a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 131270 : size_t frees = 0;</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 131270 : struct alloc_hdr *hdr, *prev_free = NULL;</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : struct free_hdr *f;</a>
+<a name="595"><span class="lineNum"> 595 </span> : : </a>
+<a name="596"><span class="lineNum"> 596 </span> : : /* Check it's sanely aligned. */</a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineCov"> 131270 : if (region-&gt;start % sizeof(long)) {</span></a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Region '%s' not sanely aligned (%llx)\n&quot;,</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : region-&gt;name, (unsigned long long)region-&gt;start);</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="601"><span class="lineNum"> 601 </span> : : }</a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 131270 : if ((long)region-&gt;len % sizeof(long)) {</span></a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Region '%s' not sane length (%llu)\n&quot;,</span></a>
+<a name="604"><span class="lineNum"> 604 </span> : : region-&gt;name, (unsigned long long)region-&gt;len);</a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : }</a>
+<a name="607"><span class="lineNum"> 607 </span> : : </a>
+<a name="608"><span class="lineNum"> 608 </span> : : /* Not ours to play with, or empty? Don't do anything. */</a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineCov"> 131270 : if (!(region-&gt;type == REGION_MEMORY ||</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineCov"> 131263 : region-&gt;type == REGION_SKIBOOT_HEAP) ||</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineCov"> 131252 : region-&gt;free_list.n.next == NULL)</span></a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineCov"> 30 : return true;</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : </a>
+<a name="614"><span class="lineNum"> 614 </span> : : /* Walk linearly. */</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 402800 : for (hdr = region_start(region); hdr; hdr = next_hdr(region, hdr)) {</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineCov"> 271560 : if (hdr-&gt;num_longs &lt; ALLOC_MIN_LONGS) {</span></a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Region '%s' %s %p (%s) size %zu\n&quot;,</span></a>
+<a name="618"><span class="lineNum"> 618 </span> : : region-&gt;name, hdr-&gt;free ? &quot;free&quot; : &quot;alloc&quot;,</a>
+<a name="619"><span class="lineNum"> 619 </span> : : hdr, hdr_location(hdr),</a>
+<a name="620"><span class="lineNum"> 620 </span> : : hdr-&gt;num_longs * sizeof(long));</a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : }</a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineCov"> 271560 : if ((unsigned long)hdr + hdr-&gt;num_longs * sizeof(long) &gt;</span></a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineCov"> 271560 : region-&gt;start + region-&gt;len) {</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Region '%s' %s %p (%s) oversize %zu\n&quot;,</span></a>
+<a name="626"><span class="lineNum"> 626 </span> : : region-&gt;name, hdr-&gt;free ? &quot;free&quot; : &quot;alloc&quot;,</a>
+<a name="627"><span class="lineNum"> 627 </span> : : hdr, hdr_location(hdr),</a>
+<a name="628"><span class="lineNum"> 628 </span> : : hdr-&gt;num_longs * sizeof(long));</a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 271560 : if (hdr-&gt;free) {</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 131188 : if (hdr-&gt;prev_free || prev_free) {</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Region '%s' free %p (%s) has prev_free&quot;</span></a>
+<a name="634"><span class="lineNum"> 634 </span> : : &quot; %p (%s) %sset?\n&quot;,</a>
+<a name="635"><span class="lineNum"> 635 </span> : : region-&gt;name, hdr, hdr_location(hdr),</a>
+<a name="636"><span class="lineNum"> 636 </span> : : prev_free,</a>
+<a name="637"><span class="lineNum"> 637 </span> : : prev_free ? hdr_location(prev_free)</a>
+<a name="638"><span class="lineNum"> 638 </span> : : : &quot;NULL&quot;,</a>
+<a name="639"><span class="lineNum"> 639 </span> : : hdr-&gt;prev_free ? &quot;&quot; : &quot;un&quot;);</a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="641"><span class="lineNum"> 641 </span> : : }</a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineCov"> 131188 : prev_free = hdr;</span></a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 131188 : frees ^= (unsigned long)hdr - region-&gt;start;</span></a>
+<a name="644"><span class="lineNum"> 644 </span> : : } else {</a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 140372 : if (hdr-&gt;prev_free != (bool)prev_free) {</span></a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Region '%s' alloc %p (%s) has&quot;</span></a>
+<a name="647"><span class="lineNum"> 647 </span> : : &quot; prev_free %p %sset?\n&quot;,</a>
+<a name="648"><span class="lineNum"> 648 </span> : : region-&gt;name, hdr, hdr_location(hdr),</a>
+<a name="649"><span class="lineNum"> 649 </span> : : prev_free, hdr-&gt;prev_free ? &quot;&quot; : &quot;un&quot;);</a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="651"><span class="lineNum"> 651 </span> : : }</a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 140372 : prev_free = NULL;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : }</a>
+<a name="654"><span class="lineNum"> 654 </span> : : }</a>
+<a name="655"><span class="lineNum"> 655 </span> : : </a>
+<a name="656"><span class="lineNum"> 656 </span> : : /* Now walk free list. */</a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 262428 : list_for_each(&amp;region-&gt;free_list, f, list)</span></a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineCov"> 131188 : frees ^= (unsigned long)f - region-&gt;start;</span></a>
+<a name="659"><span class="lineNum"> 659 </span> : : </a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineCov"> 131240 : if (frees) {</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Region '%s' free list and walk do not match!\n&quot;,</span></a>
+<a name="662"><span class="lineNum"> 662 </span> : : region-&gt;name);</a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> : : }</a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineCov"> 131240 : return true;</span></a>
+<a name="666"><span class="lineNum"> 666 </span> : : }</a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : bool mem_check_all(void)</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : {</a>
+<a name="670"><span class="lineNum"> 670 </span> : : struct mem_region *r;</a>
+<a name="671"><span class="lineNum"> 671 </span> : : </a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : if (!mem_check(r))</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : }</a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="678"><span class="lineNum"> 678 </span> : : }</a>
+<a name="679"><span class="lineNum"> 679 </span> : : </a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineCov"> 100 : static struct mem_region *new_region(const char *name,</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : uint64_t start, uint64_t len,</a>
+<a name="682"><span class="lineNum"> 682 </span> : : struct dt_node *node,</a>
+<a name="683"><span class="lineNum"> 683 </span> : : enum mem_region_type type)</a>
+<a name="684"><span class="lineNum"> 684 </span> : : {</a>
+<a name="685"><span class="lineNum"> 685 </span> : : struct mem_region *region;</a>
+<a name="686"><span class="lineNum"> 686 </span> : : </a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 100 : region = malloc(sizeof(*region));</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineCov"> 100 : if (!region)</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : </a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineCov"> 100 : region-&gt;name = name;</span></a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineCov"> 100 : region-&gt;start = start;</span></a>
+<a name="693"><span class="lineNum"> 693 </span> :<span class="lineCov"> 100 : region-&gt;len = len;</span></a>
+<a name="694"><span class="lineNum"> 694 </span> :<span class="lineCov"> 100 : region-&gt;node = node;</span></a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 100 : region-&gt;type = type;</span></a>
+<a name="696"><span class="lineNum"> 696 </span> :<span class="lineCov"> 100 : region-&gt;free_list.n.next = NULL;</span></a>
+<a name="697"><span class="lineNum"> 697 </span> :<span class="lineCov"> 100 : init_lock(&amp;region-&gt;free_list_lock);</span></a>
+<a name="698"><span class="lineNum"> 698 </span> : : </a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineCov"> 100 : return region;</span></a>
+<a name="700"><span class="lineNum"> 700 </span> : : }</a>
+<a name="701"><span class="lineNum"> 701 </span> : : </a>
+<a name="702"><span class="lineNum"> 702 </span> : : /* We always split regions, so we only have to replace one. */</a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 41 : static struct mem_region *split_region(struct mem_region *head,</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : uint64_t split_at,</a>
+<a name="705"><span class="lineNum"> 705 </span> : : enum mem_region_type type)</a>
+<a name="706"><span class="lineNum"> 706 </span> : : {</a>
+<a name="707"><span class="lineNum"> 707 </span> : : struct mem_region *tail;</a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 41 : uint64_t end = head-&gt;start + head-&gt;len;</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 41 : tail = new_region(head-&gt;name, split_at, end - split_at,</span></a>
+<a name="711"><span class="lineNum"> 711 </span> : : head-&gt;node, type);</a>
+<a name="712"><span class="lineNum"> 712 </span> : : /* Original region becomes head. */</a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 41 : if (tail)</span></a>
+<a name="714"><span class="lineNum"> 714 </span> :<span class="lineCov"> 41 : head-&gt;len -= tail-&gt;len;</span></a>
+<a name="715"><span class="lineNum"> 715 </span> : : </a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineCov"> 41 : return tail;</span></a>
+<a name="717"><span class="lineNum"> 717 </span> : : }</a>
+<a name="718"><span class="lineNum"> 718 </span> : : </a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 1170 : static bool intersects(const struct mem_region *region, uint64_t addr)</span></a>
+<a name="720"><span class="lineNum"> 720 </span> : : {</a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 1699 : return addr &gt; region-&gt;start &amp;&amp;</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 529 : addr &lt; region-&gt;start + region-&gt;len;</span></a>
+<a name="723"><span class="lineNum"> 723 </span> : : }</a>
+<a name="724"><span class="lineNum"> 724 </span> : : </a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineCov"> 1170 : static bool maybe_split(struct mem_region *r, uint64_t split_at)</span></a>
+<a name="726"><span class="lineNum"> 726 </span> : : {</a>
+<a name="727"><span class="lineNum"> 727 </span> : : struct mem_region *tail;</a>
+<a name="728"><span class="lineNum"> 728 </span> : : </a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineCov"> 1170 : if (!intersects(r, split_at))</span></a>
+<a name="730"><span class="lineNum"> 730 </span> :<span class="lineCov"> 1130 : return true;</span></a>
+<a name="731"><span class="lineNum"> 731 </span> : : </a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineCov"> 40 : tail = split_region(r, split_at, r-&gt;type);</span></a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineCov"> 40 : if (!tail)</span></a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="735"><span class="lineNum"> 735 </span> : : </a>
+<a name="736"><span class="lineNum"> 736 </span> : : /* Tail add is important: we may need to split again! */</a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineCov"> 40 : list_add_after(&amp;regions, &amp;tail-&gt;list, &amp;r-&gt;list);</span></a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineCov"> 40 : return true;</span></a>
+<a name="739"><span class="lineNum"> 739 </span> : : }</a>
+<a name="740"><span class="lineNum"> 740 </span> : : </a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 1357 : static bool overlaps(const struct mem_region *r1, const struct mem_region *r2)</span></a>
+<a name="742"><span class="lineNum"> 742 </span> : : {</a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineCov"> 1357 : return (r1-&gt;start + r1-&gt;len &gt; r2-&gt;start</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineCov"> 1357 : &amp;&amp; r1-&gt;start &lt; r2-&gt;start + r2-&gt;len);</span></a>
+<a name="745"><span class="lineNum"> 745 </span> : : }</a>
+<a name="746"><span class="lineNum"> 746 </span> : : </a>
+<a name="747"><span class="lineNum"> 747 </span> :<span class="lineCov"> 45 : static bool contains(const struct mem_region *r1, const struct mem_region *r2)</span></a>
+<a name="748"><span class="lineNum"> 748 </span> : : {</a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineCov"> 45 : u64 r1_end = r1-&gt;start + r1-&gt;len;</span></a>
+<a name="750"><span class="lineNum"> 750 </span> :<span class="lineCov"> 45 : u64 r2_end = r2-&gt;start + r2-&gt;len;</span></a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineCov"> 45 : return (r1-&gt;start &lt;= r2-&gt;start &amp;&amp; r2_end &lt;= r1_end);</span></a>
+<a name="753"><span class="lineNum"> 753 </span> : : }</a>
+<a name="754"><span class="lineNum"> 754 </span> : : </a>
+<a name="755"><span class="lineNum"> 755 </span> :<span class="lineCov"> 165 : static struct mem_region *get_overlap(const struct mem_region *region)</span></a>
+<a name="756"><span class="lineNum"> 756 </span> : : {</a>
+<a name="757"><span class="lineNum"> 757 </span> : : struct mem_region *i;</a>
+<a name="758"><span class="lineNum"> 758 </span> : : </a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineCov"> 817 : list_for_each(&amp;regions, i, list) {</span></a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineCov"> 682 : if (overlaps(region, i))</span></a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineCov"> 30 : return i;</span></a>
+<a name="762"><span class="lineNum"> 762 </span> : : }</a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 135 : return NULL;</span></a>
+<a name="764"><span class="lineNum"> 764 </span> : : }</a>
+<a name="765"><span class="lineNum"> 765 </span> : : </a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineCov"> 158 : static void add_region_to_regions(struct mem_region *region)</span></a>
+<a name="767"><span class="lineNum"> 767 </span> : : {</a>
+<a name="768"><span class="lineNum"> 768 </span> : : struct mem_region *r;</a>
+<a name="769"><span class="lineNum"> 769 </span> : : </a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineCov"> 410 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="771"><span class="lineNum"> 771 </span> :<span class="lineCov"> 384 : if (r-&gt;start &lt; region-&gt;start)</span></a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineCov"> 252 : continue;</span></a>
+<a name="773"><span class="lineNum"> 773 </span> : : </a>
+<a name="774"><span class="lineNum"> 774 </span> :<span class="lineCov"> 132 : list_add_before(&amp;regions, &amp;region-&gt;list, &amp;r-&gt;list);</span></a>
+<a name="775"><span class="lineNum"> 775 </span> :<span class="lineCov"> 132 : return;</span></a>
+<a name="776"><span class="lineNum"> 776 </span> : : }</a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 26 : list_add_tail(&amp;regions, &amp;region-&gt;list);</span></a>
+<a name="778"><span class="lineNum"> 778 </span> : : }</a>
+<a name="779"><span class="lineNum"> 779 </span> : : </a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 136 : static bool add_region(struct mem_region *region)</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : {</a>
+<a name="782"><span class="lineNum"> 782 </span> : : struct mem_region *r;</a>
+<a name="783"><span class="lineNum"> 783 </span> : : </a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 136 : if (mem_regions_finalised) {</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 1 : prerror(&quot;MEM: add_region(%s@0x%&quot;PRIx64&quot;) called after finalise!\n&quot;,</span></a>
+<a name="786"><span class="lineNum"> 786 </span> : : region-&gt;name, region-&gt;start);</a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineCov"> 1 : return false;</span></a>
+<a name="788"><span class="lineNum"> 788 </span> : : }</a>
+<a name="789"><span class="lineNum"> 789 </span> : : </a>
+<a name="790"><span class="lineNum"> 790 </span> : : /* First split any regions which intersect. */</a>
+<a name="791"><span class="lineNum"> 791 </span> :<span class="lineCov"> 720 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="792"><span class="lineNum"> 792 </span> : : /*</a>
+<a name="793"><span class="lineNum"> 793 </span> : : * The new region should be fully contained by an existing one.</a>
+<a name="794"><span class="lineNum"> 794 </span> : : * If it's not then we have a problem where reservations</a>
+<a name="795"><span class="lineNum"> 795 </span> : : * partially overlap which is probably broken.</a>
+<a name="796"><span class="lineNum"> 796 </span> : : *</a>
+<a name="797"><span class="lineNum"> 797 </span> : : * NB: There *might* be situations where this is legitimate,</a>
+<a name="798"><span class="lineNum"> 798 </span> : : * but the region handling does not currently support this.</a>
+<a name="799"><span class="lineNum"> 799 </span> : : */</a>
+<a name="800"><span class="lineNum"> 800 </span> :<span class="lineCov"> 585 : if (overlaps(r, region) &amp;&amp; !contains(r, region)) {</span></a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MEM: Partial overlap detected between regions:\n&quot;);</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MEM: %s [0x%&quot;PRIx64&quot;-0x%&quot;PRIx64&quot;] (new)\n&quot;,</span></a>
+<a name="803"><span class="lineNum"> 803 </span> : : region-&gt;name, region-&gt;start,</a>
+<a name="804"><span class="lineNum"> 804 </span> : : region-&gt;start + region-&gt;len);</a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MEM: %s [0x%&quot;PRIx64&quot;-0x%&quot;PRIx64&quot;]\n&quot;,</span></a>
+<a name="806"><span class="lineNum"> 806 </span> : : r-&gt;name, r-&gt;start, r-&gt;start + r-&gt;len);</a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="808"><span class="lineNum"> 808 </span> : : }</a>
+<a name="809"><span class="lineNum"> 809 </span> : : </a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineCov"> 585 : if (!maybe_split(r, region-&gt;start) ||</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineCov"> 585 : !maybe_split(r, region-&gt;start + region-&gt;len))</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : }</a>
+<a name="814"><span class="lineNum"> 814 </span> : : </a>
+<a name="815"><span class="lineNum"> 815 </span> : : /* Now we have only whole overlaps, if any. */</a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineCov"> 165 : while ((r = get_overlap(region)) != NULL) {</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 30 : assert(r-&gt;start == region-&gt;start);</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 30 : assert(r-&gt;len == region-&gt;len);</span></a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineCov"> 30 : list_del_from(&amp;regions, &amp;r-&gt;list);</span></a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineCov"> 30 : free(r);</span></a>
+<a name="821"><span class="lineNum"> 821 </span> : : }</a>
+<a name="822"><span class="lineNum"> 822 </span> : : </a>
+<a name="823"><span class="lineNum"> 823 </span> : : /* Finally, add in our own region. */</a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineCov"> 135 : add_region_to_regions(region);</span></a>
+<a name="825"><span class="lineNum"> 825 </span> :<span class="lineCov"> 135 : return true;</span></a>
+<a name="826"><span class="lineNum"> 826 </span> : : }</a>
+<a name="827"><span class="lineNum"> 827 </span> : : </a>
+<a name="828"><span class="lineNum"> 828 </span> :<span class="lineCov"> 25 : static void mem_reserve(enum mem_region_type type, const char *name,</span></a>
+<a name="829"><span class="lineNum"> 829 </span> : : uint64_t start, uint64_t len)</a>
+<a name="830"><span class="lineNum"> 830 </span> : : {</a>
+<a name="831"><span class="lineNum"> 831 </span> : : struct mem_region *region;</a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineCov"> 25 : bool added = true;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> : : </a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineCov"> 25 : lock(&amp;mem_region_lock);</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 25 : region = new_region(name, start, len, NULL, type);</span></a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineCov"> 25 : assert(region);</span></a>
+<a name="837"><span class="lineNum"> 837 </span> : : </a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineCov"> 25 : if (!mem_region_init_done)</span></a>
+<a name="839"><span class="lineNum"> 839 </span> :<span class="lineCov"> 3 : list_add(&amp;early_reserves, &amp;region-&gt;list);</span></a>
+<a name="840"><span class="lineNum"> 840 </span> : : else</a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 22 : added = add_region(region);</span></a>
+<a name="842"><span class="lineNum"> 842 </span> : : </a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineCov"> 25 : assert(added);</span></a>
+<a name="844"><span class="lineNum"> 844 </span> :<span class="lineCov"> 25 : unlock(&amp;mem_region_lock);</span></a>
+<a name="845"><span class="lineNum"> 845 </span> :<span class="lineCov"> 25 : }</span></a>
+<a name="846"><span class="lineNum"> 846 </span> : : </a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineCov"> 25 : void mem_reserve_fw(const char *name, uint64_t start, uint64_t len)</span></a>
+<a name="848"><span class="lineNum"> 848 </span> : : {</a>
+<a name="849"><span class="lineNum"> 849 </span> :<span class="lineCov"> 25 : mem_reserve(REGION_FW_RESERVED, name, start, len);</span></a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineCov"> 25 : }</span></a>
+<a name="851"><span class="lineNum"> 851 </span> : : </a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineNoCov"> 0 : void mem_reserve_hwbuf(const char *name, uint64_t start, uint64_t len)</span></a>
+<a name="853"><span class="lineNum"> 853 </span> : : {</a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineNoCov"> 0 : mem_reserve(REGION_RESERVED, name, start, len);</span></a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="856"><span class="lineNum"> 856 </span> : : </a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : static bool matches_chip_id(const __be32 ids[], size_t num, u32 chip_id)</span></a>
+<a name="858"><span class="lineNum"> 858 </span> : : {</a>
+<a name="859"><span class="lineNum"> 859 </span> : : size_t i;</a>
+<a name="860"><span class="lineNum"> 860 </span> : : </a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; num; i++)</span></a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(ids[i]) == chip_id)</span></a>
+<a name="863"><span class="lineNum"> 863 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="864"><span class="lineNum"> 864 </span> : : </a>
+<a name="865"><span class="lineNum"> 865 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="866"><span class="lineNum"> 866 </span> : : }</a>
+<a name="867"><span class="lineNum"> 867 </span> : : </a>
+<a name="868"><span class="lineNum"> 868 </span> :<span class="lineNoCov"> 0 : void *__local_alloc(unsigned int chip_id, size_t size, size_t align,</span></a>
+<a name="869"><span class="lineNum"> 869 </span> : : const char *location)</a>
+<a name="870"><span class="lineNum"> 870 </span> : : {</a>
+<a name="871"><span class="lineNum"> 871 </span> : : struct mem_region *region;</a>
+<a name="872"><span class="lineNum"> 872 </span> :<span class="lineNoCov"> 0 : void *p = NULL;</span></a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineNoCov"> 0 : bool use_local = true;</span></a>
+<a name="874"><span class="lineNum"> 874 </span> : : </a>
+<a name="875"><span class="lineNum"> 875 </span> :<span class="lineNoCov"> 0 : lock(&amp;mem_region_lock);</span></a>
+<a name="876"><span class="lineNum"> 876 </span> : : </a>
+<a name="877"><span class="lineNum"> 877 </span> :<span class="lineNoCov"> 0 : restart:</span></a>
+<a name="878"><span class="lineNum"> 878 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;regions, region, list) {</span></a>
+<a name="879"><span class="lineNum"> 879 </span> : : const struct dt_property *prop;</a>
+<a name="880"><span class="lineNum"> 880 </span> : : const __be32 *ids;</a>
+<a name="881"><span class="lineNum"> 881 </span> : : </a>
+<a name="882"><span class="lineNum"> 882 </span> :<span class="lineNoCov"> 0 : if (!(region-&gt;type == REGION_SKIBOOT_HEAP ||</span></a>
+<a name="883"><span class="lineNum"> 883 </span> :<span class="lineNoCov"> 0 : region-&gt;type == REGION_MEMORY))</span></a>
+<a name="884"><span class="lineNum"> 884 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="885"><span class="lineNum"> 885 </span> : : </a>
+<a name="886"><span class="lineNum"> 886 </span> : : /* Don't allocate from normal heap. */</a>
+<a name="887"><span class="lineNum"> 887 </span> :<span class="lineNoCov"> 0 : if (region == &amp;skiboot_heap)</span></a>
+<a name="888"><span class="lineNum"> 888 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="889"><span class="lineNum"> 889 </span> : : </a>
+<a name="890"><span class="lineNum"> 890 </span> : : /* First pass, only match node local regions */</a>
+<a name="891"><span class="lineNum"> 891 </span> :<span class="lineNoCov"> 0 : if (use_local) {</span></a>
+<a name="892"><span class="lineNum"> 892 </span> :<span class="lineNoCov"> 0 : if (!region-&gt;node)</span></a>
+<a name="893"><span class="lineNum"> 893 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="894"><span class="lineNum"> 894 </span> :<span class="lineNoCov"> 0 : prop = dt_find_property(region-&gt;node, &quot;ibm,chip-id&quot;);</span></a>
+<a name="895"><span class="lineNum"> 895 </span> :<span class="lineNoCov"> 0 : ids = (const __be32 *)prop-&gt;prop;</span></a>
+<a name="896"><span class="lineNum"> 896 </span> :<span class="lineNoCov"> 0 : if (!matches_chip_id(ids, prop-&gt;len/sizeof(u32),</span></a>
+<a name="897"><span class="lineNum"> 897 </span> : : chip_id))</a>
+<a name="898"><span class="lineNum"> 898 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="899"><span class="lineNum"> 899 </span> : : }</a>
+<a name="900"><span class="lineNum"> 900 </span> : : </a>
+<a name="901"><span class="lineNum"> 901 </span> : : /* Second pass, match anything */</a>
+<a name="902"><span class="lineNum"> 902 </span> :<span class="lineNoCov"> 0 : lock(&amp;region-&gt;free_list_lock);</span></a>
+<a name="903"><span class="lineNum"> 903 </span> :<span class="lineNoCov"> 0 : p = mem_alloc(region, size, align, location);</span></a>
+<a name="904"><span class="lineNum"> 904 </span> :<span class="lineNoCov"> 0 : unlock(&amp;region-&gt;free_list_lock);</span></a>
+<a name="905"><span class="lineNum"> 905 </span> :<span class="lineNoCov"> 0 : if (p)</span></a>
+<a name="906"><span class="lineNum"> 906 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="907"><span class="lineNum"> 907 </span> : : }</a>
+<a name="908"><span class="lineNum"> 908 </span> : : </a>
+<a name="909"><span class="lineNum"> 909 </span> : : /*</a>
+<a name="910"><span class="lineNum"> 910 </span> : : * If we can't allocate the memory block from the expected</a>
+<a name="911"><span class="lineNum"> 911 </span> : : * node, we bail to any one that can accommodate our request.</a>
+<a name="912"><span class="lineNum"> 912 </span> : : */</a>
+<a name="913"><span class="lineNum"> 913 </span> :<span class="lineNoCov"> 0 : if (!p &amp;&amp; use_local) {</span></a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineNoCov"> 0 : use_local = false;</span></a>
+<a name="915"><span class="lineNum"> 915 </span> :<span class="lineNoCov"> 0 : goto restart;</span></a>
+<a name="916"><span class="lineNum"> 916 </span> : : }</a>
+<a name="917"><span class="lineNum"> 917 </span> : : </a>
+<a name="918"><span class="lineNum"> 918 </span> :<span class="lineNoCov"> 0 : unlock(&amp;mem_region_lock);</span></a>
+<a name="919"><span class="lineNum"> 919 </span> : : </a>
+<a name="920"><span class="lineNum"> 920 </span> :<span class="lineNoCov"> 0 : return p;</span></a>
+<a name="921"><span class="lineNum"> 921 </span> : : }</a>
+<a name="922"><span class="lineNum"> 922 </span> : : </a>
+<a name="923"><span class="lineNum"> 923 </span> :<span class="lineNoCov"> 0 : struct mem_region *find_mem_region(const char *name)</span></a>
+<a name="924"><span class="lineNum"> 924 </span> : : {</a>
+<a name="925"><span class="lineNum"> 925 </span> : : struct mem_region *region;</a>
+<a name="926"><span class="lineNum"> 926 </span> : : </a>
+<a name="927"><span class="lineNum"> 927 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;regions, region, list) {</span></a>
+<a name="928"><span class="lineNum"> 928 </span> :<span class="lineNoCov"> 0 : if (streq(region-&gt;name, name))</span></a>
+<a name="929"><span class="lineNum"> 929 </span> :<span class="lineNoCov"> 0 : return region;</span></a>
+<a name="930"><span class="lineNum"> 930 </span> : : }</a>
+<a name="931"><span class="lineNum"> 931 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="932"><span class="lineNum"> 932 </span> : : }</a>
+<a name="933"><span class="lineNum"> 933 </span> : : </a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineCov"> 14 : bool mem_range_is_reserved(uint64_t start, uint64_t size)</span></a>
+<a name="935"><span class="lineNum"> 935 </span> : : {</a>
+<a name="936"><span class="lineNum"> 936 </span> :<span class="lineCov"> 14 : uint64_t end = start + size;</span></a>
+<a name="937"><span class="lineNum"> 937 </span> : : struct mem_region *region;</a>
+<a name="938"><span class="lineNum"> 938 </span> : : struct list_head *search;</a>
+<a name="939"><span class="lineNum"> 939 </span> : : </a>
+<a name="940"><span class="lineNum"> 940 </span> : : /* We may have the range covered by a number of regions, which could</a>
+<a name="941"><span class="lineNum"> 941 </span> : : * appear in any order. So, we look for a region that covers the</a>
+<a name="942"><span class="lineNum"> 942 </span> : : * start address, and bump start up to the end of that region.</a>
+<a name="943"><span class="lineNum"> 943 </span> : : *</a>
+<a name="944"><span class="lineNum"> 944 </span> : : * We repeat until we've either bumped past the end of the range,</a>
+<a name="945"><span class="lineNum"> 945 </span> : : * or we didn't find a matching region.</a>
+<a name="946"><span class="lineNum"> 946 </span> : : *</a>
+<a name="947"><span class="lineNum"> 947 </span> : : * This has a worst-case of O(n^2), but n is well bounded by the</a>
+<a name="948"><span class="lineNum"> 948 </span> : : * small number of reservations.</a>
+<a name="949"><span class="lineNum"> 949 </span> : : */</a>
+<a name="950"><span class="lineNum"> 950 </span> : : </a>
+<a name="951"><span class="lineNum"> 951 </span> :<span class="lineCov"> 14 : if (!mem_region_init_done)</span></a>
+<a name="952"><span class="lineNum"> 952 </span> :<span class="lineNoCov"> 0 : search = &amp;early_reserves;</span></a>
+<a name="953"><span class="lineNum"> 953 </span> : : else</a>
+<a name="954"><span class="lineNum"> 954 </span> :<span class="lineCov"> 14 : search = &amp;regions;</span></a>
+<a name="955"><span class="lineNum"> 955 </span> : : </a>
+<a name="956"><span class="lineNum"> 956 </span> :<span class="lineCov"> 3 : for (;;) {</span></a>
+<a name="957"><span class="lineNum"> 957 </span> :<span class="lineCov"> 17 : bool found = false;</span></a>
+<a name="958"><span class="lineNum"> 958 </span> : : </a>
+<a name="959"><span class="lineNum"> 959 </span> :<span class="lineCov"> 145 : list_for_each(search, region, list) {</span></a>
+<a name="960"><span class="lineNum"> 960 </span> :<span class="lineCov"> 128 : if (!region_is_reserved(region))</span></a>
+<a name="961"><span class="lineNum"> 961 </span> :<span class="lineCov"> 34 : continue;</span></a>
+<a name="962"><span class="lineNum"> 962 </span> : : </a>
+<a name="963"><span class="lineNum"> 963 </span> : : /* does this region overlap the start address, and</a>
+<a name="964"><span class="lineNum"> 964 </span> : : * have a non-zero size? */</a>
+<a name="965"><span class="lineNum"> 965 </span> :<span class="lineCov"> 94 : if (region-&gt;start &lt;= start &amp;&amp;</span></a>
+<a name="966"><span class="lineNum"> 966 </span> :<span class="lineCov"> 20 : region-&gt;start + region-&gt;len &gt; start &amp;&amp;</span></a>
+<a name="967"><span class="lineNum"> 967 </span> :<span class="lineCov"> 15 : region-&gt;len) {</span></a>
+<a name="968"><span class="lineNum"> 968 </span> :<span class="lineCov"> 15 : start = region-&gt;start + region-&gt;len;</span></a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineCov"> 15 : found = true;</span></a>
+<a name="970"><span class="lineNum"> 970 </span> : : }</a>
+<a name="971"><span class="lineNum"> 971 </span> : : }</a>
+<a name="972"><span class="lineNum"> 972 </span> : : </a>
+<a name="973"><span class="lineNum"> 973 </span> : : /* 'end' is the first byte outside of the range */</a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 17 : if (start &gt;= end)</span></a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineCov"> 8 : return true;</span></a>
+<a name="976"><span class="lineNum"> 976 </span> : : </a>
+<a name="977"><span class="lineNum"> 977 </span> :<span class="lineCov"> 9 : if (!found)</span></a>
+<a name="978"><span class="lineNum"> 978 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="979"><span class="lineNum"> 979 </span> : : }</a>
+<a name="980"><span class="lineNum"> 980 </span> : : </a>
+<a name="981"><span class="lineNum"> 981 </span> :<span class="lineCov"> 6 : return false;</span></a>
+<a name="982"><span class="lineNum"> 982 </span> : : }</a>
+<a name="983"><span class="lineNum"> 983 </span> : : </a>
+<a name="984"><span class="lineNum"> 984 </span> :<span class="lineCov"> 20 : static void mem_region_parse_reserved_properties(void)</span></a>
+<a name="985"><span class="lineNum"> 985 </span> : : {</a>
+<a name="986"><span class="lineNum"> 986 </span> : : const struct dt_property *names, *ranges;</a>
+<a name="987"><span class="lineNum"> 987 </span> : : struct mem_region *region;</a>
+<a name="988"><span class="lineNum"> 988 </span> : : </a>
+<a name="989"><span class="lineNum"> 989 </span> :<span class="lineCov"> 20 : prlog(PR_DEBUG, &quot;MEM: parsing reserved memory from &quot;</span></a>
+<a name="990"><span class="lineNum"> 990 </span> : : &quot;reserved-names/-ranges properties\n&quot;);</a>
+<a name="991"><span class="lineNum"> 991 </span> : : </a>
+<a name="992"><span class="lineNum"> 992 </span> :<span class="lineCov"> 20 : names = dt_find_property(dt_root, &quot;reserved-names&quot;);</span></a>
+<a name="993"><span class="lineNum"> 993 </span> :<span class="lineCov"> 20 : ranges = dt_find_property(dt_root, &quot;reserved-ranges&quot;);</span></a>
+<a name="994"><span class="lineNum"> 994 </span> :<span class="lineCov"> 22 : if (names &amp;&amp; ranges) {</span></a>
+<a name="995"><span class="lineNum"> 995 </span> : : const uint64_t *range;</a>
+<a name="996"><span class="lineNum"> 996 </span> : : int n, len;</a>
+<a name="997"><span class="lineNum"> 997 </span> : : </a>
+<a name="998"><span class="lineNum"> 998 </span> :<span class="lineCov"> 2 : range = (const void *)ranges-&gt;prop;</span></a>
+<a name="999"><span class="lineNum"> 999 </span> : : </a>
+<a name="1000"><span class="lineNum"> 1000 </span> :<span class="lineCov"> 8 : for (n = 0; n &lt; names-&gt;len; n += len, range += 2) {</span></a>
+<a name="1001"><span class="lineNum"> 1001 </span> : : char *name;</a>
+<a name="1002"><span class="lineNum"> 1002 </span> : : </a>
+<a name="1003"><span class="lineNum"> 1003 </span> :<span class="lineCov"> 6 : len = strlen(names-&gt;prop + n) + 1;</span></a>
+<a name="1004"><span class="lineNum"> 1004 </span> :<span class="lineCov"> 6 : name = strdup(names-&gt;prop + n);</span></a>
+<a name="1005"><span class="lineNum"> 1005 </span> : : </a>
+<a name="1006"><span class="lineNum"> 1006 </span> :<span class="lineCov"> 6 : region = new_region(name,</span></a>
+<a name="1007"><span class="lineNum"> 1007 </span> : : dt_get_number(range, 2),</a>
+<a name="1008"><span class="lineNum"> 1008 </span> :<span class="lineCov"> 6 : dt_get_number(range + 1, 2),</span></a>
+<a name="1009"><span class="lineNum"> 1009 </span> : : NULL, REGION_FW_RESERVED);</a>
+<a name="1010"><span class="lineNum"> 1010 </span> :<span class="lineCov"> 6 : if (!add_region(region)) {</span></a>
+<a name="1011"><span class="lineNum"> 1011 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Couldn't add mem_region %s\n&quot;, name);</span></a>
+<a name="1012"><span class="lineNum"> 1012 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="1013"><span class="lineNum"> 1013 </span> : : }</a>
+<a name="1014"><span class="lineNum"> 1014 </span> : : }</a>
+<a name="1015"><span class="lineNum"> 1015 </span> :<span class="lineCov"> 18 : } else if (names || ranges) {</span></a>
+<a name="1016"><span class="lineNum"> 1016 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Invalid properties: reserved-names=%p &quot;</span></a>
+<a name="1017"><span class="lineNum"> 1017 </span> : : &quot;with reserved-ranges=%p\n&quot;,</a>
+<a name="1018"><span class="lineNum"> 1018 </span> : : names, ranges);</a>
+<a name="1019"><span class="lineNum"> 1019 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="1020"><span class="lineNum"> 1020 </span> : : } else {</a>
+<a name="1021"><span class="lineNum"> 1021 </span> :<span class="lineCov"> 18 : return;</span></a>
+<a name="1022"><span class="lineNum"> 1022 </span> : : }</a>
+<a name="1023"><span class="lineNum"> 1023 </span> : : }</a>
+<a name="1024"><span class="lineNum"> 1024 </span> : : </a>
+<a name="1025"><span class="lineNum"> 1025 </span> :<span class="lineCov"> 40 : static bool mem_region_parse_reserved_nodes(const char *path)</span></a>
+<a name="1026"><span class="lineNum"> 1026 </span> : : {</a>
+<a name="1027"><span class="lineNum"> 1027 </span> : : struct dt_node *parent, *node;</a>
+<a name="1028"><span class="lineNum"> 1028 </span> : : </a>
+<a name="1029"><span class="lineNum"> 1029 </span> :<span class="lineCov"> 40 : parent = dt_find_by_path(dt_root, path);</span></a>
+<a name="1030"><span class="lineNum"> 1030 </span> :<span class="lineCov"> 40 : if (!parent)</span></a>
+<a name="1031"><span class="lineNum"> 1031 </span> :<span class="lineCov"> 40 : return false;</span></a>
+<a name="1032"><span class="lineNum"> 1032 </span> : : </a>
+<a name="1033"><span class="lineNum"> 1033 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;MEM: parsing reserved memory from node %s\n&quot;, path);</span></a>
+<a name="1034"><span class="lineNum"> 1034 </span> : : </a>
+<a name="1035"><span class="lineNum"> 1035 </span> :<span class="lineNoCov"> 0 : dt_for_each_child(parent, node) {</span></a>
+<a name="1036"><span class="lineNum"> 1036 </span> : : const struct dt_property *reg;</a>
+<a name="1037"><span class="lineNum"> 1037 </span> : : struct mem_region *region;</a>
+<a name="1038"><span class="lineNum"> 1038 </span> : : int type;</a>
+<a name="1039"><span class="lineNum"> 1039 </span> : : </a>
+<a name="1040"><span class="lineNum"> 1040 </span> :<span class="lineNoCov"> 0 : reg = dt_find_property(node, &quot;reg&quot;);</span></a>
+<a name="1041"><span class="lineNum"> 1041 </span> :<span class="lineNoCov"> 0 : if (!reg) {</span></a>
+<a name="1042"><span class="lineNum"> 1042 </span> :<span class="lineNoCov"> 0 : char *nodepath = dt_get_path(node);</span></a>
+<a name="1043"><span class="lineNum"> 1043 </span> :<span class="lineNoCov"> 0 : prerror(&quot;node %s has no reg property, ignoring\n&quot;,</span></a>
+<a name="1044"><span class="lineNum"> 1044 </span> : : nodepath);</a>
+<a name="1045"><span class="lineNum"> 1045 </span> :<span class="lineNoCov"> 0 : free(nodepath);</span></a>
+<a name="1046"><span class="lineNum"> 1046 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1047"><span class="lineNum"> 1047 </span> : : }</a>
+<a name="1048"><span class="lineNum"> 1048 </span> : : </a>
+<a name="1049"><span class="lineNum"> 1049 </span> :<span class="lineNoCov"> 0 : if (dt_has_node_property(node, &quot;no-map&quot;, NULL))</span></a>
+<a name="1050"><span class="lineNum"> 1050 </span> :<span class="lineNoCov"> 0 : type = REGION_RESERVED;</span></a>
+<a name="1051"><span class="lineNum"> 1051 </span> : : else</a>
+<a name="1052"><span class="lineNum"> 1052 </span> :<span class="lineNoCov"> 0 : type = REGION_FW_RESERVED;</span></a>
+<a name="1053"><span class="lineNum"> 1053 </span> : : </a>
+<a name="1054"><span class="lineNum"> 1054 </span> :<span class="lineNoCov"> 0 : region = new_region(strdup(node-&gt;name),</span></a>
+<a name="1055"><span class="lineNum"> 1055 </span> :<span class="lineNoCov"> 0 : dt_get_number(reg-&gt;prop, 2),</span></a>
+<a name="1056"><span class="lineNum"> 1056 </span> :<span class="lineNoCov"> 0 : dt_get_number(reg-&gt;prop + sizeof(u64), 2),</span></a>
+<a name="1057"><span class="lineNum"> 1057 </span> : : node, type);</a>
+<a name="1058"><span class="lineNum"> 1058 </span> :<span class="lineNoCov"> 0 : if (!add_region(region)) {</span></a>
+<a name="1059"><span class="lineNum"> 1059 </span> :<span class="lineNoCov"> 0 : char *nodepath = dt_get_path(node);</span></a>
+<a name="1060"><span class="lineNum"> 1060 </span> :<span class="lineNoCov"> 0 : prerror(&quot;node %s failed to add_region()\n&quot;, nodepath);</span></a>
+<a name="1061"><span class="lineNum"> 1061 </span> :<span class="lineNoCov"> 0 : free(nodepath);</span></a>
+<a name="1062"><span class="lineNum"> 1062 </span> : : }</a>
+<a name="1063"><span class="lineNum"> 1063 </span> : : }</a>
+<a name="1064"><span class="lineNum"> 1064 </span> : : </a>
+<a name="1065"><span class="lineNum"> 1065 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="1066"><span class="lineNum"> 1066 </span> : : }</a>
+<a name="1067"><span class="lineNum"> 1067 </span> : : </a>
+<a name="1068"><span class="lineNum"> 1068 </span> : : /* Trawl through device tree, create memory regions from nodes. */</a>
+<a name="1069"><span class="lineNum"> 1069 </span> :<span class="lineCov"> 20 : void mem_region_init(void)</span></a>
+<a name="1070"><span class="lineNum"> 1070 </span> : : {</a>
+<a name="1071"><span class="lineNum"> 1071 </span> : : struct mem_region *region, *next;</a>
+<a name="1072"><span class="lineNum"> 1072 </span> : : struct dt_node *i;</a>
+<a name="1073"><span class="lineNum"> 1073 </span> : : bool rc;</a>
+<a name="1074"><span class="lineNum"> 1074 </span> : : </a>
+<a name="1075"><span class="lineNum"> 1075 </span> : : /*</a>
+<a name="1076"><span class="lineNum"> 1076 </span> : : * Add associativity properties outside of the lock</a>
+<a name="1077"><span class="lineNum"> 1077 </span> : : * to avoid recursive locking caused by allocations</a>
+<a name="1078"><span class="lineNum"> 1078 </span> : : * done by add_chip_dev_associativity()</a>
+<a name="1079"><span class="lineNum"> 1079 </span> : : */</a>
+<a name="1080"><span class="lineNum"> 1080 </span> :<span class="lineCov"> 274 : dt_for_each_node(dt_root, i) {</span></a>
+<a name="1081"><span class="lineNum"> 1081 </span> :<span class="lineCov"> 254 : if (!dt_has_node_property(i, &quot;device_type&quot;, &quot;memory&quot;) &amp;&amp;</span></a>
+<a name="1082"><span class="lineNum"> 1082 </span> :<span class="lineCov"> 231 : !dt_has_node_property(i, &quot;compatible&quot;, &quot;pmem-region&quot;))</span></a>
+<a name="1083"><span class="lineNum"> 1083 </span> :<span class="lineCov"> 231 : continue;</span></a>
+<a name="1084"><span class="lineNum"> 1084 </span> : : </a>
+<a name="1085"><span class="lineNum"> 1085 </span> : : /* Add associativity properties */</a>
+<a name="1086"><span class="lineNum"> 1086 </span> :<span class="lineCov"> 23 : add_chip_dev_associativity(i);</span></a>
+<a name="1087"><span class="lineNum"> 1087 </span> : : }</a>
+<a name="1088"><span class="lineNum"> 1088 </span> : : </a>
+<a name="1089"><span class="lineNum"> 1089 </span> : : /* Add each memory node. */</a>
+<a name="1090"><span class="lineNum"> 1090 </span> :<span class="lineCov"> 274 : dt_for_each_node(dt_root, i) {</span></a>
+<a name="1091"><span class="lineNum"> 1091 </span> : : uint64_t start, len;</a>
+<a name="1092"><span class="lineNum"> 1092 </span> : : char *rname;</a>
+<a name="1093"><span class="lineNum"> 1093 </span> : : #define NODE_REGION_PREFIX &quot;ibm,firmware-allocs-&quot;</a>
+<a name="1094"><span class="lineNum"> 1094 </span> : : </a>
+<a name="1095"><span class="lineNum"> 1095 </span> :<span class="lineCov"> 254 : if (!dt_has_node_property(i, &quot;device_type&quot;, &quot;memory&quot;))</span></a>
+<a name="1096"><span class="lineNum"> 1096 </span> :<span class="lineCov"> 231 : continue;</span></a>
+<a name="1097"><span class="lineNum"> 1097 </span> :<span class="lineCov"> 23 : rname = zalloc(strlen(i-&gt;name) + strlen(NODE_REGION_PREFIX) + 1);</span></a>
+<a name="1098"><span class="lineNum"> 1098 </span> :<span class="lineCov"> 23 : assert(rname);</span></a>
+<a name="1099"><span class="lineNum"> 1099 </span> :<span class="lineCov"> 23 : strcat(rname, NODE_REGION_PREFIX);</span></a>
+<a name="1100"><span class="lineNum"> 1100 </span> :<span class="lineCov"> 23 : strcat(rname, i-&gt;name);</span></a>
+<a name="1101"><span class="lineNum"> 1101 </span> :<span class="lineCov"> 23 : start = dt_get_address(i, 0, &amp;len);</span></a>
+<a name="1102"><span class="lineNum"> 1102 </span> :<span class="lineCov"> 23 : lock(&amp;mem_region_lock);</span></a>
+<a name="1103"><span class="lineNum"> 1103 </span> :<span class="lineCov"> 23 : region = new_region(rname, start, len, i, REGION_MEMORY);</span></a>
+<a name="1104"><span class="lineNum"> 1104 </span> :<span class="lineCov"> 23 : if (!region) {</span></a>
+<a name="1105"><span class="lineNum"> 1105 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MEM: Could not add mem region %s!\n&quot;, i-&gt;name);</span></a>
+<a name="1106"><span class="lineNum"> 1106 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : }</a>
+<a name="1108"><span class="lineNum"> 1108 </span> :<span class="lineCov"> 23 : add_region_to_regions(region);</span></a>
+<a name="1109"><span class="lineNum"> 1109 </span> :<span class="lineCov"> 23 : if ((start + len) &gt; top_of_ram)</span></a>
+<a name="1110"><span class="lineNum"> 1110 </span> :<span class="lineCov"> 10 : top_of_ram = start + len;</span></a>
+<a name="1111"><span class="lineNum"> 1111 </span> :<span class="lineCov"> 23 : unlock(&amp;mem_region_lock);</span></a>
+<a name="1112"><span class="lineNum"> 1112 </span> : : }</a>
+<a name="1113"><span class="lineNum"> 1113 </span> : : </a>
+<a name="1114"><span class="lineNum"> 1114 </span> : : /*</a>
+<a name="1115"><span class="lineNum"> 1115 </span> : : * This is called after we know the maximum PIR of all CPUs,</a>
+<a name="1116"><span class="lineNum"> 1116 </span> : : * so we can dynamically set the stack length.</a>
+<a name="1117"><span class="lineNum"> 1117 </span> : : */</a>
+<a name="1118"><span class="lineNum"> 1118 </span> :<span class="lineCov"> 20 : skiboot_cpu_stacks.len = (cpu_max_pir + 1) * STACK_SIZE;</span></a>
+<a name="1119"><span class="lineNum"> 1119 </span> : : </a>
+<a name="1120"><span class="lineNum"> 1120 </span> :<span class="lineCov"> 20 : lock(&amp;mem_region_lock);</span></a>
+<a name="1121"><span class="lineNum"> 1121 </span> : : </a>
+<a name="1122"><span class="lineNum"> 1122 </span> : : /* Now carve out our own reserved areas. */</a>
+<a name="1123"><span class="lineNum"> 1123 </span> :<span class="lineCov"> 20 : if (!add_region(&amp;skiboot_os_reserve) ||</span></a>
+<a name="1124"><span class="lineNum"> 1124 </span> :<span class="lineCov"> 20 : !add_region(&amp;skiboot_code_and_text) ||</span></a>
+<a name="1125"><span class="lineNum"> 1125 </span> :<span class="lineCov"> 20 : !add_region(&amp;skiboot_heap) ||</span></a>
+<a name="1126"><span class="lineNum"> 1126 </span> :<span class="lineCov"> 20 : !add_region(&amp;skiboot_after_heap) ||</span></a>
+<a name="1127"><span class="lineNum"> 1127 </span> :<span class="lineCov"> 20 : !add_region(&amp;skiboot_cpu_stacks)) {</span></a>
+<a name="1128"><span class="lineNum"> 1128 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Out of memory adding skiboot reserved areas\n&quot;);</span></a>
+<a name="1129"><span class="lineNum"> 1129 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="1130"><span class="lineNum"> 1130 </span> : : }</a>
+<a name="1131"><span class="lineNum"> 1131 </span> : : </a>
+<a name="1132"><span class="lineNum"> 1132 </span> :<span class="lineCov"> 20 : if (chip_quirk(QUIRK_MAMBO_CALLOUTS)) {</span></a>
+<a name="1133"><span class="lineNum"> 1133 </span> :<span class="lineNoCov"> 0 : if (!add_region(&amp;skiboot_mambo_kernel) ||</span></a>
+<a name="1134"><span class="lineNum"> 1134 </span> :<span class="lineNoCov"> 0 : !add_region(&amp;skiboot_mambo_initramfs)) {</span></a>
+<a name="1135"><span class="lineNum"> 1135 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Out of memory adding mambo payload\n&quot;);</span></a>
+<a name="1136"><span class="lineNum"> 1136 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="1137"><span class="lineNum"> 1137 </span> : : }</a>
+<a name="1138"><span class="lineNum"> 1138 </span> : : }</a>
+<a name="1139"><span class="lineNum"> 1139 </span> : : </a>
+<a name="1140"><span class="lineNum"> 1140 </span> : : /* Add reserved reanges from HDAT */</a>
+<a name="1141"><span class="lineNum"> 1141 </span> :<span class="lineCov"> 23 : list_for_each_safe(&amp;early_reserves, region, next, list) {</span></a>
+<a name="1142"><span class="lineNum"> 1142 </span> : : bool added;</a>
+<a name="1143"><span class="lineNum"> 1143 </span> : : </a>
+<a name="1144"><span class="lineNum"> 1144 </span> :<span class="lineCov"> 3 : list_del(&amp;region-&gt;list);</span></a>
+<a name="1145"><span class="lineNum"> 1145 </span> :<span class="lineCov"> 3 : added = add_region(region);</span></a>
+<a name="1146"><span class="lineNum"> 1146 </span> :<span class="lineCov"> 3 : assert(added);</span></a>
+<a name="1147"><span class="lineNum"> 1147 </span> : : }</a>
+<a name="1148"><span class="lineNum"> 1148 </span> : : </a>
+<a name="1149"><span class="lineNum"> 1149 </span> : : /* Add reserved ranges from the DT */</a>
+<a name="1150"><span class="lineNum"> 1150 </span> :<span class="lineCov"> 20 : rc = mem_region_parse_reserved_nodes(&quot;/reserved-memory&quot;);</span></a>
+<a name="1151"><span class="lineNum"> 1151 </span> :<span class="lineCov"> 20 : if (!rc)</span></a>
+<a name="1152"><span class="lineNum"> 1152 </span> :<span class="lineCov"> 20 : rc = mem_region_parse_reserved_nodes(</span></a>
+<a name="1153"><span class="lineNum"> 1153 </span> : : &quot;/ibm,hostboot/reserved-memory&quot;);</a>
+<a name="1154"><span class="lineNum"> 1154 </span> :<span class="lineCov"> 20 : if (!rc)</span></a>
+<a name="1155"><span class="lineNum"> 1155 </span> :<span class="lineCov"> 20 : mem_region_parse_reserved_properties();</span></a>
+<a name="1156"><span class="lineNum"> 1156 </span> : : </a>
+<a name="1157"><span class="lineNum"> 1157 </span> :<span class="lineCov"> 20 : mem_region_init_done = true;</span></a>
+<a name="1158"><span class="lineNum"> 1158 </span> :<span class="lineCov"> 20 : unlock(&amp;mem_region_lock);</span></a>
+<a name="1159"><span class="lineNum"> 1159 </span> :<span class="lineCov"> 20 : }</span></a>
+<a name="1160"><span class="lineNum"> 1160 </span> : : </a>
+<a name="1161"><span class="lineNum"> 1161 </span> :<span class="lineCov"> 16 : static uint64_t allocated_length(const struct mem_region *r)</span></a>
+<a name="1162"><span class="lineNum"> 1162 </span> : : {</a>
+<a name="1163"><span class="lineNum"> 1163 </span> :<span class="lineCov"> 16 : struct free_hdr *f, *last = NULL;</span></a>
+<a name="1164"><span class="lineNum"> 1164 </span> : : </a>
+<a name="1165"><span class="lineNum"> 1165 </span> : : /* No allocations at all? */</a>
+<a name="1166"><span class="lineNum"> 1166 </span> :<span class="lineCov"> 16 : if (r-&gt;free_list.n.next == NULL)</span></a>
+<a name="1167"><span class="lineNum"> 1167 </span> :<span class="lineCov"> 14 : return 0;</span></a>
+<a name="1168"><span class="lineNum"> 1168 </span> : : </a>
+<a name="1169"><span class="lineNum"> 1169 </span> : : /* Find last free block. */</a>
+<a name="1170"><span class="lineNum"> 1170 </span> :<span class="lineCov"> 6 : list_for_each(&amp;r-&gt;free_list, f, list)</span></a>
+<a name="1171"><span class="lineNum"> 1171 </span> :<span class="lineCov"> 4 : if (f &gt; last)</span></a>
+<a name="1172"><span class="lineNum"> 1172 </span> :<span class="lineCov"> 3 : last = f;</span></a>
+<a name="1173"><span class="lineNum"> 1173 </span> : : </a>
+<a name="1174"><span class="lineNum"> 1174 </span> : : /* No free blocks? */</a>
+<a name="1175"><span class="lineNum"> 1175 </span> :<span class="lineCov"> 2 : if (!last)</span></a>
+<a name="1176"><span class="lineNum"> 1176 </span> :<span class="lineNoCov"> 0 : return r-&gt;len;</span></a>
+<a name="1177"><span class="lineNum"> 1177 </span> : : </a>
+<a name="1178"><span class="lineNum"> 1178 </span> : : /* Last free block isn't at end? */</a>
+<a name="1179"><span class="lineNum"> 1179 </span> :<span class="lineCov"> 2 : if (next_hdr(r, &amp;last-&gt;hdr))</span></a>
+<a name="1180"><span class="lineNum"> 1180 </span> :<span class="lineNoCov"> 0 : return r-&gt;len;</span></a>
+<a name="1181"><span class="lineNum"> 1181 </span> :<span class="lineCov"> 2 : return (unsigned long)last - r-&gt;start;</span></a>
+<a name="1182"><span class="lineNum"> 1182 </span> : : }</a>
+<a name="1183"><span class="lineNum"> 1183 </span> : : </a>
+<a name="1184"><span class="lineNum"> 1184 </span> : : /* Separate out allocated sections into their own region. */</a>
+<a name="1185"><span class="lineNum"> 1185 </span> :<span class="lineCov"> 5 : void mem_region_release_unused(void)</span></a>
+<a name="1186"><span class="lineNum"> 1186 </span> : : {</a>
+<a name="1187"><span class="lineNum"> 1187 </span> : : struct mem_region *r;</a>
+<a name="1188"><span class="lineNum"> 1188 </span> : : </a>
+<a name="1189"><span class="lineNum"> 1189 </span> :<span class="lineCov"> 5 : lock(&amp;mem_region_lock);</span></a>
+<a name="1190"><span class="lineNum"> 1190 </span> :<span class="lineCov"> 5 : assert(!mem_regions_finalised);</span></a>
+<a name="1191"><span class="lineNum"> 1191 </span> : : </a>
+<a name="1192"><span class="lineNum"> 1192 </span> :<span class="lineCov"> 5 : prlog(PR_INFO, &quot;Releasing unused memory:\n&quot;);</span></a>
+<a name="1193"><span class="lineNum"> 1193 </span> :<span class="lineCov"> 53 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="1194"><span class="lineNum"> 1194 </span> : : uint64_t used_len;</a>
+<a name="1195"><span class="lineNum"> 1195 </span> : : </a>
+<a name="1196"><span class="lineNum"> 1196 </span> : : /* If it's not allocatable, ignore it. */</a>
+<a name="1197"><span class="lineNum"> 1197 </span> :<span class="lineCov"> 48 : if (!(r-&gt;type == REGION_SKIBOOT_HEAP ||</span></a>
+<a name="1198"><span class="lineNum"> 1198 </span> :<span class="lineCov"> 43 : r-&gt;type == REGION_MEMORY))</span></a>
+<a name="1199"><span class="lineNum"> 1199 </span> :<span class="lineCov"> 32 : continue;</span></a>
+<a name="1200"><span class="lineNum"> 1200 </span> : : </a>
+<a name="1201"><span class="lineNum"> 1201 </span> :<span class="lineCov"> 16 : used_len = allocated_length(r);</span></a>
+<a name="1202"><span class="lineNum"> 1202 </span> : : </a>
+<a name="1203"><span class="lineNum"> 1203 </span> :<span class="lineCov"> 16 : prlog(PR_INFO, &quot; %s: %llu/%llu used\n&quot;,</span></a>
+<a name="1204"><span class="lineNum"> 1204 </span> : : r-&gt;name, (long long)used_len, (long long)r-&gt;len);</a>
+<a name="1205"><span class="lineNum"> 1205 </span> : : </a>
+<a name="1206"><span class="lineNum"> 1206 </span> : : /* We keep the skiboot heap. */</a>
+<a name="1207"><span class="lineNum"> 1207 </span> :<span class="lineCov"> 16 : if (r == &amp;skiboot_heap)</span></a>
+<a name="1208"><span class="lineNum"> 1208 </span> :<span class="lineCov"> 5 : continue;</span></a>
+<a name="1209"><span class="lineNum"> 1209 </span> : : </a>
+<a name="1210"><span class="lineNum"> 1210 </span> : : /* Nothing used? Whole thing is for Linux. */</a>
+<a name="1211"><span class="lineNum"> 1211 </span> :<span class="lineCov"> 11 : if (used_len == 0)</span></a>
+<a name="1212"><span class="lineNum"> 1212 </span> :<span class="lineCov"> 10 : r-&gt;type = REGION_OS;</span></a>
+<a name="1213"><span class="lineNum"> 1213 </span> : : /* Partially used? Split region. */</a>
+<a name="1214"><span class="lineNum"> 1214 </span> :<span class="lineCov"> 1 : else if (used_len != r-&gt;len) {</span></a>
+<a name="1215"><span class="lineNum"> 1215 </span> : : struct mem_region *for_linux;</a>
+<a name="1216"><span class="lineNum"> 1216 </span> :<span class="lineCov"> 1 : struct free_hdr *last = region_start(r) + used_len;</span></a>
+<a name="1217"><span class="lineNum"> 1217 </span> : : </a>
+<a name="1218"><span class="lineNum"> 1218 </span> : : /* Remove the final free block. */</a>
+<a name="1219"><span class="lineNum"> 1219 </span> :<span class="lineCov"> 1 : list_del_from(&amp;r-&gt;free_list, &amp;last-&gt;list);</span></a>
+<a name="1220"><span class="lineNum"> 1220 </span> : : </a>
+<a name="1221"><span class="lineNum"> 1221 </span> :<span class="lineCov"> 1 : for_linux = split_region(r, r-&gt;start + used_len,</span></a>
+<a name="1222"><span class="lineNum"> 1222 </span> : : REGION_OS);</a>
+<a name="1223"><span class="lineNum"> 1223 </span> :<span class="lineCov"> 1 : if (!for_linux) {</span></a>
+<a name="1224"><span class="lineNum"> 1224 </span> :<span class="lineNoCov"> 0 : prerror(&quot;OOM splitting mem node %s for linux\n&quot;,</span></a>
+<a name="1225"><span class="lineNum"> 1225 </span> : : r-&gt;name);</a>
+<a name="1226"><span class="lineNum"> 1226 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="1227"><span class="lineNum"> 1227 </span> : : }</a>
+<a name="1228"><span class="lineNum"> 1228 </span> :<span class="lineCov"> 1 : list_add(&amp;regions, &amp;for_linux-&gt;list);</span></a>
+<a name="1229"><span class="lineNum"> 1229 </span> : : }</a>
+<a name="1230"><span class="lineNum"> 1230 </span> : : }</a>
+<a name="1231"><span class="lineNum"> 1231 </span> :<span class="lineCov"> 5 : unlock(&amp;mem_region_lock);</span></a>
+<a name="1232"><span class="lineNum"> 1232 </span> :<span class="lineCov"> 5 : }</span></a>
+<a name="1233"><span class="lineNum"> 1233 </span> : : </a>
+<a name="1234"><span class="lineNum"> 1234 </span> :<span class="lineNoCov"> 0 : static void mem_clear_range(uint64_t s, uint64_t e)</span></a>
+<a name="1235"><span class="lineNum"> 1235 </span> : : {</a>
+<a name="1236"><span class="lineNum"> 1236 </span> : : uint64_t res_start, res_end;</a>
+<a name="1237"><span class="lineNum"> 1237 </span> : : </a>
+<a name="1238"><span class="lineNum"> 1238 </span> : : /* Skip exception vectors */</a>
+<a name="1239"><span class="lineNum"> 1239 </span> :<span class="lineNoCov"> 0 : if (s &lt; EXCEPTION_VECTORS_END)</span></a>
+<a name="1240"><span class="lineNum"> 1240 </span> :<span class="lineNoCov"> 0 : s = EXCEPTION_VECTORS_END;</span></a>
+<a name="1241"><span class="lineNum"> 1241 </span> : : </a>
+<a name="1242"><span class="lineNum"> 1242 </span> : : /* Skip kernel preload area */</a>
+<a name="1243"><span class="lineNum"> 1243 </span> :<span class="lineNoCov"> 0 : res_start = (uint64_t)KERNEL_LOAD_BASE;</span></a>
+<a name="1244"><span class="lineNum"> 1244 </span> :<span class="lineNoCov"> 0 : res_end = res_start + KERNEL_LOAD_SIZE;</span></a>
+<a name="1245"><span class="lineNum"> 1245 </span> : : </a>
+<a name="1246"><span class="lineNum"> 1246 </span> :<span class="lineNoCov"> 0 : if (s &gt;= res_start &amp;&amp; s &lt; res_end)</span></a>
+<a name="1247"><span class="lineNum"> 1247 </span> :<span class="lineNoCov"> 0 : s = res_end;</span></a>
+<a name="1248"><span class="lineNum"> 1248 </span> :<span class="lineNoCov"> 0 : if (e &gt; res_start &amp;&amp; e &lt;= res_end)</span></a>
+<a name="1249"><span class="lineNum"> 1249 </span> :<span class="lineNoCov"> 0 : e = res_start;</span></a>
+<a name="1250"><span class="lineNum"> 1250 </span> :<span class="lineNoCov"> 0 : if (e &lt;= s)</span></a>
+<a name="1251"><span class="lineNum"> 1251 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1252"><span class="lineNum"> 1252 </span> :<span class="lineNoCov"> 0 : if (s &lt; res_start &amp;&amp; e &gt; res_end) {</span></a>
+<a name="1253"><span class="lineNum"> 1253 </span> :<span class="lineNoCov"> 0 : mem_clear_range(s, res_start);</span></a>
+<a name="1254"><span class="lineNum"> 1254 </span> :<span class="lineNoCov"> 0 : mem_clear_range(res_end, e);</span></a>
+<a name="1255"><span class="lineNum"> 1255 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1256"><span class="lineNum"> 1256 </span> : : }</a>
+<a name="1257"><span class="lineNum"> 1257 </span> : : </a>
+<a name="1258"><span class="lineNum"> 1258 </span> : : /* Skip initramfs preload area */</a>
+<a name="1259"><span class="lineNum"> 1259 </span> :<span class="lineNoCov"> 0 : res_start = (uint64_t)INITRAMFS_LOAD_BASE;</span></a>
+<a name="1260"><span class="lineNum"> 1260 </span> :<span class="lineNoCov"> 0 : res_end = res_start + INITRAMFS_LOAD_SIZE;</span></a>
+<a name="1261"><span class="lineNum"> 1261 </span> : : </a>
+<a name="1262"><span class="lineNum"> 1262 </span> :<span class="lineNoCov"> 0 : if (s &gt;= res_start &amp;&amp; s &lt; res_end)</span></a>
+<a name="1263"><span class="lineNum"> 1263 </span> :<span class="lineNoCov"> 0 : s = res_end;</span></a>
+<a name="1264"><span class="lineNum"> 1264 </span> :<span class="lineNoCov"> 0 : if (e &gt; res_start &amp;&amp; e &lt;= res_end)</span></a>
+<a name="1265"><span class="lineNum"> 1265 </span> :<span class="lineNoCov"> 0 : e = res_start;</span></a>
+<a name="1266"><span class="lineNum"> 1266 </span> :<span class="lineNoCov"> 0 : if (e &lt;= s)</span></a>
+<a name="1267"><span class="lineNum"> 1267 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1268"><span class="lineNum"> 1268 </span> :<span class="lineNoCov"> 0 : if (s &lt; res_start &amp;&amp; e &gt; res_end) {</span></a>
+<a name="1269"><span class="lineNum"> 1269 </span> :<span class="lineNoCov"> 0 : mem_clear_range(s, res_start);</span></a>
+<a name="1270"><span class="lineNum"> 1270 </span> :<span class="lineNoCov"> 0 : mem_clear_range(res_end, e);</span></a>
+<a name="1271"><span class="lineNum"> 1271 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1272"><span class="lineNum"> 1272 </span> : : }</a>
+<a name="1273"><span class="lineNum"> 1273 </span> : : </a>
+<a name="1274"><span class="lineNum"> 1274 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;Clearing region %llx-%llx\n&quot;,</span></a>
+<a name="1275"><span class="lineNum"> 1275 </span> : : (long long)s, (long long)e);</a>
+<a name="1276"><span class="lineNum"> 1276 </span> :<span class="lineNoCov"> 0 : memset((void *)s, 0, e - s);</span></a>
+<a name="1277"><span class="lineNum"> 1277 </span> : : }</a>
+<a name="1278"><span class="lineNum"> 1278 </span> : : </a>
+<a name="1279"><span class="lineNum"> 1279 </span> : : struct mem_region_clear_job_args {</a>
+<a name="1280"><span class="lineNum"> 1280 </span> : : char *job_name;</a>
+<a name="1281"><span class="lineNum"> 1281 </span> : : uint64_t s,e;</a>
+<a name="1282"><span class="lineNum"> 1282 </span> : : };</a>
+<a name="1283"><span class="lineNum"> 1283 </span> : : </a>
+<a name="1284"><span class="lineNum"> 1284 </span> :<span class="lineNoCov"> 0 : static void mem_region_clear_job(void *data)</span></a>
+<a name="1285"><span class="lineNum"> 1285 </span> : : {</a>
+<a name="1286"><span class="lineNum"> 1286 </span> :<span class="lineNoCov"> 0 : struct mem_region_clear_job_args *arg = (struct mem_region_clear_job_args*)data;</span></a>
+<a name="1287"><span class="lineNum"> 1287 </span> :<span class="lineNoCov"> 0 : mem_clear_range(arg-&gt;s, arg-&gt;e);</span></a>
+<a name="1288"><span class="lineNum"> 1288 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="1289"><span class="lineNum"> 1289 </span> : : </a>
+<a name="1290"><span class="lineNum"> 1290 </span> : : #define MEM_REGION_CLEAR_JOB_SIZE (16ULL*(1&lt;&lt;30))</a>
+<a name="1291"><span class="lineNum"> 1291 </span> : : </a>
+<a name="1292"><span class="lineNum"> 1292 </span> : : static struct cpu_job **mem_clear_jobs;</a>
+<a name="1293"><span class="lineNum"> 1293 </span> : : static struct mem_region_clear_job_args *mem_clear_job_args;</a>
+<a name="1294"><span class="lineNum"> 1294 </span> : : static int mem_clear_njobs = 0;</a>
+<a name="1295"><span class="lineNum"> 1295 </span> : : </a>
+<a name="1296"><span class="lineNum"> 1296 </span> :<span class="lineNoCov"> 0 : void start_mem_region_clear_unused(void)</span></a>
+<a name="1297"><span class="lineNum"> 1297 </span> : : {</a>
+<a name="1298"><span class="lineNum"> 1298 </span> : : struct mem_region *r;</a>
+<a name="1299"><span class="lineNum"> 1299 </span> : : uint64_t s,l;</a>
+<a name="1300"><span class="lineNum"> 1300 </span> :<span class="lineNoCov"> 0 : uint64_t total = 0;</span></a>
+<a name="1301"><span class="lineNum"> 1301 </span> : : uint32_t chip_id;</a>
+<a name="1302"><span class="lineNum"> 1302 </span> : : char *path;</a>
+<a name="1303"><span class="lineNum"> 1303 </span> : : int i;</a>
+<a name="1304"><span class="lineNum"> 1304 </span> : : struct cpu_job **jobs;</a>
+<a name="1305"><span class="lineNum"> 1305 </span> : : struct mem_region_clear_job_args *job_args;</a>
+<a name="1306"><span class="lineNum"> 1306 </span> : : </a>
+<a name="1307"><span class="lineNum"> 1307 </span> :<span class="lineNoCov"> 0 : lock(&amp;mem_region_lock);</span></a>
+<a name="1308"><span class="lineNum"> 1308 </span> :<span class="lineNoCov"> 0 : assert(mem_regions_finalised);</span></a>
+<a name="1309"><span class="lineNum"> 1309 </span> : : </a>
+<a name="1310"><span class="lineNum"> 1310 </span> :<span class="lineNoCov"> 0 : mem_clear_njobs = 0;</span></a>
+<a name="1311"><span class="lineNum"> 1311 </span> : : </a>
+<a name="1312"><span class="lineNum"> 1312 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="1313"><span class="lineNum"> 1313 </span> :<span class="lineNoCov"> 0 : if (!(r-&gt;type == REGION_OS))</span></a>
+<a name="1314"><span class="lineNum"> 1314 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1315"><span class="lineNum"> 1315 </span> :<span class="lineNoCov"> 0 : mem_clear_njobs++;</span></a>
+<a name="1316"><span class="lineNum"> 1316 </span> : : /* One job per 16GB */</a>
+<a name="1317"><span class="lineNum"> 1317 </span> :<span class="lineNoCov"> 0 : mem_clear_njobs += r-&gt;len / MEM_REGION_CLEAR_JOB_SIZE;</span></a>
+<a name="1318"><span class="lineNum"> 1318 </span> : : }</a>
+<a name="1319"><span class="lineNum"> 1319 </span> : : </a>
+<a name="1320"><span class="lineNum"> 1320 </span> :<span class="lineNoCov"> 0 : jobs = malloc(mem_clear_njobs * sizeof(struct cpu_job*));</span></a>
+<a name="1321"><span class="lineNum"> 1321 </span> :<span class="lineNoCov"> 0 : job_args = malloc(mem_clear_njobs * sizeof(struct mem_region_clear_job_args));</span></a>
+<a name="1322"><span class="lineNum"> 1322 </span> :<span class="lineNoCov"> 0 : mem_clear_jobs = jobs;</span></a>
+<a name="1323"><span class="lineNum"> 1323 </span> :<span class="lineNoCov"> 0 : mem_clear_job_args = job_args;</span></a>
+<a name="1324"><span class="lineNum"> 1324 </span> : : </a>
+<a name="1325"><span class="lineNum"> 1325 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;Clearing unused memory:\n&quot;);</span></a>
+<a name="1326"><span class="lineNum"> 1326 </span> :<span class="lineNoCov"> 0 : i = 0;</span></a>
+<a name="1327"><span class="lineNum"> 1327 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="1328"><span class="lineNum"> 1328 </span> : : /* If it's not unused, ignore it. */</a>
+<a name="1329"><span class="lineNum"> 1329 </span> :<span class="lineNoCov"> 0 : if (!(r-&gt;type == REGION_OS))</span></a>
+<a name="1330"><span class="lineNum"> 1330 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1331"><span class="lineNum"> 1331 </span> : : </a>
+<a name="1332"><span class="lineNum"> 1332 </span> :<span class="lineNoCov"> 0 : assert(r != &amp;skiboot_heap);</span></a>
+<a name="1333"><span class="lineNum"> 1333 </span> : : </a>
+<a name="1334"><span class="lineNum"> 1334 </span> :<span class="lineNoCov"> 0 : s = r-&gt;start;</span></a>
+<a name="1335"><span class="lineNum"> 1335 </span> :<span class="lineNoCov"> 0 : l = r-&gt;len;</span></a>
+<a name="1336"><span class="lineNum"> 1336 </span> :<span class="lineNoCov"> 0 : while(l &gt; MEM_REGION_CLEAR_JOB_SIZE) {</span></a>
+<a name="1337"><span class="lineNum"> 1337 </span> :<span class="lineNoCov"> 0 : job_args[i].s = s+l - MEM_REGION_CLEAR_JOB_SIZE;</span></a>
+<a name="1338"><span class="lineNum"> 1338 </span> :<span class="lineNoCov"> 0 : job_args[i].e = s+l;</span></a>
+<a name="1339"><span class="lineNum"> 1339 </span> :<span class="lineNoCov"> 0 : l-=MEM_REGION_CLEAR_JOB_SIZE;</span></a>
+<a name="1340"><span class="lineNum"> 1340 </span> :<span class="lineNoCov"> 0 : job_args[i].job_name = malloc(sizeof(char)*100);</span></a>
+<a name="1341"><span class="lineNum"> 1341 </span> :<span class="lineNoCov"> 0 : total+=MEM_REGION_CLEAR_JOB_SIZE;</span></a>
+<a name="1342"><span class="lineNum"> 1342 </span> :<span class="lineNoCov"> 0 : chip_id = __dt_get_chip_id(r-&gt;node);</span></a>
+<a name="1343"><span class="lineNum"> 1343 </span> :<span class="lineNoCov"> 0 : if (chip_id == -1)</span></a>
+<a name="1344"><span class="lineNum"> 1344 </span> :<span class="lineNoCov"> 0 : chip_id = 0;</span></a>
+<a name="1345"><span class="lineNum"> 1345 </span> :<span class="lineNoCov"> 0 : path = dt_get_path(r-&gt;node);</span></a>
+<a name="1346"><span class="lineNum"> 1346 </span> :<span class="lineNoCov"> 0 : snprintf(job_args[i].job_name, 100,</span></a>
+<a name="1347"><span class="lineNum"> 1347 </span> : : &quot;clear %s, %s 0x%&quot;PRIx64&quot; len: %&quot;PRIx64&quot; on %d&quot;,</a>
+<a name="1348"><span class="lineNum"> 1348 </span> : : r-&gt;name, path,</a>
+<a name="1349"><span class="lineNum"> 1349 </span> :<span class="lineNoCov"> 0 : job_args[i].s,</span></a>
+<a name="1350"><span class="lineNum"> 1350 </span> :<span class="lineNoCov"> 0 : (job_args[i].e - job_args[i].s),</span></a>
+<a name="1351"><span class="lineNum"> 1351 </span> : : chip_id);</a>
+<a name="1352"><span class="lineNum"> 1352 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="1353"><span class="lineNum"> 1353 </span> :<span class="lineNoCov"> 0 : jobs[i] = cpu_queue_job_on_node(chip_id,</span></a>
+<a name="1354"><span class="lineNum"> 1354 </span> :<span class="lineNoCov"> 0 : job_args[i].job_name,</span></a>
+<a name="1355"><span class="lineNum"> 1355 </span> : : mem_region_clear_job,</a>
+<a name="1356"><span class="lineNum"> 1356 </span> :<span class="lineNoCov"> 0 : &amp;job_args[i]);</span></a>
+<a name="1357"><span class="lineNum"> 1357 </span> :<span class="lineNoCov"> 0 : if (!jobs[i])</span></a>
+<a name="1358"><span class="lineNum"> 1358 </span> :<span class="lineNoCov"> 0 : jobs[i] = cpu_queue_job(NULL,</span></a>
+<a name="1359"><span class="lineNum"> 1359 </span> :<span class="lineNoCov"> 0 : job_args[i].job_name,</span></a>
+<a name="1360"><span class="lineNum"> 1360 </span> : : mem_region_clear_job,</a>
+<a name="1361"><span class="lineNum"> 1361 </span> :<span class="lineNoCov"> 0 : &amp;job_args[i]);</span></a>
+<a name="1362"><span class="lineNum"> 1362 </span> :<span class="lineNoCov"> 0 : assert(jobs[i]);</span></a>
+<a name="1363"><span class="lineNum"> 1363 </span> :<span class="lineNoCov"> 0 : i++;</span></a>
+<a name="1364"><span class="lineNum"> 1364 </span> : : }</a>
+<a name="1365"><span class="lineNum"> 1365 </span> :<span class="lineNoCov"> 0 : job_args[i].s = s;</span></a>
+<a name="1366"><span class="lineNum"> 1366 </span> :<span class="lineNoCov"> 0 : job_args[i].e = s+l;</span></a>
+<a name="1367"><span class="lineNum"> 1367 </span> :<span class="lineNoCov"> 0 : job_args[i].job_name = malloc(sizeof(char)*100);</span></a>
+<a name="1368"><span class="lineNum"> 1368 </span> :<span class="lineNoCov"> 0 : total+=l;</span></a>
+<a name="1369"><span class="lineNum"> 1369 </span> :<span class="lineNoCov"> 0 : chip_id = __dt_get_chip_id(r-&gt;node);</span></a>
+<a name="1370"><span class="lineNum"> 1370 </span> :<span class="lineNoCov"> 0 : if (chip_id == -1)</span></a>
+<a name="1371"><span class="lineNum"> 1371 </span> :<span class="lineNoCov"> 0 : chip_id = 0;</span></a>
+<a name="1372"><span class="lineNum"> 1372 </span> :<span class="lineNoCov"> 0 : path = dt_get_path(r-&gt;node);</span></a>
+<a name="1373"><span class="lineNum"> 1373 </span> :<span class="lineNoCov"> 0 : snprintf(job_args[i].job_name,100,</span></a>
+<a name="1374"><span class="lineNum"> 1374 </span> : : &quot;clear %s, %s 0x%&quot;PRIx64&quot; len: 0x%&quot;PRIx64&quot; on %d&quot;,</a>
+<a name="1375"><span class="lineNum"> 1375 </span> : : r-&gt;name, path,</a>
+<a name="1376"><span class="lineNum"> 1376 </span> :<span class="lineNoCov"> 0 : job_args[i].s,</span></a>
+<a name="1377"><span class="lineNum"> 1377 </span> :<span class="lineNoCov"> 0 : (job_args[i].e - job_args[i].s),</span></a>
+<a name="1378"><span class="lineNum"> 1378 </span> : : chip_id);</a>
+<a name="1379"><span class="lineNum"> 1379 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="1380"><span class="lineNum"> 1380 </span> :<span class="lineNoCov"> 0 : jobs[i] = cpu_queue_job_on_node(chip_id,</span></a>
+<a name="1381"><span class="lineNum"> 1381 </span> :<span class="lineNoCov"> 0 : job_args[i].job_name,</span></a>
+<a name="1382"><span class="lineNum"> 1382 </span> : : mem_region_clear_job,</a>
+<a name="1383"><span class="lineNum"> 1383 </span> :<span class="lineNoCov"> 0 : &amp;job_args[i]);</span></a>
+<a name="1384"><span class="lineNum"> 1384 </span> :<span class="lineNoCov"> 0 : if (!jobs[i])</span></a>
+<a name="1385"><span class="lineNum"> 1385 </span> :<span class="lineNoCov"> 0 : jobs[i] = cpu_queue_job(NULL,</span></a>
+<a name="1386"><span class="lineNum"> 1386 </span> :<span class="lineNoCov"> 0 : job_args[i].job_name,</span></a>
+<a name="1387"><span class="lineNum"> 1387 </span> : : mem_region_clear_job,</a>
+<a name="1388"><span class="lineNum"> 1388 </span> :<span class="lineNoCov"> 0 : &amp;job_args[i]);</span></a>
+<a name="1389"><span class="lineNum"> 1389 </span> :<span class="lineNoCov"> 0 : assert(jobs[i]);</span></a>
+<a name="1390"><span class="lineNum"> 1390 </span> :<span class="lineNoCov"> 0 : i++;</span></a>
+<a name="1391"><span class="lineNum"> 1391 </span> : : }</a>
+<a name="1392"><span class="lineNum"> 1392 </span> :<span class="lineNoCov"> 0 : unlock(&amp;mem_region_lock);</span></a>
+<a name="1393"><span class="lineNum"> 1393 </span> :<span class="lineNoCov"> 0 : cpu_process_local_jobs();</span></a>
+<a name="1394"><span class="lineNum"> 1394 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="1395"><span class="lineNum"> 1395 </span> : : </a>
+<a name="1396"><span class="lineNum"> 1396 </span> :<span class="lineNoCov"> 0 : void wait_mem_region_clear_unused(void)</span></a>
+<a name="1397"><span class="lineNum"> 1397 </span> : : {</a>
+<a name="1398"><span class="lineNum"> 1398 </span> : : uint64_t l;</a>
+<a name="1399"><span class="lineNum"> 1399 </span> :<span class="lineNoCov"> 0 : uint64_t total = 0;</span></a>
+<a name="1400"><span class="lineNum"> 1400 </span> : : int i;</a>
+<a name="1401"><span class="lineNum"> 1401 </span> : : </a>
+<a name="1402"><span class="lineNum"> 1402 </span> :<span class="lineNoCov"> 0 : for(i=0; i &lt; mem_clear_njobs; i++) {</span></a>
+<a name="1403"><span class="lineNum"> 1403 </span> :<span class="lineNoCov"> 0 : total += (mem_clear_job_args[i].e - mem_clear_job_args[i].s);</span></a>
+<a name="1404"><span class="lineNum"> 1404 </span> : : }</a>
+<a name="1405"><span class="lineNum"> 1405 </span> : : </a>
+<a name="1406"><span class="lineNum"> 1406 </span> :<span class="lineNoCov"> 0 : l = 0;</span></a>
+<a name="1407"><span class="lineNum"> 1407 </span> :<span class="lineNoCov"> 0 : for(i=0; i &lt; mem_clear_njobs; i++) {</span></a>
+<a name="1408"><span class="lineNum"> 1408 </span> :<span class="lineNoCov"> 0 : cpu_wait_job(mem_clear_jobs[i], true);</span></a>
+<a name="1409"><span class="lineNum"> 1409 </span> :<span class="lineNoCov"> 0 : l += (mem_clear_job_args[i].e - mem_clear_job_args[i].s);</span></a>
+<a name="1410"><span class="lineNum"> 1410 </span> :<span class="lineNoCov"> 0 : printf(&quot;Clearing memory... %&quot;PRIu64&quot;/%&quot;PRIu64&quot;GB done\n&quot;,</span></a>
+<a name="1411"><span class="lineNum"> 1411 </span> : : l&gt;&gt;30, total&gt;&gt;30);</a>
+<a name="1412"><span class="lineNum"> 1412 </span> :<span class="lineNoCov"> 0 : free(mem_clear_job_args[i].job_name);</span></a>
+<a name="1413"><span class="lineNum"> 1413 </span> : : }</a>
+<a name="1414"><span class="lineNum"> 1414 </span> :<span class="lineNoCov"> 0 : free(mem_clear_jobs);</span></a>
+<a name="1415"><span class="lineNum"> 1415 </span> :<span class="lineNoCov"> 0 : free(mem_clear_job_args);</span></a>
+<a name="1416"><span class="lineNum"> 1416 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="1417"><span class="lineNum"> 1417 </span> : : </a>
+<a name="1418"><span class="lineNum"> 1418 </span> :<span class="lineCov"> 8 : static void mem_region_add_dt_reserved_node(struct dt_node *parent,</span></a>
+<a name="1419"><span class="lineNum"> 1419 </span> : : struct mem_region *region)</a>
+<a name="1420"><span class="lineNum"> 1420 </span> : : {</a>
+<a name="1421"><span class="lineNum"> 1421 </span> : : char *name, *p;</a>
+<a name="1422"><span class="lineNum"> 1422 </span> : : </a>
+<a name="1423"><span class="lineNum"> 1423 </span> : : /* If a reserved region was established before skiboot, it may be</a>
+<a name="1424"><span class="lineNum"> 1424 </span> : : * referenced by a device-tree node with extra data. In that case,</a>
+<a name="1425"><span class="lineNum"> 1425 </span> : : * copy the node to /reserved-memory/, unless it's already there.</a>
+<a name="1426"><span class="lineNum"> 1426 </span> : : *</a>
+<a name="1427"><span class="lineNum"> 1427 </span> : : * We update region-&gt;node to the new copy here, as the prd code may</a>
+<a name="1428"><span class="lineNum"> 1428 </span> : : * update regions' device-tree nodes, and we want those updates to</a>
+<a name="1429"><span class="lineNum"> 1429 </span> : : * apply to the nodes in /reserved-memory/.</a>
+<a name="1430"><span class="lineNum"> 1430 </span> : : */</a>
+<a name="1431"><span class="lineNum"> 1431 </span> :<span class="lineCov"> 8 : if (region-&gt;type == REGION_FW_RESERVED &amp;&amp; region-&gt;node) {</span></a>
+<a name="1432"><span class="lineNum"> 1432 </span> :<span class="lineNoCov"> 0 : if (region-&gt;node-&gt;parent != parent)</span></a>
+<a name="1433"><span class="lineNum"> 1433 </span> :<span class="lineNoCov"> 0 : region-&gt;node = dt_copy(region-&gt;node, parent);</span></a>
+<a name="1434"><span class="lineNum"> 1434 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1435"><span class="lineNum"> 1435 </span> : : }</a>
+<a name="1436"><span class="lineNum"> 1436 </span> : : </a>
+<a name="1437"><span class="lineNum"> 1437 </span> :<span class="lineCov"> 8 : name = strdup(region-&gt;name);</span></a>
+<a name="1438"><span class="lineNum"> 1438 </span> :<span class="lineCov"> 8 : assert(name);</span></a>
+<a name="1439"><span class="lineNum"> 1439 </span> : : </a>
+<a name="1440"><span class="lineNum"> 1440 </span> : : /* remove any cell addresses in the region name; we have our own cell</a>
+<a name="1441"><span class="lineNum"> 1441 </span> : : * addresses here */</a>
+<a name="1442"><span class="lineNum"> 1442 </span> :<span class="lineCov"> 8 : p = strchr(name, '@');</span></a>
+<a name="1443"><span class="lineNum"> 1443 </span> :<span class="lineCov"> 8 : if (p)</span></a>
+<a name="1444"><span class="lineNum"> 1444 </span> :<span class="lineNoCov"> 0 : *p = '\0';</span></a>
+<a name="1445"><span class="lineNum"> 1445 </span> : : </a>
+<a name="1446"><span class="lineNum"> 1446 </span> :<span class="lineCov"> 8 : region-&gt;node = dt_new_addr(parent, name, region-&gt;start);</span></a>
+<a name="1447"><span class="lineNum"> 1447 </span> :<span class="lineCov"> 8 : assert(region-&gt;node);</span></a>
+<a name="1448"><span class="lineNum"> 1448 </span> :<span class="lineCov"> 8 : dt_add_property_u64s(region-&gt;node, &quot;reg&quot;, region-&gt;start, region-&gt;len);</span></a>
+<a name="1449"><span class="lineNum"> 1449 </span> : : </a>
+<a name="1450"><span class="lineNum"> 1450 </span> : : /*</a>
+<a name="1451"><span class="lineNum"> 1451 </span> : : * This memory is used by hardware and may need special handling. Ask</a>
+<a name="1452"><span class="lineNum"> 1452 </span> : : * the host kernel not to map it by default.</a>
+<a name="1453"><span class="lineNum"> 1453 </span> : : */</a>
+<a name="1454"><span class="lineNum"> 1454 </span> :<span class="lineCov"> 8 : if (region-&gt;type == REGION_RESERVED)</span></a>
+<a name="1455"><span class="lineNum"> 1455 </span> :<span class="lineNoCov"> 0 : dt_add_property(region-&gt;node, &quot;no-map&quot;, NULL, 0);</span></a>
+<a name="1456"><span class="lineNum"> 1456 </span> : : </a>
+<a name="1457"><span class="lineNum"> 1457 </span> :<span class="lineCov"> 8 : free(name);</span></a>
+<a name="1458"><span class="lineNum"> 1458 </span> : : }</a>
+<a name="1459"><span class="lineNum"> 1459 </span> : : </a>
+<a name="1460"><span class="lineNum"> 1460 </span> :<span class="lineCov"> 1 : void mem_region_add_dt_reserved(void)</span></a>
+<a name="1461"><span class="lineNum"> 1461 </span> : : {</a>
+<a name="1462"><span class="lineNum"> 1462 </span> : : int names_len, ranges_len, len;</a>
+<a name="1463"><span class="lineNum"> 1463 </span> : : const struct dt_property *prop;</a>
+<a name="1464"><span class="lineNum"> 1464 </span> : : struct mem_region *region;</a>
+<a name="1465"><span class="lineNum"> 1465 </span> : : void *names, *ranges;</a>
+<a name="1466"><span class="lineNum"> 1466 </span> : : struct dt_node *node;</a>
+<a name="1467"><span class="lineNum"> 1467 </span> : : fdt64_t *range;</a>
+<a name="1468"><span class="lineNum"> 1468 </span> : : char *name;</a>
+<a name="1469"><span class="lineNum"> 1469 </span> : : </a>
+<a name="1470"><span class="lineNum"> 1470 </span> :<span class="lineCov"> 1 : names_len = 0;</span></a>
+<a name="1471"><span class="lineNum"> 1471 </span> :<span class="lineCov"> 1 : ranges_len = 0;</span></a>
+<a name="1472"><span class="lineNum"> 1472 </span> : : </a>
+<a name="1473"><span class="lineNum"> 1473 </span> : : /* Finalise the region list, so we know that the regions list won't be</a>
+<a name="1474"><span class="lineNum"> 1474 </span> : : * altered after this point. The regions' free lists may change after</a>
+<a name="1475"><span class="lineNum"> 1475 </span> : : * we drop the lock, but we don't access those. */</a>
+<a name="1476"><span class="lineNum"> 1476 </span> :<span class="lineCov"> 1 : lock(&amp;mem_region_lock);</span></a>
+<a name="1477"><span class="lineNum"> 1477 </span> :<span class="lineCov"> 1 : mem_regions_finalised = true;</span></a>
+<a name="1478"><span class="lineNum"> 1478 </span> : : </a>
+<a name="1479"><span class="lineNum"> 1479 </span> : : /* establish top-level reservation node */</a>
+<a name="1480"><span class="lineNum"> 1480 </span> :<span class="lineCov"> 1 : node = dt_find_by_path(dt_root, &quot;reserved-memory&quot;);</span></a>
+<a name="1481"><span class="lineNum"> 1481 </span> :<span class="lineCov"> 1 : if (!node) {</span></a>
+<a name="1482"><span class="lineNum"> 1482 </span> :<span class="lineCov"> 1 : node = dt_new(dt_root, &quot;reserved-memory&quot;);</span></a>
+<a name="1483"><span class="lineNum"> 1483 </span> :<span class="lineCov"> 1 : dt_add_property_cells(node, &quot;#address-cells&quot;, 2);</span></a>
+<a name="1484"><span class="lineNum"> 1484 </span> :<span class="lineCov"> 1 : dt_add_property_cells(node, &quot;#size-cells&quot;, 2);</span></a>
+<a name="1485"><span class="lineNum"> 1485 </span> :<span class="lineCov"> 1 : dt_add_property(node, &quot;ranges&quot;, NULL, 0);</span></a>
+<a name="1486"><span class="lineNum"> 1486 </span> : : }</a>
+<a name="1487"><span class="lineNum"> 1487 </span> : : </a>
+<a name="1488"><span class="lineNum"> 1488 </span> :<span class="lineCov"> 1 : prlog(PR_INFO, &quot;Reserved regions:\n&quot;);</span></a>
+<a name="1489"><span class="lineNum"> 1489 </span> : : </a>
+<a name="1490"><span class="lineNum"> 1490 </span> : : /* First pass, create /reserved-memory/ nodes for each reservation,</a>
+<a name="1491"><span class="lineNum"> 1491 </span> : : * and calculate the length for the /reserved-names and</a>
+<a name="1492"><span class="lineNum"> 1492 </span> : : * /reserved-ranges properties */</a>
+<a name="1493"><span class="lineNum"> 1493 </span> :<span class="lineCov"> 13 : list_for_each(&amp;regions, region, list) {</span></a>
+<a name="1494"><span class="lineNum"> 1494 </span> :<span class="lineCov"> 12 : if (!region_is_reservable(region))</span></a>
+<a name="1495"><span class="lineNum"> 1495 </span> :<span class="lineCov"> 4 : continue;</span></a>
+<a name="1496"><span class="lineNum"> 1496 </span> : : </a>
+<a name="1497"><span class="lineNum"> 1497 </span> :<span class="lineCov"> 8 : prlog(PR_INFO, &quot; 0x%012llx..%012llx : %s\n&quot;,</span></a>
+<a name="1498"><span class="lineNum"> 1498 </span> : : (long long)region-&gt;start,</a>
+<a name="1499"><span class="lineNum"> 1499 </span> : : (long long)(region-&gt;start + region-&gt;len - 1),</a>
+<a name="1500"><span class="lineNum"> 1500 </span> : : region-&gt;name);</a>
+<a name="1501"><span class="lineNum"> 1501 </span> : : </a>
+<a name="1502"><span class="lineNum"> 1502 </span> :<span class="lineCov"> 8 : mem_region_add_dt_reserved_node(node, region);</span></a>
+<a name="1503"><span class="lineNum"> 1503 </span> : : </a>
+<a name="1504"><span class="lineNum"> 1504 </span> : : /* calculate the size of the properties populated later */</a>
+<a name="1505"><span class="lineNum"> 1505 </span> :<span class="lineCov"> 8 : names_len += strlen(region-&gt;node-&gt;name) + 1;</span></a>
+<a name="1506"><span class="lineNum"> 1506 </span> :<span class="lineCov"> 8 : ranges_len += 2 * sizeof(uint64_t);</span></a>
+<a name="1507"><span class="lineNum"> 1507 </span> : : }</a>
+<a name="1508"><span class="lineNum"> 1508 </span> : : </a>
+<a name="1509"><span class="lineNum"> 1509 </span> :<span class="lineCov"> 1 : name = names = malloc(names_len);</span></a>
+<a name="1510"><span class="lineNum"> 1510 </span> :<span class="lineCov"> 1 : range = ranges = malloc(ranges_len);</span></a>
+<a name="1511"><span class="lineNum"> 1511 </span> : : </a>
+<a name="1512"><span class="lineNum"> 1512 </span> : : /* Second pass: populate the old-style reserved-names and</a>
+<a name="1513"><span class="lineNum"> 1513 </span> : : * reserved-regions arrays based on the node data */</a>
+<a name="1514"><span class="lineNum"> 1514 </span> :<span class="lineCov"> 13 : list_for_each(&amp;regions, region, list) {</span></a>
+<a name="1515"><span class="lineNum"> 1515 </span> :<span class="lineCov"> 12 : if (!region_is_reservable(region))</span></a>
+<a name="1516"><span class="lineNum"> 1516 </span> :<span class="lineCov"> 4 : continue;</span></a>
+<a name="1517"><span class="lineNum"> 1517 </span> : : </a>
+<a name="1518"><span class="lineNum"> 1518 </span> :<span class="lineCov"> 8 : len = strlen(region-&gt;node-&gt;name) + 1;</span></a>
+<a name="1519"><span class="lineNum"> 1519 </span> :<span class="lineCov"> 8 : memcpy(name, region-&gt;node-&gt;name, len);</span></a>
+<a name="1520"><span class="lineNum"> 1520 </span> :<span class="lineCov"> 8 : name += len;</span></a>
+<a name="1521"><span class="lineNum"> 1521 </span> : : </a>
+<a name="1522"><span class="lineNum"> 1522 </span> :<span class="lineCov"> 8 : range[0] = cpu_to_fdt64(region-&gt;start);</span></a>
+<a name="1523"><span class="lineNum"> 1523 </span> :<span class="lineCov"> 8 : range[1] = cpu_to_fdt64(region-&gt;len);</span></a>
+<a name="1524"><span class="lineNum"> 1524 </span> :<span class="lineCov"> 8 : range += 2;</span></a>
+<a name="1525"><span class="lineNum"> 1525 </span> : : }</a>
+<a name="1526"><span class="lineNum"> 1526 </span> :<span class="lineCov"> 1 : unlock(&amp;mem_region_lock);</span></a>
+<a name="1527"><span class="lineNum"> 1527 </span> : : </a>
+<a name="1528"><span class="lineNum"> 1528 </span> :<span class="lineCov"> 1 : prop = dt_find_property(dt_root, &quot;reserved-names&quot;);</span></a>
+<a name="1529"><span class="lineNum"> 1529 </span> :<span class="lineCov"> 1 : if (prop)</span></a>
+<a name="1530"><span class="lineNum"> 1530 </span> :<span class="lineNoCov"> 0 : dt_del_property(dt_root, (struct dt_property *)prop);</span></a>
+<a name="1531"><span class="lineNum"> 1531 </span> : : </a>
+<a name="1532"><span class="lineNum"> 1532 </span> :<span class="lineCov"> 1 : prop = dt_find_property(dt_root, &quot;reserved-ranges&quot;);</span></a>
+<a name="1533"><span class="lineNum"> 1533 </span> :<span class="lineCov"> 1 : if (prop)</span></a>
+<a name="1534"><span class="lineNum"> 1534 </span> :<span class="lineNoCov"> 0 : dt_del_property(dt_root, (struct dt_property *)prop);</span></a>
+<a name="1535"><span class="lineNum"> 1535 </span> : : </a>
+<a name="1536"><span class="lineNum"> 1536 </span> :<span class="lineCov"> 1 : dt_add_property(dt_root, &quot;reserved-names&quot;, names, names_len);</span></a>
+<a name="1537"><span class="lineNum"> 1537 </span> :<span class="lineCov"> 1 : dt_add_property(dt_root, &quot;reserved-ranges&quot;, ranges, ranges_len);</span></a>
+<a name="1538"><span class="lineNum"> 1538 </span> : : </a>
+<a name="1539"><span class="lineNum"> 1539 </span> :<span class="lineCov"> 1 : free(names);</span></a>
+<a name="1540"><span class="lineNum"> 1540 </span> :<span class="lineCov"> 1 : free(ranges);</span></a>
+<a name="1541"><span class="lineNum"> 1541 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1542"><span class="lineNum"> 1542 </span> : : </a>
+<a name="1543"><span class="lineNum"> 1543 </span> :<span class="lineCov"> 4 : struct mem_region *mem_region_next(struct mem_region *region)</span></a>
+<a name="1544"><span class="lineNum"> 1544 </span> : : {</a>
+<a name="1545"><span class="lineNum"> 1545 </span> : : struct list_node *node;</a>
+<a name="1546"><span class="lineNum"> 1546 </span> : : </a>
+<a name="1547"><span class="lineNum"> 1547 </span> :<span class="lineCov"> 4 : assert(lock_held_by_me(&amp;mem_region_lock));</span></a>
+<a name="1548"><span class="lineNum"> 1548 </span> : : </a>
+<a name="1549"><span class="lineNum"> 1549 </span> :<span class="lineCov"> 4 : node = region ? &amp;region-&gt;list : &amp;regions.n;</span></a>
+<a name="1550"><span class="lineNum"> 1550 </span> : : </a>
+<a name="1551"><span class="lineNum"> 1551 </span> :<span class="lineCov"> 4 : if (node-&gt;next == &amp;regions.n)</span></a>
+<a name="1552"><span class="lineNum"> 1552 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
+<a name="1553"><span class="lineNum"> 1553 </span> : : </a>
+<a name="1554"><span class="lineNum"> 1554 </span> :<span class="lineCov"> 2 : return list_entry(node-&gt;next, struct mem_region, list);</span></a>
+<a name="1555"><span class="lineNum"> 1555 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/nvram-format.c.func-sort-c.html b/coverage-report/core/nvram-format.c.func-sort-c.html
new file mode 100644
index 0000000..a5ea216
--- /dev/null
+++ b/coverage-report/core/nvram-format.c.func-sort-c.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/nvram-format.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - nvram-format.c<span style="font-size: 80%;"> (<a href="nvram-format.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">113</td>
+ <td class="headerCovTableEntry">147</td>
+ <td class="headerCovTableEntryMed">76.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">54.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="nvram-format.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#309">__nvram_query_eq</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#194">nvram_dangerous</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#293">nvram_query_dangerous</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#325">nvram_query_eq_dangerous</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#320">nvram_query_eq_safe</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#218">__nvram_query</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#288">nvram_query_safe</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#174">find_next_key</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#106">nvram_check</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#50">nvram_format</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#32">chrp_nv_cksum</a></td>
+ <td class="coverFnHi">82</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/nvram-format.c.func.html b/coverage-report/core/nvram-format.c.func.html
new file mode 100644
index 0000000..8eb7cef
--- /dev/null
+++ b/coverage-report/core/nvram-format.c.func.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/nvram-format.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - nvram-format.c<span style="font-size: 80%;"> (<a href="nvram-format.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">113</td>
+ <td class="headerCovTableEntry">147</td>
+ <td class="headerCovTableEntryMed">76.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">54.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="nvram-format.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#218">__nvram_query</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#309">__nvram_query_eq</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#32">chrp_nv_cksum</a></td>
+ <td class="coverFnHi">82</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#174">find_next_key</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#106">nvram_check</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#194">nvram_dangerous</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#50">nvram_format</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#293">nvram_query_dangerous</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#325">nvram_query_eq_dangerous</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#320">nvram_query_eq_safe</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="nvram-format.c.gcov.html#288">nvram_query_safe</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/nvram-format.c.gcov.html b/coverage-report/core/nvram-format.c.gcov.html
new file mode 100644
index 0000000..4f21fd6
--- /dev/null
+++ b/coverage-report/core/nvram-format.c.gcov.html
@@ -0,0 +1,416 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/nvram-format.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - nvram-format.c<span style="font-size: 80%;"> (source / <a href="nvram-format.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">113</td>
+ <td class="headerCovTableEntry">147</td>
+ <td class="headerCovTableEntryMed">76.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">54.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * NVRAM Format as specified in PAPR</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;nvram.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : struct chrp_nvram_hdr {</a>
+<a name="12"><span class="lineNum"> 12 </span> : : uint8_t sig;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : uint8_t cksum;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : be16 len;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : char name[12];</a>
+<a name="16"><span class="lineNum"> 16 </span> : : };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : static struct chrp_nvram_hdr *skiboot_part_hdr;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define NVRAM_SIG_FW_PRIV 0x51</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define NVRAM_SIG_SYSTEM 0x70</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define NVRAM_SIG_FREE 0x7f</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define NVRAM_NAME_COMMON &quot;common&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #define NVRAM_NAME_FW_PRIV &quot;ibm,skiboot&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #define NVRAM_NAME_FREE &quot;wwwwwwwwwwww&quot;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : /* 64k should be enough, famous last words... */</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #define NVRAM_SIZE_COMMON 0x10000</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* 4k should be enough, famous last words... */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #define NVRAM_SIZE_FW_PRIV 0x1000</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 82 : static uint8_t chrp_nv_cksum(struct chrp_nvram_hdr *hdr)</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : {</a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 82 : struct chrp_nvram_hdr h_copy = *hdr;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : uint8_t b_data, i_sum, c_sum;</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 82 : uint8_t *p = (uint8_t *)&amp;h_copy;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 82 : unsigned int nbytes = sizeof(h_copy);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 82 : h_copy.cksum = 0;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1394 : for (c_sum = 0; nbytes; nbytes--) {</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1312 : b_data = *(p++);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1312 : i_sum = c_sum + b_data;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1312 : if (i_sum &lt; c_sum)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 345 : i_sum++;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1312 : c_sum = i_sum;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : }</a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 82 : return c_sum;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 17 : int nvram_format(void *nvram_image, uint32_t nvram_size)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> : : struct chrp_nvram_hdr *h;</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 17 : unsigned int offset = 0;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 17 : prerror(&quot;NVRAM: Re-initializing (size: 0x%08x)\n&quot;, nvram_size);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 17 : memset(nvram_image, 0, nvram_size);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : /* Create private partition */</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 17 : if (nvram_size - offset &lt; NVRAM_SIZE_FW_PRIV)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : return -1;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 16 : h = nvram_image + offset;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 16 : h-&gt;sig = NVRAM_SIG_FW_PRIV;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 16 : h-&gt;len = cpu_to_be16(NVRAM_SIZE_FW_PRIV &gt;&gt; 4);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 16 : strcpy(h-&gt;name, NVRAM_NAME_FW_PRIV);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 16 : h-&gt;cksum = chrp_nv_cksum(h);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 16 : prlog(PR_DEBUG, &quot;NVRAM: Created '%s' partition at 0x%08x&quot;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : &quot; for size 0x%08x with cksum 0x%02x\n&quot;,</a>
+<a name="70"><span class="lineNum"> 70 </span> : : NVRAM_NAME_FW_PRIV, offset,</a>
+<a name="71"><span class="lineNum"> 71 </span> : : be16_to_cpu(h-&gt;len), h-&gt;cksum);</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 16 : offset += NVRAM_SIZE_FW_PRIV;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* Create common partition */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 16 : if (nvram_size - offset &lt; NVRAM_SIZE_COMMON)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 2 : return -1;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 14 : h = nvram_image + offset;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 14 : h-&gt;sig = NVRAM_SIG_SYSTEM;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 14 : h-&gt;len = cpu_to_be16(NVRAM_SIZE_COMMON &gt;&gt; 4);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 14 : strcpy(h-&gt;name, NVRAM_NAME_COMMON);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 14 : h-&gt;cksum = chrp_nv_cksum(h);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 14 : prlog(PR_DEBUG, &quot;NVRAM: Created '%s' partition at 0x%08x&quot;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : &quot; for size 0x%08x with cksum 0x%02x\n&quot;,</a>
+<a name="84"><span class="lineNum"> 84 </span> : : NVRAM_NAME_COMMON, offset,</a>
+<a name="85"><span class="lineNum"> 85 </span> : : be16_to_cpu(h-&gt;len), h-&gt;cksum);</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 14 : offset += NVRAM_SIZE_COMMON;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* Create free space partition */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 14 : if (nvram_size - offset &lt; sizeof(struct chrp_nvram_hdr))</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : return -1;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 13 : h = nvram_image + offset;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 13 : h-&gt;sig = NVRAM_SIG_FREE;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 13 : h-&gt;len = cpu_to_be16((nvram_size - offset) &gt;&gt; 4);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* We have the full 12 bytes here */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 13 : memcpy(h-&gt;name, NVRAM_NAME_FREE, 12);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 13 : h-&gt;cksum = chrp_nv_cksum(h);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 13 : prlog(PR_DEBUG, &quot;NVRAM: Created '%s' partition at 0x%08x&quot;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : &quot; for size 0x%08x with cksum 0x%02x\n&quot;,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : NVRAM_NAME_FREE, offset, be16_to_cpu(h-&gt;len), h-&gt;cksum);</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 13 : return 0;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : /*</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * Check that the nvram partition layout is sane and that it</a>
+<a name="105"><span class="lineNum"> 105 </span> : : * contains our required partitions. If not, we re-format the</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * lot of it</a>
+<a name="107"><span class="lineNum"> 107 </span> : : */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 14 : int nvram_check(void *nvram_image, const uint32_t nvram_size)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 14 : unsigned int offset = 0;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 14 : bool found_common = false;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 14 : skiboot_part_hdr = NULL;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 43 : while (offset + sizeof(struct chrp_nvram_hdr) &lt; nvram_size) {</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 33 : struct chrp_nvram_hdr *h = nvram_image + offset;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 33 : if (chrp_nv_cksum(h) != h-&gt;cksum) {</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 2 : prerror(&quot;NVRAM: Partition at offset 0x%x&quot;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : &quot; has bad checksum: 0x%02x vs 0x%02x\n&quot;,</a>
+<a name="121"><span class="lineNum"> 121 </span> : : offset, h-&gt;cksum, chrp_nv_cksum(h));</a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 2 : goto failed;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : }</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 31 : if (be16_to_cpu(h-&gt;len) &lt; 1) {</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : prerror(&quot;NVRAM: Partition at offset 0x%x&quot;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : &quot; has incorrect 0 length\n&quot;, offset);</a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : goto failed;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : }</a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 30 : if (h-&gt;sig == NVRAM_SIG_SYSTEM &amp;&amp;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 10 : strcmp(h-&gt;name, NVRAM_NAME_COMMON) == 0)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 9 : found_common = true;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 30 : if (h-&gt;sig == NVRAM_SIG_FW_PRIV &amp;&amp;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 11 : strcmp(h-&gt;name, NVRAM_NAME_FW_PRIV) == 0)</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 10 : skiboot_part_hdr = h;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 30 : offset += be16_to_cpu(h-&gt;len) &lt;&lt; 4;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 30 : if (offset &gt; nvram_size) {</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : prerror(&quot;NVRAM: Partition at offset 0x%x&quot;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : &quot; extends beyond end of nvram !\n&quot;, offset);</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1 : goto failed;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 10 : if (!found_common) {</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 1 : prlog_once(PR_ERR, &quot;NVRAM: Common partition not found !\n&quot;);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 1 : goto failed;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 9 : if (!skiboot_part_hdr) {</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : prlog_once(PR_ERR, &quot;NVRAM: Skiboot private partition not found !\n&quot;);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : goto failed;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : } else {</a>
+<a name="154"><span class="lineNum"> 154 </span> : : /*</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * The OF NVRAM format requires config strings to be NUL</a>
+<a name="156"><span class="lineNum"> 156 </span> : : * terminated and unused memory to be set to zero. Well behaved</a>
+<a name="157"><span class="lineNum"> 157 </span> : : * software should ensure this is done for us, but we should</a>
+<a name="158"><span class="lineNum"> 158 </span> : : * always check.</a>
+<a name="159"><span class="lineNum"> 159 </span> : : */</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 16 : const char *last_byte = (const char *) skiboot_part_hdr +</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 8 : be16_to_cpu(skiboot_part_hdr-&gt;len) * 16 - 1;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 8 : if (*last_byte != 0) {</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 1 : prerror(&quot;NVRAM: Skiboot private partition is not NUL terminated&quot;);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 1 : goto failed;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : }</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 7 : prlog(PR_INFO, &quot;NVRAM: Layout appears sane\n&quot;);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 7 : assert(skiboot_part_hdr);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 7 : return 0;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 7 : failed:</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 7 : return -1;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : }</a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 7 : static const char *find_next_key(const char *start, const char *end)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : {</a>
+<a name="178"><span class="lineNum"> 178 </span> : : /*</a>
+<a name="179"><span class="lineNum"> 179 </span> : : * Unused parts of the partition are set to NUL. If we hit two</a>
+<a name="180"><span class="lineNum"> 180 </span> : : * NULs in a row then we assume that we have hit the end of the</a>
+<a name="181"><span class="lineNum"> 181 </span> : : * partition.</a>
+<a name="182"><span class="lineNum"> 182 </span> : : */</a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 7 : if (*start == 0)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 3 : return NULL;</span></a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 9 : while (start &lt; end) {</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 9 : if (*start == 0)</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 4 : return start + 1;</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 5 : start++;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : }</a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : static void nvram_dangerous(const char *key)</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : {</a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; ___________________________________________________________\n&quot;);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;&lt; Dangerous NVRAM option: %s\n&quot;, key);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; -----------------------------------------------------------\n&quot;);</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; \\ \n&quot;);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; \\ WW \n&quot;);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; &lt;^ \\___/| \n&quot;);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; \\ / \n&quot;);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; \\_ _/ \n&quot;);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot; }{ \n&quot;);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> : : /*</a>
+<a name="211"><span class="lineNum"> 211 </span> : : * nvram_query_safe/dangerous() - Searches skiboot NVRAM partition</a>
+<a name="212"><span class="lineNum"> 212 </span> : : * for a key=value pair.</a>
+<a name="213"><span class="lineNum"> 213 </span> : : *</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * Dangerous means it should only be used for testing as it may</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * mask issues. Safe is ok for long term use.</a>
+<a name="216"><span class="lineNum"> 216 </span> : : *</a>
+<a name="217"><span class="lineNum"> 217 </span> : : * Returns a pointer to a NUL terminated string that contains the value</a>
+<a name="218"><span class="lineNum"> 218 </span> : : * associated with the given key.</a>
+<a name="219"><span class="lineNum"> 219 </span> : : */</a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 5 : static const char *__nvram_query(const char *key, bool dangerous)</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : {</a>
+<a name="222"><span class="lineNum"> 222 </span> : : const char *part_end, *start;</a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 5 : int key_len = strlen(key);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 5 : assert(key);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : </a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 5 : if (!nvram_has_loaded()) {</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG,</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : &quot;NVRAM: Query for '%s' must wait for NVRAM to load\n&quot;,</a>
+<a name="230"><span class="lineNum"> 230 </span> : : key);</a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : if (!nvram_wait_for_load()) {</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : prlog(PR_CRIT, &quot;NVRAM: Failed to load\n&quot;);</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : }</a>
+<a name="235"><span class="lineNum"> 235 </span> : : }</a>
+<a name="236"><span class="lineNum"> 236 </span> : : </a>
+<a name="237"><span class="lineNum"> 237 </span> : : /*</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * The running OS can modify the NVRAM as it pleases so we need to be</a>
+<a name="239"><span class="lineNum"> 239 </span> : : * a little paranoid and check that it's ok before we try parse it.</a>
+<a name="240"><span class="lineNum"> 240 </span> : : *</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * NB: nvram_validate() can update skiboot_part_hdr</a>
+<a name="242"><span class="lineNum"> 242 </span> : : */</a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 5 : if (!nvram_validate())</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 5 : assert(skiboot_part_hdr);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 10 : part_end = (const char *) skiboot_part_hdr</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 5 : + be16_to_cpu(skiboot_part_hdr-&gt;len) * 16 - 1;</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 5 : start = (const char *) skiboot_part_hdr</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : + sizeof(*skiboot_part_hdr);</a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 5 : if (!key_len) {</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;NVRAM: search key is empty!\n&quot;);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : }</a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 5 : if (key_len &gt; 32)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;NVRAM: search key '%s' is longer than 32 chars\n&quot;, key);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 12 : while (start) {</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 9 : int remaining = part_end - start;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 9 : prlog(PR_TRACE, &quot;NVRAM: '%s' (%lu)\n&quot;,</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : start, strlen(start));</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 9 : if (key_len + 1 &gt; remaining)</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 9 : if (!strncmp(key, start, key_len) &amp;&amp; start[key_len] == '=') {</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 2 : const char *value = &amp;start[key_len + 1];</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;NVRAM: Searched for '%s' found '%s'\n&quot;,</span></a>
+<a name="275"><span class="lineNum"> 275 </span> : : key, value);</a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 2 : if (dangerous)</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : nvram_dangerous(start);</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 2 : return value;</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : }</a>
+<a name="281"><span class="lineNum"> 281 </span> : : </a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 7 : start = find_next_key(start, part_end);</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 3 : prlog(PR_DEBUG, &quot;NVRAM: '%s' not found\n&quot;, key);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 3 : return NULL;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : }</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 5 : const char *nvram_query_safe(const char *key)</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : {</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 5 : return __nvram_query(key, false);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : const char *nvram_query_dangerous(const char *key)</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : {</a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineNoCov"> 0 : return __nvram_query(key, true);</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : }</a>
+<a name="299"><span class="lineNum"> 299 </span> : : </a>
+<a name="300"><span class="lineNum"> 300 </span> : : /*</a>
+<a name="301"><span class="lineNum"> 301 </span> : : * nvram_query_eq_safe/dangerous() - Check if the given 'key' exists</a>
+<a name="302"><span class="lineNum"> 302 </span> : : * and is set to 'value'.</a>
+<a name="303"><span class="lineNum"> 303 </span> : : *</a>
+<a name="304"><span class="lineNum"> 304 </span> : : * Dangerous means it should only be used for testing as it may</a>
+<a name="305"><span class="lineNum"> 305 </span> : : * mask issues. Safe is ok for long term use.</a>
+<a name="306"><span class="lineNum"> 306 </span> : : *</a>
+<a name="307"><span class="lineNum"> 307 </span> : : * Note: Its an error to check for non-existence of a key</a>
+<a name="308"><span class="lineNum"> 308 </span> : : * by passing 'value == NULL' as a key's value can never be</a>
+<a name="309"><span class="lineNum"> 309 </span> : : * NULL in nvram.</a>
+<a name="310"><span class="lineNum"> 310 </span> : : */</a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : static bool __nvram_query_eq(const char *key, const char *value, bool dangerous)</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : {</a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : const char *s = __nvram_query(key, dangerous);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : if (!s)</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : assert(value != NULL);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : return !strcmp(s, value);</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : }</a>
+<a name="321"><span class="lineNum"> 321 </span> : : </a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : bool nvram_query_eq_safe(const char *key, const char *value)</span></a>
+<a name="323"><span class="lineNum"> 323 </span> : : {</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : return __nvram_query_eq(key, value, false);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : }</a>
+<a name="326"><span class="lineNum"> 326 </span> : : </a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : bool nvram_query_eq_dangerous(const char *key, const char *value)</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : {</a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineNoCov"> 0 : return __nvram_query_eq(key, value, true);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : }</a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/opal-msg.c.func-sort-c.html b/coverage-report/core/opal-msg.c.func-sort-c.html
new file mode 100644
index 0000000..8005572
--- /dev/null
+++ b/coverage-report/core/opal-msg.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/opal-msg.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - opal-msg.c<span style="font-size: 80%;"> (<a href="opal-msg.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">73.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="opal-msg.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#131">opal_check_completion</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#171">opal_init_msg</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#27">_opal_queue_msg</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#75">opal_get_msg</a></td>
+ <td class="coverFnHi">42</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/opal-msg.c.func.html b/coverage-report/core/opal-msg.c.func.html
new file mode 100644
index 0000000..8b9fb68
--- /dev/null
+++ b/coverage-report/core/opal-msg.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/opal-msg.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - opal-msg.c<span style="font-size: 80%;"> (<a href="opal-msg.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">73.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="opal-msg.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#27">_opal_queue_msg</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#131">opal_check_completion</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#75">opal_get_msg</a></td>
+ <td class="coverFnHi">42</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-msg.c.gcov.html#171">opal_init_msg</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/opal-msg.c.gcov.html b/coverage-report/core/opal-msg.c.gcov.html
new file mode 100644
index 0000000..674629e
--- /dev/null
+++ b/coverage-report/core/opal-msg.c.gcov.html
@@ -0,0 +1,278 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/opal-msg.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - opal-msg.c<span style="font-size: 80%;"> (source / <a href="opal-msg.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">73.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * OPAL Message queue between host and skiboot</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define pr_fmt(fmt) &quot;opalmsg: &quot; fmt</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;opal-msg.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;opal-api.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;lock.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define OPAL_MAX_MSGS (OPAL_MSG_TYPE_MAX + OPAL_MAX_ASYNC_COMP - 1)</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : struct opal_msg_entry {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : struct list_node link;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : void (*consumed)(void *data, int status);</a>
+<a name="19"><span class="lineNum"> 19 </span> : : bool extended;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : void *data;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : struct opal_msg msg;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : };</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : static LIST_HEAD(msg_free_list);</a>
+<a name="25"><span class="lineNum"> 25 </span> : : static LIST_HEAD(msg_pending_list);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : static struct lock opal_msg_lock = LOCK_UNLOCKED;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 41 : int _opal_queue_msg(enum opal_msg_type msg_type, void *data,</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : void (*consumed)(void *data, int status),</a>
+<a name="31"><span class="lineNum"> 31 </span> : : size_t params_size, const void *params)</a>
+<a name="32"><span class="lineNum"> 32 </span> : : {</a>
+<a name="33"><span class="lineNum"> 33 </span> : : struct opal_msg_entry *entry;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : uint64_t entry_size;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 41 : if ((params_size + OPAL_MSG_HDR_SIZE) &gt; OPAL_MSG_SIZE) {</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : prlog(PR_DEBUG, &quot;param_size (0x%x) &gt; opal_msg param size (0x%x)\n&quot;,</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : (u32)params_size, (u32)(OPAL_MSG_SIZE - OPAL_MSG_HDR_SIZE));</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 40 : lock(&amp;opal_msg_lock);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 40 : if (params_size &gt; OPAL_MSG_FIXED_PARAMS_SIZE) {</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 2 : entry_size = sizeof(struct opal_msg_entry) + params_size;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 2 : entry_size -= OPAL_MSG_FIXED_PARAMS_SIZE;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 2 : entry = zalloc(entry_size);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 2 : if (entry)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 2 : entry-&gt;extended = true;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : } else {</a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 38 : entry = list_pop(&amp;msg_free_list, struct opal_msg_entry, link);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 38 : if (!entry) {</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 2 : prerror(&quot;No available node in the free list, allocating\n&quot;);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 2 : entry = zalloc(sizeof(struct opal_msg_entry));</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 40 : if (!entry) {</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : prerror(&quot;Allocation failed\n&quot;);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : unlock(&amp;opal_msg_lock);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : return OPAL_RESOURCE;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 39 : entry-&gt;consumed = consumed;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 39 : entry-&gt;data = data;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 39 : entry-&gt;msg.msg_type = cpu_to_be32(msg_type);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 39 : entry-&gt;msg.size = cpu_to_be32(params_size);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 39 : memcpy(entry-&gt;msg.params, params, params_size);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 39 : list_add_tail(&amp;msg_pending_list, &amp;entry-&gt;link);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 39 : opal_update_pending_evt(OPAL_EVENT_MSG_PENDING,</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : OPAL_EVENT_MSG_PENDING);</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 39 : unlock(&amp;opal_msg_lock);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 39 : return OPAL_SUCCESS;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : }</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 42 : static int64_t opal_get_msg(uint64_t *buffer, uint64_t size)</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : {</a>
+<a name="79"><span class="lineNum"> 79 </span> : : struct opal_msg_entry *entry;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : void (*callback)(void *data, int status);</a>
+<a name="81"><span class="lineNum"> 81 </span> : : void *data;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : uint64_t msg_size;</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 42 : int rc = OPAL_SUCCESS;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 42 : if (size &lt; sizeof(struct opal_msg) || !buffer)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 2 : return OPAL_PARAMETER;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 40 : if (!opal_addr_valid(buffer))</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 40 : lock(&amp;opal_msg_lock);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 40 : entry = list_pop(&amp;msg_pending_list, struct opal_msg_entry, link);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 40 : if (!entry) {</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : unlock(&amp;opal_msg_lock);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : return OPAL_RESOURCE;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 39 : msg_size = OPAL_MSG_HDR_SIZE + be32_to_cpu(entry-&gt;msg.size);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 39 : if (size &lt; msg_size) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : /* Send partial data to Linux */</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 2 : prlog(PR_NOTICE, &quot;Sending partial data [msg_type : 0x%x, &quot;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : &quot;msg_size : 0x%x, buf_size : 0x%x]\n&quot;,</a>
+<a name="104"><span class="lineNum"> 104 </span> : : be32_to_cpu(entry-&gt;msg.msg_type),</a>
+<a name="105"><span class="lineNum"> 105 </span> : : (u32)msg_size, (u32)size);</a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 2 : entry-&gt;msg.size = cpu_to_be32(size - OPAL_MSG_HDR_SIZE);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 2 : msg_size = size;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 2 : rc = OPAL_PARTIAL;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : }</a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 39 : memcpy((void *)buffer, (void *)&amp;entry-&gt;msg, msg_size);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 39 : callback = entry-&gt;consumed;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 39 : data = entry-&gt;data;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 39 : if (entry-&gt;extended)</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 2 : free(entry);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : else</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 37 : list_add(&amp;msg_free_list, &amp;entry-&gt;link);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 39 : if (list_empty(&amp;msg_pending_list))</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 15 : opal_update_pending_evt(OPAL_EVENT_MSG_PENDING, 0);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 39 : unlock(&amp;opal_msg_lock);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 39 : if (callback)</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 2 : callback(data, rc);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 39 : return rc;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : }</a>
+<a name="131"><span class="lineNum"> 131 </span> : : opal_call(OPAL_GET_MSG, opal_get_msg, 2);</a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : static int64_t opal_check_completion(uint64_t *buffer, uint64_t size,</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : uint64_t token)</a>
+<a name="135"><span class="lineNum"> 135 </span> : : {</a>
+<a name="136"><span class="lineNum"> 136 </span> : : struct opal_msg_entry *entry, *next_entry;</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : void (*callback)(void *data, int status) = NULL;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : int rc = OPAL_BUSY;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : void *data = NULL;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineNoCov"> 0 : if (!opal_addr_valid(buffer))</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : lock(&amp;opal_msg_lock);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : list_for_each_safe(&amp;msg_pending_list, entry, next_entry, link) {</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(entry-&gt;msg.msg_type) == OPAL_MSG_ASYNC_COMP &amp;&amp;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : be64_to_cpu(entry-&gt;msg.params[0]) == token) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : list_del(&amp;entry-&gt;link);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : callback = entry-&gt;consumed;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : data = entry-&gt;data;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : list_add(&amp;msg_free_list, &amp;entry-&gt;link);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : if (list_empty(&amp;msg_pending_list))</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : opal_update_pending_evt(OPAL_EVENT_MSG_PENDING,</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : 0);</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : rc = OPAL_SUCCESS;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : }</a>
+<a name="158"><span class="lineNum"> 158 </span> : : }</a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : if (rc == OPAL_SUCCESS &amp;&amp; size &gt;= sizeof(struct opal_msg))</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : memcpy(buffer, &amp;entry-&gt;msg, sizeof(entry-&gt;msg));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : unlock(&amp;opal_msg_lock);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : if (callback)</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : callback(data, OPAL_SUCCESS);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : </a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : opal_call(OPAL_CHECK_ASYNC_COMPLETION, opal_check_completion, 3);</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 2 : void opal_init_msg(void)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : {</a>
+<a name="175"><span class="lineNum"> 175 </span> : : struct opal_msg_entry *entry;</a>
+<a name="176"><span class="lineNum"> 176 </span> : : int i;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 29 : for (i = 0; i &lt; OPAL_MAX_MSGS; i++, entry++) {</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 28 : entry = zalloc(sizeof(*entry));</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 28 : if (!entry)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 1 : goto err;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 27 : list_add_tail(&amp;msg_free_list, &amp;entry-&gt;link);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 1 : return;</span></a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : err:</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 4 : for (; i &gt; 0; i--) {</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 3 : entry = list_pop(&amp;msg_free_list, struct opal_msg_entry, link);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 3 : if (entry)</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 3 : free(entry);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : }</a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pci-quirk.c.func-sort-c.html b/coverage-report/core/pci-quirk.c.func-sort-c.html
new file mode 100644
index 0000000..5ec7900
--- /dev/null
+++ b/coverage-report/core/pci-quirk.c.func-sort-c.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pci-quirk.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pci-quirk.c<span style="font-size: 80%;"> (<a href="pci-quirk.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntryLo">13.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryLo">20.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="pci-quirk.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#15">cfg_block_filter</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#130">pci_handle_quirk</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#83">quirk_astbmc_vga</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#44">quirk_microsemi_gen4_sw</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#118">__pci_handle_quirk</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pci-quirk.c.func.html b/coverage-report/core/pci-quirk.c.func.html
new file mode 100644
index 0000000..b370e45
--- /dev/null
+++ b/coverage-report/core/pci-quirk.c.func.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pci-quirk.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pci-quirk.c<span style="font-size: 80%;"> (<a href="pci-quirk.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntryLo">13.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryLo">20.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="pci-quirk.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#118">__pci_handle_quirk</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#15">cfg_block_filter</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#130">pci_handle_quirk</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#83">quirk_astbmc_vga</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci-quirk.c.gcov.html#44">quirk_microsemi_gen4_sw</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pci-quirk.c.gcov.html b/coverage-report/core/pci-quirk.c.gcov.html
new file mode 100644
index 0000000..02fdfae
--- /dev/null
+++ b/coverage-report/core/pci-quirk.c.gcov.html
@@ -0,0 +1,220 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pci-quirk.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pci-quirk.c<span style="font-size: 80%;"> (source / <a href="pci-quirk.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntryLo">13.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryLo">20.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Deal with PCI device quirks</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2017-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define pr_fmt(fmt) &quot;PCI-QUIRK: &quot; fmt</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;pci.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;pci-cfg.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;pci-quirk.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;platform.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;ast.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineNoCov"> 0 : static int64_t cfg_block_filter(void *dev __unused,</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : struct pci_cfg_reg_filter *pcrf __unused,</a>
+<a name="19"><span class="lineNum"> 19 </span> : : uint32_t offset __unused, uint32_t len,</a>
+<a name="20"><span class="lineNum"> 20 </span> : : uint32_t *data, bool write)</a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : if (write)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : switch (len) {</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : case 4:</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : *data = 0x0;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : case 2:</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : *((uint16_t *)data) = 0x0;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : case 1:</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : *((uint8_t *)data) = 0x0;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER; /* should never happen */</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : /* blocks config accesses to registers in the range: [start, end] */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define BLOCK_CFG_RANGE(pd, start, end) \</a>
+<a name="42"><span class="lineNum"> 42 </span> : : pci_add_cfg_reg_filter(pd, start, end - start + 1, \</a>
+<a name="43"><span class="lineNum"> 43 </span> : : PCI_REG_FLAG_WRITE | PCI_REG_FLAG_READ, \</a>
+<a name="44"><span class="lineNum"> 44 </span> : : cfg_block_filter);</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : static void quirk_microsemi_gen4_sw(struct phb *phb, struct pci_device *pd)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> : : uint8_t data;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : bool frozen;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : int offset;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : int start;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : pci_check_clear_freeze(phb);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : /*</a>
+<a name="56"><span class="lineNum"> 56 </span> : : * Reading from 0xff should trigger a UR on the affected switches.</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * If we don't get a freeze then we don't need the workaround</a>
+<a name="58"><span class="lineNum"> 58 </span> : : */</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : pci_cfg_read8(phb, pd-&gt;bdfn, 0xff, &amp;data);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : frozen = pci_check_clear_freeze(phb);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineNoCov"> 0 : if (!frozen)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : for (start = -1, offset = 0; offset &lt; 4096; offset++) {</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : pci_cfg_read8(phb, pd-&gt;bdfn, offset, &amp;data);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : frozen = pci_check_clear_freeze(phb);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : if (start &lt; 0 &amp;&amp; frozen) { /* new UR range */</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : start = offset;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : } else if (start &gt;= 0 &amp;&amp; !frozen) { /* end of range */</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : BLOCK_CFG_RANGE(pd, start, offset - 1);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : PCINOTICE(phb, pd-&gt;bdfn, &quot;Applied UR workaround to [%03x..%03x]\n&quot;, start, offset - 1);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : start = -1;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : }</a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* range lasted until the end of config space */</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : if (start &gt;= 0) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : BLOCK_CFG_RANGE(pd, start, 0xfff);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : PCINOTICE(phb, pd-&gt;bdfn, &quot;Applied UR workaround to [%03x..fff]\n&quot;, start);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : static void quirk_astbmc_vga(struct phb *phb __unused,</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : struct pci_device *pd)</a>
+<a name="87"><span class="lineNum"> 87 </span> : : {</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : struct dt_node *np = pd-&gt;dn;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : uint32_t revision, mcr_configuration, mcr_scu_mpll, mcr_scu_strap;</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : if (ast_sio_is_enabled()) {</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : revision = ast_ahb_readl(SCU_REVISION_ID);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : mcr_configuration = ast_ahb_readl(MCR_CONFIGURATION);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : mcr_scu_mpll = ast_ahb_readl(MCR_SCU_MPLL);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : mcr_scu_strap = ast_ahb_readl(MCR_SCU_STRAP);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : } else {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : /* Previously we would warn, now SIO disabled by design */</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;Assumed platform default parameters for %s\n&quot;,</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : __func__);</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : revision = bmc_platform-&gt;hw-&gt;scu_revision_id;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : mcr_configuration = bmc_platform-&gt;hw-&gt;mcr_configuration;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : mcr_scu_mpll = bmc_platform-&gt;hw-&gt;mcr_scu_mpll;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : mcr_scu_strap = bmc_platform-&gt;hw-&gt;mcr_scu_strap;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : }</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(np, &quot;aspeed,scu-revision-id&quot;, revision);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(np, &quot;aspeed,mcr-configuration&quot;, mcr_configuration);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(np, &quot;aspeed,mcr-scu-mpll&quot;, mcr_scu_mpll);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(np, &quot;aspeed,mcr-scu-strap&quot;, mcr_scu_strap);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> : : /* Quirks are: {fixup function, vendor ID, (device ID or PCI_ANY_ID)} */</a>
+<a name="113"><span class="lineNum"> 113 </span> : : static const struct pci_quirk quirk_table[] = {</a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* ASPEED 2400 VGA device */</a>
+<a name="115"><span class="lineNum"> 115 </span> : : { 0x1a03, 0x2000, &amp;quirk_astbmc_vga },</a>
+<a name="116"><span class="lineNum"> 116 </span> : : { 0x11f8, 0x4052, &amp;quirk_microsemi_gen4_sw },</a>
+<a name="117"><span class="lineNum"> 117 </span> : : { 0, 0, NULL }</a>
+<a name="118"><span class="lineNum"> 118 </span> : : };</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 4 : static void __pci_handle_quirk(struct phb *phb, struct pci_device *pd,</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : const struct pci_quirk *quirks)</a>
+<a name="122"><span class="lineNum"> 122 </span> : : {</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 8 : while (quirks-&gt;vendor_id) {</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 4 : if (quirks-&gt;vendor_id == PCI_VENDOR_ID(pd-&gt;vdid) &amp;&amp;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 2 : (quirks-&gt;device_id == PCI_ANY_ID ||</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 2 : quirks-&gt;device_id == PCI_DEVICE_ID(pd-&gt;vdid)))</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : quirks-&gt;fixup(phb, pd);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 4 : quirks++;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : }</a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : void pci_handle_quirk(struct phb *phb, struct pci_device *pd)</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : {</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : __pci_handle_quirk(phb, pd, quirk_table);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pel.c.func-sort-c.html b/coverage-report/core/pel.c.func-sort-c.html
new file mode 100644
index 0000000..0b084ef
--- /dev/null
+++ b/coverage-report/core/pel.c.func-sort-c.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pel.c<span style="font-size: 80%;"> (<a href="pel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">155</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntryHi">97.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="pel.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#199">create_user_defined_section</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#42">create_extended_header_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#14">create_mtms_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#165">create_private_header_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#109">create_src_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#138">create_user_header_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#101">setrefcode</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#93">setsubsys</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#85">settype</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#256">create_pel_log</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#250">pel_size</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#231">pel_user_section_size</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pel.c.func.html b/coverage-report/core/pel.c.func.html
new file mode 100644
index 0000000..ce15183
--- /dev/null
+++ b/coverage-report/core/pel.c.func.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pel.c<span style="font-size: 80%;"> (<a href="pel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">155</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntryHi">97.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="pel.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#42">create_extended_header_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#14">create_mtms_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#256">create_pel_log</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#165">create_private_header_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#109">create_src_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#199">create_user_defined_section</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#138">create_user_header_section</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#250">pel_size</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#231">pel_user_section_size</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#101">setrefcode</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#93">setsubsys</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pel.c.gcov.html#85">settype</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pel.c.gcov.html b/coverage-report/core/pel.c.gcov.html
new file mode 100644
index 0000000..f273ad5
--- /dev/null
+++ b/coverage-report/core/pel.c.gcov.html
@@ -0,0 +1,364 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pel.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pel.c<span style="font-size: 80%;"> (source / <a href="pel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">155</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntryHi">97.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Platform Error Log (PEL) generation</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2014-2016 IBM Corp</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;string.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;errorlog.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;device.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;fsp.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;pel.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;rtc.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : /* Create MTMS section for sapphire log */</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 2 : static void create_mtms_section(struct errorlog *elog_data,</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : char *pel_buffer, int *pel_offset)</a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> : : const struct dt_property *p;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 2 : struct opal_mtms_section *mtms = (struct opal_mtms_section *)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 2 : (pel_buffer + *pel_offset);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 2 : mtms-&gt;v6header.id = cpu_to_be16(ELOG_SID_MACHINE_TYPE);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 2 : mtms-&gt;v6header.length = cpu_to_be16(MTMS_SECTION_SIZE);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 2 : mtms-&gt;v6header.version = OPAL_EXT_HRD_VER;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 2 : mtms-&gt;v6header.subtype = 0;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 2 : mtms-&gt;v6header.component_id = cpu_to_be16(elog_data-&gt;component_id);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 2 : memset(mtms-&gt;model, 0x00, sizeof(mtms-&gt;model));</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 2 : memcpy(mtms-&gt;model, dt_prop_get(dt_root, &quot;model&quot;), OPAL_SYS_MODEL_LEN);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 2 : memset(mtms-&gt;serial_no, 0x00, sizeof(mtms-&gt;serial_no));</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 2 : p = dt_find_property(dt_root, &quot;system-id&quot;);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 2 : if (p)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : memcpy(mtms-&gt;serial_no, p-&gt;prop, OPAL_SYS_SERIAL_LEN);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : else</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 2 : memset(mtms-&gt;serial_no, 0, OPAL_SYS_SERIAL_LEN);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 2 : *pel_offset += MTMS_SECTION_SIZE;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : /* Create extended header section */</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 2 : static void create_extended_header_section(struct errorlog *elog_data,</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : char *pel_buffer, int *pel_offset)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 2 : const char *opalmodel = NULL;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : const struct dt_property *p;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : uint64_t extd_time;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : uint32_t extd_date;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 2 : struct opal_extended_header_section *extdhdr =</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : (struct opal_extended_header_section *)</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 2 : (pel_buffer + *pel_offset);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 2 : extdhdr-&gt;v6header.id = cpu_to_be16(ELOG_SID_EXTENDED_HEADER);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 2 : extdhdr-&gt;v6header.length = cpu_to_be16(EXTENDED_HEADER_SECTION_SIZE);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 2 : extdhdr-&gt;v6header.version = OPAL_EXT_HRD_VER;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 2 : extdhdr-&gt;v6header.subtype = 0;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 2 : extdhdr-&gt;v6header.component_id = cpu_to_be16(elog_data-&gt;component_id);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 2 : memset(extdhdr-&gt;model, 0x00, sizeof(extdhdr-&gt;model));</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 2 : opalmodel = dt_prop_get(dt_root, &quot;model&quot;);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 2 : memcpy(extdhdr-&gt;model, opalmodel, OPAL_SYS_MODEL_LEN);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 2 : memset(extdhdr-&gt;serial_no, 0x00, sizeof(extdhdr-&gt;serial_no));</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 2 : p = dt_find_property(dt_root, &quot;system-id&quot;);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 2 : if (p)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : memcpy(extdhdr-&gt;serial_no, p-&gt;prop, OPAL_SYS_SERIAL_LEN);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : else</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 2 : memset(extdhdr-&gt;serial_no, 0, OPAL_SYS_SERIAL_LEN);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 2 : memset(extdhdr-&gt;opal_release_version, 0x00,</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : sizeof(extdhdr-&gt;opal_release_version));</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 2 : memset(extdhdr-&gt;opal_subsys_version, 0x00,</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : sizeof(extdhdr-&gt;opal_subsys_version));</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 2 : rtc_cache_get_datetime(&amp;extd_date, &amp;extd_time);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 2 : extdhdr-&gt;extended_header_date = cpu_to_be32(extd_date);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 2 : extdhdr-&gt;extended_header_time = cpu_to_be32(extd_time &gt;&gt; 32);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 2 : extdhdr-&gt;opal_symid_len = 0;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 2 : *pel_offset += EXTENDED_HEADER_SECTION_SIZE;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /* set src type */</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 2 : static void settype(struct opal_src_section *src, uint8_t src_type)</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : {</a>
+<a name="89"><span class="lineNum"> 89 </span> : : char type[4];</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 2 : snprintf(type, sizeof(type), &quot;%02X&quot;, src_type);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 2 : memcpy(src-&gt;srcstring, type, 2);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* set SRC subsystem type */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 2 : static void setsubsys(struct opal_src_section *src, uint8_t src_subsys)</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : char subsys[4];</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 2 : snprintf(subsys, sizeof(subsys), &quot;%02X&quot;, src_subsys);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 2 : memcpy(src-&gt;srcstring+2, subsys, 2);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /* Ser reason code of SRC */</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 2 : static void setrefcode(struct opal_src_section *src, uint16_t src_refcode)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> : : char refcode[8];</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 2 : snprintf(refcode, sizeof(refcode), &quot;%04X&quot;, src_refcode);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 2 : memcpy(src-&gt;srcstring+4, refcode, 4);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Create SRC section of OPAL log */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 2 : static void create_src_section(struct errorlog *elog_data,</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : char *pel_buffer, int *pel_offset)</a>
+<a name="113"><span class="lineNum"> 113 </span> : : {</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 2 : struct opal_src_section *src = (struct opal_src_section *)</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 2 : (pel_buffer + *pel_offset);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 2 : src-&gt;v6header.id = cpu_to_be16(ELOG_SID_PRIMARY_SRC);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 2 : src-&gt;v6header.length = cpu_to_be16(SRC_SECTION_SIZE);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 2 : src-&gt;v6header.version = OPAL_ELOG_VERSION;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 2 : src-&gt;v6header.subtype = OPAL_ELOG_SST;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 2 : src-&gt;v6header.component_id = cpu_to_be16(elog_data-&gt;component_id);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 2 : src-&gt;version = OPAL_SRC_SEC_VER;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 2 : src-&gt;flags = 0;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 2 : src-&gt;wordcount = OPAL_SRC_MAX_WORD_COUNT;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 2 : src-&gt;srclength = cpu_to_be16(SRC_LENGTH);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 2 : settype(src, OPAL_SRC_TYPE_ERROR);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 2 : setsubsys(src, OPAL_FAILING_SUBSYSTEM);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 2 : setrefcode(src, elog_data-&gt;reason_code);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 2 : memset(src-&gt;hexwords, 0 , (8 * 4));</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 2 : src-&gt;hexwords[0] = cpu_to_be32(OPAL_SRC_FORMAT);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 2 : src-&gt;hexwords[4] = cpu_to_be32(elog_data-&gt;additional_info[0]);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 2 : src-&gt;hexwords[5] = cpu_to_be32(elog_data-&gt;additional_info[1]);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 2 : src-&gt;hexwords[6] = cpu_to_be32(elog_data-&gt;additional_info[2]);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 2 : src-&gt;hexwords[7] = cpu_to_be32(elog_data-&gt;additional_info[3]);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 2 : *pel_offset += SRC_SECTION_SIZE;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : </a>
+<a name="139"><span class="lineNum"> 139 </span> : : /* Create user header section */</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 2 : static void create_user_header_section(struct errorlog *elog_data,</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : char *pel_buffer, int *pel_offset)</a>
+<a name="142"><span class="lineNum"> 142 </span> : : {</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 2 : struct opal_user_header_section *usrhdr =</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : (struct opal_user_header_section *)</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 2 : (pel_buffer + *pel_offset);</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 2 : usrhdr-&gt;v6header.id = cpu_to_be16(ELOG_SID_USER_HEADER);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 2 : usrhdr-&gt;v6header.length = cpu_to_be16(USER_HEADER_SECTION_SIZE);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 2 : usrhdr-&gt;v6header.version = OPAL_ELOG_VERSION;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 2 : usrhdr-&gt;v6header.subtype = OPAL_ELOG_SST;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 2 : usrhdr-&gt;v6header.component_id = cpu_to_be16(elog_data-&gt;component_id);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 2 : usrhdr-&gt;subsystem_id = elog_data-&gt;subsystem_id;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 2 : usrhdr-&gt;event_scope = 0;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 2 : usrhdr-&gt;event_severity = elog_data-&gt;event_severity;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 2 : usrhdr-&gt;event_type = elog_data-&gt;event_subtype;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 2 : if (elog_data-&gt;elog_origin == ORG_SAPPHIRE)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 2 : usrhdr-&gt;action_flags = cpu_to_be16(ERRL_ACTION_REPORT);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : else</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : usrhdr-&gt;action_flags = cpu_to_be16(ERRL_ACTION_NONE);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 2 : *pel_offset += USER_HEADER_SECTION_SIZE;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> : : /* Create private header section */</a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 2 : static void create_private_header_section(struct errorlog *elog_data,</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : char *pel_buffer, int *pel_offset)</a>
+<a name="169"><span class="lineNum"> 169 </span> : : {</a>
+<a name="170"><span class="lineNum"> 170 </span> : : uint64_t ctime;</a>
+<a name="171"><span class="lineNum"> 171 </span> : : uint32_t cdate;</a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 2 : struct opal_private_header_section *privhdr =</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : (struct opal_private_header_section *)</a>
+<a name="174"><span class="lineNum"> 174 </span> : : pel_buffer;</a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 2 : privhdr-&gt;v6header.id = cpu_to_be16(ELOG_SID_PRIVATE_HEADER);</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 2 : privhdr-&gt;v6header.length = cpu_to_be16(PRIVATE_HEADER_SECTION_SIZE);</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 2 : privhdr-&gt;v6header.version = OPAL_ELOG_VERSION;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 2 : privhdr-&gt;v6header.subtype = OPAL_ELOG_SST;</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 2 : privhdr-&gt;v6header.component_id = cpu_to_be16(elog_data-&gt;component_id);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 2 : privhdr-&gt;plid = cpu_to_be32(elog_data-&gt;plid);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 2 : rtc_cache_get_datetime(&amp;cdate, &amp;ctime);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 2 : privhdr-&gt;create_date = cpu_to_be32(cdate);</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 2 : privhdr-&gt;create_time = cpu_to_be32(ctime &gt;&gt; 32);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 2 : privhdr-&gt;section_count = 5;</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 2 : privhdr-&gt;creator_subid_hi = 0x00;</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 2 : privhdr-&gt;creator_subid_lo = 0x00;</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 2 : if (elog_data-&gt;elog_origin == ORG_SAPPHIRE)</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 2 : privhdr-&gt;creator_id = OPAL_CID_SAPPHIRE;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : else</a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : privhdr-&gt;creator_id = OPAL_CID_POWERNV;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 2 : privhdr-&gt;log_entry_id = cpu_to_be32(elog_data-&gt;plid); /*entry id is updated by FSP*/</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 2 : *pel_offset += PRIVATE_HEADER_SECTION_SIZE;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 1 : static void create_user_defined_section(struct errorlog *elog_data,</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : char *pel_buffer, int *pel_offset)</a>
+<a name="203"><span class="lineNum"> 203 </span> : : {</a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 1 : char *dump = (char *)pel_buffer + *pel_offset;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 1 : char *opal_buf = (char *)elog_data-&gt;user_data_dump;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : struct opal_user_section *usrhdr;</a>
+<a name="207"><span class="lineNum"> 207 </span> : : struct elog_user_data_section *opal_usr_data;</a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 1 : struct opal_private_header_section *privhdr =</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : (struct opal_private_header_section *)pel_buffer;</a>
+<a name="210"><span class="lineNum"> 210 </span> : : int i;</a>
+<a name="211"><span class="lineNum"> 211 </span> : : </a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 2 : for (i = 0; i &lt; elog_data-&gt;user_section_count; i++) {</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 1 : usrhdr = (struct opal_user_section *)dump;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 1 : opal_usr_data = (struct elog_user_data_section *)opal_buf;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 1 : usrhdr-&gt;v6header.id = cpu_to_be16(ELOG_SID_USER_DEFINED);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 2 : usrhdr-&gt;v6header.length = cpu_to_be16(</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 1 : sizeof(struct opal_v6_header) +</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 1 : be16_to_cpu(opal_usr_data-&gt;size));</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : usrhdr-&gt;v6header.version = OPAL_ELOG_VERSION;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 1 : usrhdr-&gt;v6header.subtype = OPAL_ELOG_SST;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 1 : usrhdr-&gt;v6header.component_id = cpu_to_be16(elog_data-&gt;component_id);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1 : memcpy(usrhdr-&gt;dump, opal_buf, be16_to_cpu(opal_usr_data-&gt;size));</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1 : *pel_offset += be16_to_cpu(usrhdr-&gt;v6header.length);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 1 : dump += be16_to_cpu(usrhdr-&gt;v6header.length);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 1 : opal_buf += be16_to_cpu(opal_usr_data-&gt;size);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 1 : privhdr-&gt;section_count++;</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : }</a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 6 : static size_t pel_user_section_size(struct errorlog *elog_data)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : {</a>
+<a name="235"><span class="lineNum"> 235 </span> : : int i;</a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 6 : size_t total = 0;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 6 : char *opal_buf = (char *)elog_data-&gt;user_data_dump;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : struct elog_user_data_section *opal_usr_data;</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 8 : for (i = 0; i &lt; elog_data-&gt;user_section_count; i++) {</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : u16 s;</a>
+<a name="242"><span class="lineNum"> 242 </span> : : </a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 2 : opal_usr_data = (struct elog_user_data_section *)opal_buf;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 2 : s = be16_to_cpu(opal_usr_data-&gt;size);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 2 : total += sizeof(struct opal_v6_header) + s;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 2 : opal_buf += s;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : }</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 6 : return total;</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : }</a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 6 : size_t pel_size(struct errorlog *elog_data)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : {</a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 6 : return PEL_MIN_SIZE + pel_user_section_size(elog_data);</span></a>
+<a name="255"><span class="lineNum"> 255 </span> : : }</a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> : : /* Converts an OPAL errorlog into a PEL formatted log */</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 3 : int create_pel_log(struct errorlog *elog_data, char *pel_buffer,</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : size_t pel_buffer_size)</a>
+<a name="260"><span class="lineNum"> 260 </span> : : {</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 3 : int pel_offset = 0;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : </a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 3 : if (pel_buffer_size &lt; pel_size(elog_data)) {</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 1 : prerror(&quot;PEL buffer too small to create record\n&quot;);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 2 : memset(pel_buffer, 0, pel_buffer_size);</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 2 : create_private_header_section(elog_data, pel_buffer, &amp;pel_offset);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 2 : create_user_header_section(elog_data, pel_buffer, &amp;pel_offset);</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 2 : create_src_section(elog_data, pel_buffer, &amp;pel_offset);</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 2 : create_extended_header_section(elog_data, pel_buffer, &amp;pel_offset);</span></a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 2 : create_mtms_section(elog_data, pel_buffer, &amp;pel_offset);</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 2 : if (elog_data-&gt;user_section_count)</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 1 : create_user_defined_section(elog_data, pel_buffer, &amp;pel_offset);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : </a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 2 : return pel_offset;</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pool.c.func-sort-c.html b/coverage-report/core/pool.c.func-sort-c.html
new file mode 100644
index 0000000..5f7e8eb
--- /dev/null
+++ b/coverage-report/core/pool.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pool.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pool.c<span style="font-size: 80%;"> (<a href="pool.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryHi">96.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="pool.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pool.c.gcov.html#44">pool_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pool.c.gcov.html#37">pool_free_object</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pool.c.gcov.html#22">pool_get</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pool.c.func.html b/coverage-report/core/pool.c.func.html
new file mode 100644
index 0000000..8f9c1fb
--- /dev/null
+++ b/coverage-report/core/pool.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pool.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pool.c<span style="font-size: 80%;"> (<a href="pool.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryHi">96.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="pool.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pool.c.gcov.html#37">pool_free_object</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pool.c.gcov.html#22">pool_get</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pool.c.gcov.html#44">pool_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/pool.c.gcov.html b/coverage-report/core/pool.c.gcov.html
new file mode 100644
index 0000000..8be8338
--- /dev/null
+++ b/coverage-report/core/pool.c.gcov.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/pool.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - pool.c<span style="font-size: 80%;"> (source / <a href="pool.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryHi">96.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This file provides some functions to manage a pool of pre-allocated</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * objects. It also provides a method to reserve a pre-defined number</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * of objects for higher priorty requests. The allocations follow the</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * following rules:</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * 1. An allocation will succeed at any priority if there is more than</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * the reserved number of objects free.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * 2. Only high priority allocations will succeed when there are less</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * than the reserved number of objects free.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * 3. When an allocation is freed it is always added to the high priority</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * pool if there are less than the reserved number of allocations</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * available.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : *</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * Copyright 2013-2014 IBM Corp.</a>
+<a name="17"><span class="lineNum"> 17 </span> : : */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;pool.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &lt;string.h&gt;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 13 : void* pool_get(struct pool *pool, enum pool_priority priority)</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : void *obj;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 13 : if (!pool-&gt;free_count ||</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 13 : ((pool-&gt;free_count &lt;= pool-&gt;reserved) &amp;&amp; priority == POOL_NORMAL))</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 12 : pool-&gt;free_count--;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 12 : obj = (void *) list_pop_(&amp;pool-&gt;free_list, 0);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 12 : assert(obj);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 12 : memset(obj, 0, pool-&gt;obj_size);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 12 : return obj;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : }</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 2 : void pool_free_object(struct pool *pool, void *obj)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 2 : pool-&gt;free_count++;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 2 : list_add_tail(&amp;pool-&gt;free_list,</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : (struct list_node *) (obj));</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : int pool_init(struct pool *pool, size_t obj_size, int count, int reserved)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> : : int i;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : if (obj_size &lt; sizeof(struct list_node))</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : obj_size = sizeof(struct list_node);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : assert(count &gt;= reserved);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : pool-&gt;buf = malloc(obj_size*count);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : if (!pool-&gt;buf)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : pool-&gt;obj_size = obj_size;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : pool-&gt;free_count = count;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : pool-&gt;reserved = reserved;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : list_head_init(&amp;pool-&gt;free_list);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 11 : for(i = 0; i &lt; count; i++)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 10 : list_add_tail(&amp;pool-&gt;free_list,</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 10 : (struct list_node *) (pool-&gt;buf + obj_size*i));</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/dummy-cpu.h.func-sort-c.html b/coverage-report/core/test/dummy-cpu.h.func-sort-c.html
new file mode 100644
index 0000000..0adde65
--- /dev/null
+++ b/coverage-report/core/test/dummy-cpu.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/dummy-cpu.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - dummy-cpu.h<span style="font-size: 80%;"> (<a href="dummy-cpu.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="dummy-cpu.h.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dummy-cpu.h.gcov.html#21">cpu_queue_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/dummy-cpu.h.func.html b/coverage-report/core/test/dummy-cpu.h.func.html
new file mode 100644
index 0000000..6477754
--- /dev/null
+++ b/coverage-report/core/test/dummy-cpu.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/dummy-cpu.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - dummy-cpu.h<span style="font-size: 80%;"> (<a href="dummy-cpu.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="dummy-cpu.h.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dummy-cpu.h.gcov.html#21">cpu_queue_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/dummy-cpu.h.gcov.html b/coverage-report/core/test/dummy-cpu.h.gcov.html
new file mode 100644
index 0000000..cd4c04a
--- /dev/null
+++ b/coverage-report/core/test/dummy-cpu.h.gcov.html
@@ -0,0 +1,120 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/dummy-cpu.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - dummy-cpu.h<span style="font-size: 80%;"> (source / <a href="dummy-cpu.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * A dummy cpu.h for tests.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * We don't want to include the real skiboot cpu.h, it's PPC-specific</a>
+<a name="7"><span class="lineNum"> 7 </span> : : */</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #ifndef __CPU_H</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #define __CPU_H</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : static unsigned int cpu_max_pir = 1;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : struct cpu_thread {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : unsigned int chip_id;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : };</a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct cpu_job *__cpu_queue_job(struct cpu_thread *cpu,</a>
+<a name="20"><span class="lineNum"> 20 </span> : : const char *name,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : void (*func)(void *data), void *data,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : bool no_return);</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : static inline struct cpu_job *cpu_queue_job(struct cpu_thread *cpu,</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : const char *name,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : void (*func)(void *data),</a>
+<a name="26"><span class="lineNum"> 26 </span> : : void *data)</a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return __cpu_queue_job(cpu, name, func, data, false);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : void cpu_wait_job(struct cpu_job *job, bool free_it);</a>
+<a name="31"><span class="lineNum"> 31 </span> : : void cpu_process_local_jobs(void);</a>
+<a name="32"><span class="lineNum"> 32 </span> : : struct cpu_job *cpu_queue_job_on_node(uint32_t chip_id,</a>
+<a name="33"><span class="lineNum"> 33 </span> : : const char *name,</a>
+<a name="34"><span class="lineNum"> 34 </span> : : void (*func)(void *data), void *data);</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #endif /* __CPU_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/index-sort-b.html b/coverage-report/core/test/index-sort-b.html
new file mode 100644
index 0000000..62a04bc
--- /dev/null
+++ b/coverage-report/core/test/index-sort-b.html
@@ -0,0 +1,455 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - core/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1844</td>
+ <td class="headerCovTableEntry">1899</td>
+ <td class="headerCovTableEntryHi">97.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">137</td>
+ <td class="headerCovTableEntry">154</td>
+ <td class="headerCovTableEntryMed">89.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-subpartition.c.gcov.html">run-flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">14 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused_noalloc.c.gcov.html">run-mem_region_release_unused_noalloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=94 height=10 alt="93.9%"><img src="../../snow.png" width=6 height=10 alt="93.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">93.9&nbsp;%</td>
+ <td class="coverNumHi">62 / 66</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">8 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pci-quirk.c.gcov.html">run-pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="70.4%"><img src="../../snow.png" width=30 height=10 alt="70.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">70.4&nbsp;%</td>
+ <td class="coverNumLo">19 / 27</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time-utils.c.gcov.html">run-time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pool.c.gcov.html">run-pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dummy-cpu.h.gcov.html">dummy-cpu.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_init.c.gcov.html">run-mem_region_init.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">80 / 80</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pel.c.gcov.html">run-pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc-speed.c.gcov.html">run-malloc-speed.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">28 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc.c.gcov.html">run-malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timer.c.gcov.html">run-timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=93 height=10 alt="92.6%"><img src="../../snow.png" width=7 height=10 alt="92.6%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.6&nbsp;%</td>
+ <td class="coverNumHi">25 / 27</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_reservations.c.gcov.html">run-mem_region_reservations.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">90 / 90</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_range_is_reserved.c.gcov.html">run-mem_range_is_reserved.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=89 height=10 alt="89.5%"><img src="../../snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">51 / 57</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-pr_fmt.c.gcov.html">run-console-log-pr_fmt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-trace.c.gcov.html">run-trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.5%"><img src="../../snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">195 / 196</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-api-test.c.gcov.html">run-api-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-nvram-format.c.gcov.html">run-nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.8%"><img src="../../snow.png" width=2 height=10 alt="97.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.8&nbsp;%</td>
+ <td class="coverNumHi">88 / 90</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timebase.c.gcov.html">run-timebase.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-device.c.gcov.html">run-device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.2%"><img src="../../snow.png" width=2 height=10 alt="98.2%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.2&nbsp;%</td>
+ <td class="coverNumHi">278 / 283</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-cpufeatures.c.gcov.html">run-cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">91 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region.c.gcov.html">run-mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.3%"><img src="../../snow.png" width=1 height=10 alt="99.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.3&nbsp;%</td>
+ <td class="coverNumHi">136 / 137</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-buf-overrun.c.gcov.html">run-console-log-buf-overrun.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">29 / 29</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-buddy.c.gcov.html">run-buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">44 / 44</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=31 height=10 alt="31.2%"><img src="../../snow.png" width=69 height=10 alt="31.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.2&nbsp;%</td>
+ <td class="coverNumLo">5 / 16</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_next.c.gcov.html">run-mem_region_next.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-msg.c.gcov.html">run-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.1%"><img src="../../snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">153 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused.c.gcov.html">run-mem_region_release_unused.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="96.3%"><img src="../../snow.png" width=4 height=10 alt="96.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.3&nbsp;%</td>
+ <td class="coverNumHi">79 / 82</td>
+ <td class="coverPerHi">90.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log.c.gcov.html">run-console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-bitmap.c.gcov.html">run-bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">38 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-firmware-versions.c.gcov.html">run-flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=81 height=10 alt="81.1%"><img src="../../snow.png" width=19 height=10 alt="81.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.1&nbsp;%</td>
+ <td class="coverNumMed">30 / 37</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/index-sort-f.html b/coverage-report/core/test/index-sort-f.html
new file mode 100644
index 0000000..fe12f90
--- /dev/null
+++ b/coverage-report/core/test/index-sort-f.html
@@ -0,0 +1,455 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - core/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1844</td>
+ <td class="headerCovTableEntry">1899</td>
+ <td class="headerCovTableEntryHi">97.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">137</td>
+ <td class="headerCovTableEntry">154</td>
+ <td class="headerCovTableEntryMed">89.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dummy-cpu.h.gcov.html">dummy-cpu.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=31 height=10 alt="31.2%"><img src="../../snow.png" width=69 height=10 alt="31.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.2&nbsp;%</td>
+ <td class="coverNumLo">5 / 16</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pci-quirk.c.gcov.html">run-pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="70.4%"><img src="../../snow.png" width=30 height=10 alt="70.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">70.4&nbsp;%</td>
+ <td class="coverNumLo">19 / 27</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-firmware-versions.c.gcov.html">run-flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=81 height=10 alt="81.1%"><img src="../../snow.png" width=19 height=10 alt="81.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.1&nbsp;%</td>
+ <td class="coverNumMed">30 / 37</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-nvram-format.c.gcov.html">run-nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.8%"><img src="../../snow.png" width=2 height=10 alt="97.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.8&nbsp;%</td>
+ <td class="coverNumHi">88 / 90</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused_noalloc.c.gcov.html">run-mem_region_release_unused_noalloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=94 height=10 alt="93.9%"><img src="../../snow.png" width=6 height=10 alt="93.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">93.9&nbsp;%</td>
+ <td class="coverNumHi">62 / 66</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">8 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timer.c.gcov.html">run-timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=93 height=10 alt="92.6%"><img src="../../snow.png" width=7 height=10 alt="92.6%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.6&nbsp;%</td>
+ <td class="coverNumHi">25 / 27</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused.c.gcov.html">run-mem_region_release_unused.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="96.3%"><img src="../../snow.png" width=4 height=10 alt="96.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.3&nbsp;%</td>
+ <td class="coverNumHi">79 / 82</td>
+ <td class="coverPerHi">90.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-subpartition.c.gcov.html">run-flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">14 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time-utils.c.gcov.html">run-time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pool.c.gcov.html">run-pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-api-test.c.gcov.html">run-api-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timebase.c.gcov.html">run-timebase.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-bitmap.c.gcov.html">run-bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">38 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-buddy.c.gcov.html">run-buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">44 / 44</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pel.c.gcov.html">run-pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-pr_fmt.c.gcov.html">run-console-log-pr_fmt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-cpufeatures.c.gcov.html">run-cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">91 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-buf-overrun.c.gcov.html">run-console-log-buf-overrun.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">29 / 29</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log.c.gcov.html">run-console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc-speed.c.gcov.html">run-malloc-speed.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">28 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-device.c.gcov.html">run-device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.2%"><img src="../../snow.png" width=2 height=10 alt="98.2%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.2&nbsp;%</td>
+ <td class="coverNumHi">278 / 283</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_next.c.gcov.html">run-mem_region_next.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc.c.gcov.html">run-malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region.c.gcov.html">run-mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.3%"><img src="../../snow.png" width=1 height=10 alt="99.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.3&nbsp;%</td>
+ <td class="coverNumHi">136 / 137</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-msg.c.gcov.html">run-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.1%"><img src="../../snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">153 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_init.c.gcov.html">run-mem_region_init.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">80 / 80</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_range_is_reserved.c.gcov.html">run-mem_range_is_reserved.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=89 height=10 alt="89.5%"><img src="../../snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">51 / 57</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_reservations.c.gcov.html">run-mem_region_reservations.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">90 / 90</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-trace.c.gcov.html">run-trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.5%"><img src="../../snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">195 / 196</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/index-sort-l.html b/coverage-report/core/test/index-sort-l.html
new file mode 100644
index 0000000..11b838e
--- /dev/null
+++ b/coverage-report/core/test/index-sort-l.html
@@ -0,0 +1,455 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - core/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1844</td>
+ <td class="headerCovTableEntry">1899</td>
+ <td class="headerCovTableEntryHi">97.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">137</td>
+ <td class="headerCovTableEntry">154</td>
+ <td class="headerCovTableEntryMed">89.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dummy-cpu.h.gcov.html">dummy-cpu.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=31 height=10 alt="31.2%"><img src="../../snow.png" width=69 height=10 alt="31.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.2&nbsp;%</td>
+ <td class="coverNumLo">5 / 16</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pci-quirk.c.gcov.html">run-pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="70.4%"><img src="../../snow.png" width=30 height=10 alt="70.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">70.4&nbsp;%</td>
+ <td class="coverNumLo">19 / 27</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-firmware-versions.c.gcov.html">run-flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=81 height=10 alt="81.1%"><img src="../../snow.png" width=19 height=10 alt="81.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.1&nbsp;%</td>
+ <td class="coverNumMed">30 / 37</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_range_is_reserved.c.gcov.html">run-mem_range_is_reserved.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=89 height=10 alt="89.5%"><img src="../../snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">51 / 57</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timer.c.gcov.html">run-timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=93 height=10 alt="92.6%"><img src="../../snow.png" width=7 height=10 alt="92.6%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.6&nbsp;%</td>
+ <td class="coverNumHi">25 / 27</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused_noalloc.c.gcov.html">run-mem_region_release_unused_noalloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=94 height=10 alt="93.9%"><img src="../../snow.png" width=6 height=10 alt="93.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">93.9&nbsp;%</td>
+ <td class="coverNumHi">62 / 66</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">8 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused.c.gcov.html">run-mem_region_release_unused.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="96.3%"><img src="../../snow.png" width=4 height=10 alt="96.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.3&nbsp;%</td>
+ <td class="coverNumHi">79 / 82</td>
+ <td class="coverPerHi">90.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-nvram-format.c.gcov.html">run-nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.8%"><img src="../../snow.png" width=2 height=10 alt="97.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.8&nbsp;%</td>
+ <td class="coverNumHi">88 / 90</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-msg.c.gcov.html">run-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.1%"><img src="../../snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">153 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-device.c.gcov.html">run-device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.2%"><img src="../../snow.png" width=2 height=10 alt="98.2%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.2&nbsp;%</td>
+ <td class="coverNumHi">278 / 283</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region.c.gcov.html">run-mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.3%"><img src="../../snow.png" width=1 height=10 alt="99.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.3&nbsp;%</td>
+ <td class="coverNumHi">136 / 137</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-trace.c.gcov.html">run-trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.5%"><img src="../../snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">195 / 196</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-api-test.c.gcov.html">run-api-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-subpartition.c.gcov.html">run-flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">14 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pool.c.gcov.html">run-pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timebase.c.gcov.html">run-timebase.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-pr_fmt.c.gcov.html">run-console-log-pr_fmt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log.c.gcov.html">run-console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time-utils.c.gcov.html">run-time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc-speed.c.gcov.html">run-malloc-speed.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">28 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-buf-overrun.c.gcov.html">run-console-log-buf-overrun.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">29 / 29</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-bitmap.c.gcov.html">run-bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">38 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_next.c.gcov.html">run-mem_region_next.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-buddy.c.gcov.html">run-buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">44 / 44</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pel.c.gcov.html">run-pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_init.c.gcov.html">run-mem_region_init.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">80 / 80</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_reservations.c.gcov.html">run-mem_region_reservations.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">90 / 90</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-cpufeatures.c.gcov.html">run-cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">91 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc.c.gcov.html">run-malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/index.html b/coverage-report/core/test/index.html
new file mode 100644
index 0000000..02a9121
--- /dev/null
+++ b/coverage-report/core/test/index.html
@@ -0,0 +1,455 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - core/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1844</td>
+ <td class="headerCovTableEntry">1899</td>
+ <td class="headerCovTableEntryHi">97.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">137</td>
+ <td class="headerCovTableEntry">154</td>
+ <td class="headerCovTableEntryMed">89.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dummy-cpu.h.gcov.html">dummy-cpu.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-api-test.c.gcov.html">run-api-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-bitmap.c.gcov.html">run-bitmap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">38 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-buddy.c.gcov.html">run-buddy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">44 / 44</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-buf-overrun.c.gcov.html">run-console-log-buf-overrun.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">29 / 29</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log-pr_fmt.c.gcov.html">run-console-log-pr_fmt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-console-log.c.gcov.html">run-console-log.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">21 / 21</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-cpufeatures.c.gcov.html">run-cpufeatures.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">91 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-device.c.gcov.html">run-device.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.2%"><img src="../../snow.png" width=2 height=10 alt="98.2%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.2&nbsp;%</td>
+ <td class="coverNumHi">278 / 283</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-firmware-versions.c.gcov.html">run-flash-firmware-versions.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=81 height=10 alt="81.1%"><img src="../../snow.png" width=19 height=10 alt="81.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.1&nbsp;%</td>
+ <td class="coverNumMed">30 / 37</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-flash-subpartition.c.gcov.html">run-flash-subpartition.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">14 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc-speed.c.gcov.html">run-malloc-speed.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">28 / 28</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-malloc.c.gcov.html">run-malloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">95 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_range_is_reserved.c.gcov.html">run-mem_range_is_reserved.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=89 height=10 alt="89.5%"><img src="../../snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">51 / 57</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region.c.gcov.html">run-mem_region.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.3%"><img src="../../snow.png" width=1 height=10 alt="99.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.3&nbsp;%</td>
+ <td class="coverNumHi">136 / 137</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_init.c.gcov.html">run-mem_region_init.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">80 / 80</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_next.c.gcov.html">run-mem_region_next.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused.c.gcov.html">run-mem_region_release_unused.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="96.3%"><img src="../../snow.png" width=4 height=10 alt="96.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.3&nbsp;%</td>
+ <td class="coverNumHi">79 / 82</td>
+ <td class="coverPerHi">90.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_release_unused_noalloc.c.gcov.html">run-mem_region_release_unused_noalloc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=94 height=10 alt="93.9%"><img src="../../snow.png" width=6 height=10 alt="93.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">93.9&nbsp;%</td>
+ <td class="coverNumHi">62 / 66</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">8 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-mem_region_reservations.c.gcov.html">run-mem_region_reservations.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">90 / 90</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-msg.c.gcov.html">run-msg.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.1%"><img src="../../snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">153 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-nvram-format.c.gcov.html">run-nvram-format.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.8%"><img src="../../snow.png" width=2 height=10 alt="97.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.8&nbsp;%</td>
+ <td class="coverNumHi">88 / 90</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pci-quirk.c.gcov.html">run-pci-quirk.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="70.4%"><img src="../../snow.png" width=30 height=10 alt="70.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">70.4&nbsp;%</td>
+ <td class="coverNumLo">19 / 27</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pel.c.gcov.html">run-pel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">52 / 52</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-pool.c.gcov.html">run-pool.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time-utils.c.gcov.html">run-time-utils.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timebase.c.gcov.html">run-timebase.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-timer.c.gcov.html">run-timer.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=93 height=10 alt="92.6%"><img src="../../snow.png" width=7 height=10 alt="92.6%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.6&nbsp;%</td>
+ <td class="coverNumHi">25 / 27</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-trace.c.gcov.html">run-trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=99 height=10 alt="99.5%"><img src="../../snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">195 / 196</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=31 height=10 alt="31.2%"><img src="../../snow.png" width=69 height=10 alt="31.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.2&nbsp;%</td>
+ <td class="coverNumLo">5 / 16</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-api-test.c.func-sort-c.html b/coverage-report/core/test/run-api-test.c.func-sort-c.html
new file mode 100644
index 0000000..aaac9bf
--- /dev/null
+++ b/coverage-report/core/test/run-api-test.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-api-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-api-test.c<span style="font-size: 80%;"> (<a href="run-api-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-api-test.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-api-test.c.gcov.html#19">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-api-test.c.func.html b/coverage-report/core/test/run-api-test.c.func.html
new file mode 100644
index 0000000..b7b30ce
--- /dev/null
+++ b/coverage-report/core/test/run-api-test.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-api-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-api-test.c<span style="font-size: 80%;"> (<a href="run-api-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-api-test.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-api-test.c.gcov.html#19">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-api-test.c.gcov.html b/coverage-report/core/test/run-api-test.c.gcov.html
new file mode 100644
index 0000000..ef9f284
--- /dev/null
+++ b/coverage-report/core/test/run-api-test.c.gcov.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-api-test.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-api-test.c<span style="font-size: 80%;"> (source / <a href="run-api-test.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2014-2016 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * For now it just validates that addresses passed are sane and test the</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * wrapper that validates addresses</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * Copyright 2016 IBM Corp.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;config.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;assert.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;opal-internal.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define __TEST__</a>
+<a name="20"><span class="lineNum"> 20 </span> : : unsigned long top_of_ram; /* Fake it here */</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : unsigned long addr = 0xd000000000000000;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : top_of_ram = 16ULL * 1024 * 1024 * 1024; /* 16 GB */</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : assert(opal_addr_valid((void *)addr) == false);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1 : addr = 0xc000000000000000;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : assert(opal_addr_valid((void *)addr) == true);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1 : addr = 0x0;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1 : assert(opal_addr_valid((void *)addr) == true);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1 : addr = ~0;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : assert(opal_addr_valid((void *)addr) == false);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : addr = top_of_ram + 1;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : assert(opal_addr_valid((void *)addr) == false);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-bitmap.c.func-sort-c.html b/coverage-report/core/test/run-bitmap.c.func-sort-c.html
new file mode 100644
index 0000000..bf9b606
--- /dev/null
+++ b/coverage-report/core/test/run-bitmap.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-bitmap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-bitmap.c<span style="font-size: 80%;"> (<a href="run-bitmap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-bitmap.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-bitmap.c.gcov.html#10">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-bitmap.c.func.html b/coverage-report/core/test/run-bitmap.c.func.html
new file mode 100644
index 0000000..eb7eaa8
--- /dev/null
+++ b/coverage-report/core/test/run-bitmap.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-bitmap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-bitmap.c<span style="font-size: 80%;"> (<a href="run-bitmap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-bitmap.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-bitmap.c.gcov.html#10">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-bitmap.c.gcov.html b/coverage-report/core/test/run-bitmap.c.gcov.html
new file mode 100644
index 0000000..972a690
--- /dev/null
+++ b/coverage-report/core/test/run-bitmap.c.gcov.html
@@ -0,0 +1,165 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-bitmap.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-bitmap.c<span style="font-size: 80%;"> (source / <a href="run-bitmap.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2017 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &quot;../bitmap.c&quot;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;assert.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : {</a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 1 : bitmap_t *map = malloc(sizeof(bitmap_elem_t));</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : int i;</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1 : memset(map, 0, sizeof(bitmap_elem_t));</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : assert(BITMAP_ELEMS(16) == (BITMAP_ELEMS(8)));</a>
+<a name="19"><span class="lineNum"> 19 </span> : : assert(BITMAP_ELEMS(128) == (BITMAP_ELEMS(64)*2));</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : assert(BITMAP_BYTES(64) == 8);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : assert(BITMAP_BYTES(128) == 16);</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : assert(BITMAP_BIT(1) == 0x1);</a>
+<a name="25"><span class="lineNum"> 25 </span> : : assert(BITMAP_BIT(2) == 0x2);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : assert(BITMAP_BIT(3) == 0x3);</a>
+<a name="27"><span class="lineNum"> 27 </span> : : assert(BITMAP_BIT(8) == 0x8);</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : assert(BITMAP_MASK(0) == 0x1);</a>
+<a name="30"><span class="lineNum"> 30 </span> : : assert(BITMAP_MASK(1) == 0x2);</a>
+<a name="31"><span class="lineNum"> 31 </span> : : assert(BITMAP_MASK(8) == 0x100);</a>
+<a name="32"><span class="lineNum"> 32 </span> : : assert(BITMAP_MASK(9) == 0x200);</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : assert(BITMAP_ELEM(1) == 0);</a>
+<a name="35"><span class="lineNum"> 35 </span> : : assert(BITMAP_ELEM(128) == BITMAP_ELEMS(128));</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : bitmap_set_bit(*map, 0);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : assert(*(unsigned long*)map == 0x1);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 0) == true);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1 : bitmap_clr_bit(*map, 0);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : assert(*(unsigned long*)map == 0x00);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : bitmap_set_bit(*map, 8);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : assert(*(unsigned long*)map == 0x100);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 0) == false);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 1) == false);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 2) == false);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 3) == false);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 4) == false);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 5) == false);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 6) == false);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 7) == false);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 8) == true);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 9) == false);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 10) == false);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 11) == false);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 12) == false);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 13) == false);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 14) == false);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 15) == false);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : assert(bitmap_find_one_bit(*map, 0, 16) == 8);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : bitmap_clr_bit(*map, 8);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : assert(bitmap_find_one_bit(*map, 0, 16) == -1);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : assert(*(unsigned long*)map == 0x00);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 8) == false);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 8 : bitmap_for_each_zero(*map, 7, i) {</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 7 : bitmap_set_bit(*map, i);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : }</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 8 : for (i = 0; i &lt; 7; i++)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 7 : assert(bitmap_tst_bit(*map, i) == true);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : assert(bitmap_tst_bit(*map, 8) == false);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : free(map);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-buddy.c.func-sort-c.html b/coverage-report/core/test/run-buddy.c.func-sort-c.html
new file mode 100644
index 0000000..d4b5250
--- /dev/null
+++ b/coverage-report/core/test/run-buddy.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-buddy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-buddy.c<span style="font-size: 80%;"> (<a href="run-buddy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">44</td>
+ <td class="headerCovTableEntry">44</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-buddy.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-buddy.c.gcov.html#19">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-buddy.c.gcov.html#9">zalloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-buddy.c.func.html b/coverage-report/core/test/run-buddy.c.func.html
new file mode 100644
index 0000000..5cc3968
--- /dev/null
+++ b/coverage-report/core/test/run-buddy.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-buddy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-buddy.c<span style="font-size: 80%;"> (<a href="run-buddy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">44</td>
+ <td class="headerCovTableEntry">44</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-buddy.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-buddy.c.gcov.html#19">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-buddy.c.gcov.html#9">zalloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-buddy.c.gcov.html b/coverage-report/core/test/run-buddy.c.gcov.html
new file mode 100644
index 0000000..fd95483
--- /dev/null
+++ b/coverage-report/core/test/run-buddy.c.gcov.html
@@ -0,0 +1,158 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-buddy.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-buddy.c<span style="font-size: 80%;"> (source / <a href="run-buddy.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">44</td>
+ <td class="headerCovTableEntry">44</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2016-2017 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;buddy.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;assert.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineCov"> 1 : static void *zalloc(size_t size)</span></a>
+<a name="12"><span class="lineNum"> 12 </span> : : {</a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 1 : return calloc(size, 1);</span></a>
+<a name="14"><span class="lineNum"> 14 </span> : : }</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;../buddy.c&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;../bitmap.c&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define BUDDY_ORDER 8</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : struct buddy *b;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : int i, a[10];</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : b = buddy_create(BUDDY_ORDER);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1 : assert(b);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : buddy_reserve(b, 127, 0);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : buddy_reserve(b, 0, 4);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1 : assert(buddy_reserve(b, 0, 4) == false);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 1 : a[0] = buddy_alloc(b, 0);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1 : assert(a[0] &gt;= 0);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : a[1] = buddy_alloc(b, 0);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 1 : assert(a[1] &gt;= 0);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : a[2] = buddy_alloc(b, 3);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : assert(a[2] &gt;= 0);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : a[3] = buddy_alloc(b, 4);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1 : assert(a[3] &gt;= 0);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : a[4] = buddy_alloc(b, 5);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : assert(a[4] &gt;= 0);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : a[5] = buddy_alloc(b, 4);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : assert(a[5] &gt;= 0);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : a[6] = buddy_alloc(b, 3);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : assert(a[6] &gt;= 0);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : a[7] = buddy_alloc(b, 2);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : assert(a[7] &gt;= 0);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : a[8] = buddy_alloc(b, 1);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : assert(a[8] &gt;= 0);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : a[9] = buddy_alloc(b, 8);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : assert(a[9] &lt; 0);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : buddy_free(b, a[0], 0);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : buddy_free(b, a[8], 1);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : buddy_free(b, a[1], 0);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : buddy_free(b, a[7], 2);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : buddy_free(b, a[2], 3);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : buddy_free(b, a[6], 3);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : buddy_free(b, a[3], 4);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : buddy_free(b, a[5], 4);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : buddy_free(b, a[4], 5);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : buddy_free(b, 127, 0);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : buddy_free(b, 0, 4);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 511 : for (i = 2; i &lt; buddy_map_size(b); i++)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 510 : assert(bitmap_tst_bit(b-&gt;map, i));</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : assert(!bitmap_tst_bit(b-&gt;map, 1));</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : buddy_destroy(b);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log-buf-overrun.c.func-sort-c.html b/coverage-report/core/test/run-console-log-buf-overrun.c.func-sort-c.html
new file mode 100644
index 0000000..abf37fd
--- /dev/null
+++ b/coverage-report/core/test/run-console-log-buf-overrun.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log-buf-overrun.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log-buf-overrun.c<span style="font-size: 80%;"> (<a href="run-console-log-buf-overrun.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">29</td>
+ <td class="headerCovTableEntry">29</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-console-log-buf-overrun.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-buf-overrun.c.gcov.html#52">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-buf-overrun.c.gcov.html#45">console_write</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-buf-overrun.c.gcov.html#23">mftb</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log-buf-overrun.c.func.html b/coverage-report/core/test/run-console-log-buf-overrun.c.func.html
new file mode 100644
index 0000000..d8d858c
--- /dev/null
+++ b/coverage-report/core/test/run-console-log-buf-overrun.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log-buf-overrun.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log-buf-overrun.c<span style="font-size: 80%;"> (<a href="run-console-log-buf-overrun.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">29</td>
+ <td class="headerCovTableEntry">29</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-console-log-buf-overrun.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-buf-overrun.c.gcov.html#45">console_write</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-buf-overrun.c.gcov.html#52">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-buf-overrun.c.gcov.html#23">mftb</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log-buf-overrun.c.gcov.html b/coverage-report/core/test/run-console-log-buf-overrun.c.gcov.html
new file mode 100644
index 0000000..51fdc6c
--- /dev/null
+++ b/coverage-report/core/test/run-console-log-buf-overrun.c.gcov.html
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log-buf-overrun.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log-buf-overrun.c<span style="font-size: 80%;"> (source / <a href="run-console-log-buf-overrun.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">29</td>
+ <td class="headerCovTableEntry">29</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2015-2016 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;string.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : unsigned long tb_hz = 512000000;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define __TEST__</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define CHECK_BUF_ASSERT(buf, str) \</a>
+<a name="18"><span class="lineNum"> 18 </span> : : assert(memcmp(buf, str, strlen(str)) == 0)</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define CHECK_ASSERT(str) \</a>
+<a name="21"><span class="lineNum"> 21 </span> : : CHECK_BUF_ASSERT(console_buffer, str)</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : int huge_tb;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 5 : static inline unsigned long mftb(void)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : {</a>
+<a name="27"><span class="lineNum"> 27 </span> : : /*</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * return huge value for TB that overrun tmp[16] buffer defined</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * in print_itoa().</a>
+<a name="30"><span class="lineNum"> 30 </span> : : */</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 5 : if (huge_tb)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1 : return 1223372515963611388;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : else</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 4 : return 42;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #include &quot;../../libc/include/stdio.h&quot;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #include &quot;../console-log.c&quot;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #include &quot;../../libc/stdio/snprintf.c&quot;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #include &quot;../../libc/stdio/vsnprintf.c&quot;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : char console_buffer[4096];</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct debug_descriptor debug_descriptor;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : bool flushed_to_drivers;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 5 : ssize_t console_write(bool flush_to_drivers, const void *buf, size_t count)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : {</a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 5 : flushed_to_drivers = flush_to_drivers;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 5 : memcpy(console_buffer, buf, count);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 5 : return count;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : unsigned long value = 0xffffffffffffffff;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : char *ptr = console_buffer;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : debug_descriptor.console_log_levels = 0x75;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /* Test for huge TB value. */</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : huge_tb = 1;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : prlog(PR_EMERG, &quot;Hello World&quot;);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : CHECK_ASSERT(&quot;[2389399445.123611388,0] Hello World&quot;);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : memset(console_buffer, 0, sizeof(console_buffer));</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /* Test for normal TB with huge unsigned long value */</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : huge_tb = 0;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : prlog(PR_EMERG, &quot;Hello World %lu&quot;, value);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : CHECK_ASSERT(&quot;[ 0.000000042,0] Hello World 18446744073709551615&quot;);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : printf(&quot;Hello World %lu&quot;, value);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : CHECK_ASSERT(&quot;[ 0.000000042,5] Hello World 18446744073709551615&quot;);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /*</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * Test string of size &gt; 320</a>
+<a name="80"><span class="lineNum"> 80 </span> : : *</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * core/console-log.c:vprlog() uses buffer[320] to print message</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * Try printing more than 320 bytes to test stack corruption.</a>
+<a name="83"><span class="lineNum"> 83 </span> : : * You would see Segmentation fault on stack corruption.</a>
+<a name="84"><span class="lineNum"> 84 </span> : : */</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : prlog(PR_EMERG, &quot;%330s&quot;, &quot;Hello World&quot;);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : memset(console_buffer, 0, sizeof(console_buffer));</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /*</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * Test boundary condition.</a>
+<a name="91"><span class="lineNum"> 91 </span> : : *</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * Print string of exact size 320. We should see string truncated</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * with console_buffer[319] == '\0'.</a>
+<a name="94"><span class="lineNum"> 94 </span> : : */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : memset(console_buffer, 0, sizeof(console_buffer));</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : prlog(PR_EMERG, &quot;%300s&quot;, &quot;Hello World&quot;);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : assert(console_buffer[319] == 0);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> : : /* compare truncated string */</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : ptr += 320 - strlen(&quot;Hello World&quot;);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : CHECK_BUF_ASSERT(ptr, &quot;Hello Worl&quot;);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log-pr_fmt.c.func-sort-c.html b/coverage-report/core/test/run-console-log-pr_fmt.c.func-sort-c.html
new file mode 100644
index 0000000..7350977
--- /dev/null
+++ b/coverage-report/core/test/run-console-log-pr_fmt.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log-pr_fmt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log-pr_fmt.c<span style="font-size: 80%;"> (<a href="run-console-log-pr_fmt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-console-log-pr_fmt.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-pr_fmt.c.gcov.html#37">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-pr_fmt.c.gcov.html#30">console_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-pr_fmt.c.gcov.html#14">mftb</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log-pr_fmt.c.func.html b/coverage-report/core/test/run-console-log-pr_fmt.c.func.html
new file mode 100644
index 0000000..14e7c06
--- /dev/null
+++ b/coverage-report/core/test/run-console-log-pr_fmt.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log-pr_fmt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log-pr_fmt.c<span style="font-size: 80%;"> (<a href="run-console-log-pr_fmt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-console-log-pr_fmt.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-pr_fmt.c.gcov.html#30">console_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-pr_fmt.c.gcov.html#37">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log-pr_fmt.c.gcov.html#14">mftb</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log-pr_fmt.c.gcov.html b/coverage-report/core/test/run-console-log-pr_fmt.c.gcov.html
new file mode 100644
index 0000000..8830481
--- /dev/null
+++ b/coverage-report/core/test/run-console-log-pr_fmt.c.gcov.html
@@ -0,0 +1,148 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log-pr_fmt.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log-pr_fmt.c<span style="font-size: 80%;"> (source / <a href="run-console-log-pr_fmt.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2015-2016 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;string.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define __TEST__</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : unsigned long tb_hz = 512000000;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 4 : static inline unsigned long mftb(void)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 4 : return 42;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : }</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define pr_fmt(f) &quot;PREFIX: &quot; f</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;../../libc/include/stdio.h&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;../console-log.c&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &quot;../../libc/stdio/snprintf.c&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &quot;../../libc/stdio/vsnprintf.c&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : struct debug_descriptor debug_descriptor;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : bool flushed_to_drivers;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : char console_buffer[4096];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 3 : ssize_t console_write(bool flush_to_drivers, const void *buf, size_t count)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 3 : flushed_to_drivers = flush_to_drivers;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 3 : memcpy(console_buffer, buf, count);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 3 : return count;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : }</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : debug_descriptor.console_log_levels = 0x75;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : prlog(PR_EMERG, &quot;Hello World&quot;);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : assert(strcmp(console_buffer, &quot;[ 0.000000042,0] PREFIX: Hello World&quot;) == 0);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : assert(flushed_to_drivers==true);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : memset(console_buffer, 0, sizeof(console_buffer));</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : // Below log level</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : prlog(PR_TRACE, &quot;Hello World&quot;);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : assert(console_buffer[0] == 0);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : // Should not be flushed to console</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : prlog(PR_DEBUG, &quot;Hello World&quot;);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : assert(strcmp(console_buffer, &quot;[ 0.000000042,7] PREFIX: Hello World&quot;) == 0);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : assert(flushed_to_drivers==false);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : printf(&quot;Hello World&quot;);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : assert(strcmp(console_buffer, &quot;[ 0.000000042,5] PREFIX: Hello World&quot;) == 0);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : assert(flushed_to_drivers==true);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log.c.func-sort-c.html b/coverage-report/core/test/run-console-log.c.func-sort-c.html
new file mode 100644
index 0000000..74893a5
--- /dev/null
+++ b/coverage-report/core/test/run-console-log.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log.c<span style="font-size: 80%;"> (<a href="run-console-log.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-console-log.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log.c.gcov.html#37">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log.c.gcov.html#30">console_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log.c.gcov.html#16">mftb</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log.c.func.html b/coverage-report/core/test/run-console-log.c.func.html
new file mode 100644
index 0000000..aa30de6
--- /dev/null
+++ b/coverage-report/core/test/run-console-log.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log.c<span style="font-size: 80%;"> (<a href="run-console-log.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-console-log.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log.c.gcov.html#30">console_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log.c.gcov.html#37">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-console-log.c.gcov.html#16">mftb</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-console-log.c.gcov.html b/coverage-report/core/test/run-console-log.c.gcov.html
new file mode 100644
index 0000000..8eb7c34
--- /dev/null
+++ b/coverage-report/core/test/run-console-log.c.gcov.html
@@ -0,0 +1,148 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-console-log.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-console-log.c<span style="font-size: 80%;"> (source / <a href="run-console-log.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2014-2016 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;string.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define __TEST__</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define _printf printf</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : unsigned long tb_hz = 512000000;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 4 : static inline unsigned long mftb(void)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 4 : return 42;</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : }</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : int _printf(const char* fmt, ...);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &quot;../console-log.c&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : struct debug_descriptor debug_descriptor;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : bool flushed_to_drivers;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : char console_buffer[4096];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 3 : ssize_t console_write(bool flush_to_drivers, const void *buf, size_t count)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 3 : flushed_to_drivers = flush_to_drivers;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 3 : memcpy(console_buffer, buf, count);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 3 : return count;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : }</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : debug_descriptor.console_log_levels = 0x75;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : prlog(PR_EMERG, &quot;Hello World&quot;);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : assert(strcmp(console_buffer, &quot;[ 0.000000042,0] Hello World&quot;) == 0);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : assert(flushed_to_drivers==true);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : memset(console_buffer, 0, sizeof(console_buffer));</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : // Below log level</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : prlog(PR_TRACE, &quot;Hello World&quot;);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : assert(console_buffer[0] == 0);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : // Should not be flushed to console</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : prlog(PR_DEBUG, &quot;Hello World&quot;);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : assert(strcmp(console_buffer, &quot;[ 0.000000042,7] Hello World&quot;) == 0);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : assert(flushed_to_drivers==false);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : printf(&quot;Hello World&quot;);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : assert(strcmp(console_buffer, &quot;[ 0.000000042,5] Hello World&quot;) == 0);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : assert(flushed_to_drivers==true);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-cpufeatures.c.func-sort-c.html b/coverage-report/core/test/run-cpufeatures.c.func-sort-c.html
new file mode 100644
index 0000000..b496d98
--- /dev/null
+++ b/coverage-report/core/test/run-cpufeatures.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-cpufeatures.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-cpufeatures.c<span style="font-size: 80%;"> (<a href="run-cpufeatures.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-cpufeatures.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-cpufeatures.c.gcov.html#42">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-cpufeatures.c.gcov.html#36">mfspr</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-cpufeatures.c.gcov.html#15">fake_is_rodata</a></td>
+ <td class="coverFnHi">4484</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-cpufeatures.c.func.html b/coverage-report/core/test/run-cpufeatures.c.func.html
new file mode 100644
index 0000000..657759d
--- /dev/null
+++ b/coverage-report/core/test/run-cpufeatures.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-cpufeatures.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-cpufeatures.c<span style="font-size: 80%;"> (<a href="run-cpufeatures.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-cpufeatures.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-cpufeatures.c.gcov.html#15">fake_is_rodata</a></td>
+ <td class="coverFnHi">4484</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-cpufeatures.c.gcov.html#42">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-cpufeatures.c.gcov.html#36">mfspr</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-cpufeatures.c.gcov.html b/coverage-report/core/test/run-cpufeatures.c.gcov.html
new file mode 100644
index 0000000..498650a
--- /dev/null
+++ b/coverage-report/core/test/run-cpufeatures.c.gcov.html
@@ -0,0 +1,229 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-cpufeatures.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-cpufeatures.c<span style="font-size: 80%;"> (source / <a href="run-cpufeatures.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2019 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : /* Override this for testing. */</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define is_rodata(p) fake_is_rodata(p)</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : char __rodata_start[16];</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define __rodata_end (__rodata_start + sizeof(__rodata_start))</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 4484 : static inline bool fake_is_rodata(const void *p)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 4484 : return ((char *)p &gt;= __rodata_start &amp;&amp; (char *)p &lt; __rodata_end);</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : }</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define zalloc(bytes) calloc((bytes), 1)</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &quot;../device.c&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;assert.h&gt;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &quot;../../test/dt_common.c&quot;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : #define __TEST__</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : static inline unsigned long mfspr(unsigned int spr);</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : #include &lt;ccan/str/str.c&gt;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #include &quot;../cpufeatures.c&quot;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : static unsigned long fake_pvr = PVR_TYPE_P8;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 11 : static inline unsigned long mfspr(unsigned int spr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 11 : assert(spr == SPR_PVR);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 11 : return fake_pvr;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct dt_node *dt_root;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, true);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P8E &lt;&lt; 16) | 0x100; // P8E DD1.0</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;) == 0);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) == 0);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P8E &lt;&lt; 16) | 0x200; // P8E DD2.0</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;) == 0);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) == 0);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P8 &lt;&lt; 16) | 0x100; // P8 DD1.0</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;) == 0);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) == 0);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P8 &lt;&lt; 16) | 0x200; // P8 DD2.0</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;) == 0);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) == 0);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P8NVL &lt;&lt; 16) | 0x100; // P8NVL DD1.0</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;) == 0);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) == 0);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P9 &lt;&lt; 16) | 0x200; // P9 DD2.0</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;));</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) == 0);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P9 &lt;&lt; 16) | 0x201; // P9 DD2.1</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;));</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) == 0);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P9 &lt;&lt; 16) | 0x202; // P9 DD2.2</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;));</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) != 0);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) != 0);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P9 &lt;&lt; 16) | 0x203; // P9 DD2.3</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;));</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) != 0);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : fake_pvr = (PVR_TYPE_P9P &lt;&lt; 16) | 0x100; // P9P DD1.0</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : dt_add_cpufeatures(dt_root);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 1 : dump_dt(dt_root, 0, false);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/mmu-radix&quot;));</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist&quot;) != 0);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(dt_root, &quot;cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug&quot;) == 0);</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 1 : exit(EXIT_SUCCESS);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-device.c.func-sort-c.html b/coverage-report/core/test/run-device.c.func-sort-c.html
new file mode 100644
index 0000000..e35ce78
--- /dev/null
+++ b/coverage-report/core/test/run-device.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-device.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-device.c<span style="font-size: 80%;"> (<a href="run-device.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">278</td>
+ <td class="headerCovTableEntry">283</td>
+ <td class="headerCovTableEntryHi">98.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-device.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#91">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#80">props_to_fix</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#26">check_path</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#38">build_tree</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#55">is_sorted</a></td>
+ <td class="coverFnHi">179</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#13">fake_is_rodata</a></td>
+ <td class="coverFnHi">341</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-device.c.func.html b/coverage-report/core/test/run-device.c.func.html
new file mode 100644
index 0000000..e8256e6
--- /dev/null
+++ b/coverage-report/core/test/run-device.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-device.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-device.c<span style="font-size: 80%;"> (<a href="run-device.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">278</td>
+ <td class="headerCovTableEntry">283</td>
+ <td class="headerCovTableEntryHi">98.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-device.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#38">build_tree</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#26">check_path</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#13">fake_is_rodata</a></td>
+ <td class="coverFnHi">341</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#55">is_sorted</a></td>
+ <td class="coverFnHi">179</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#91">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-device.c.gcov.html#80">props_to_fix</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-device.c.gcov.html b/coverage-report/core/test/run-device.c.gcov.html
new file mode 100644
index 0000000..77e12ed
--- /dev/null
+++ b/coverage-report/core/test/run-device.c.gcov.html
@@ -0,0 +1,556 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-device.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-device.c<span style="font-size: 80%;"> (source / <a href="run-device.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">278</td>
+ <td class="headerCovTableEntry">283</td>
+ <td class="headerCovTableEntryHi">98.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2012-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : /* Override this for testing. */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #define is_rodata(p) fake_is_rodata(p)</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : char __rodata_start[16];</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define __rodata_end (__rodata_start + sizeof(__rodata_start))</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 341 : static inline bool fake_is_rodata(const void *p)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 341 : return ((char *)p &gt;= __rodata_start &amp;&amp; (char *)p &lt; __rodata_end);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define zalloc(bytes) calloc((bytes), 1)</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;../device.c&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &lt;assert.h&gt;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &quot;../../test/dt_common.c&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : const char *prop_to_fix[] = {&quot;something&quot;, NULL};</a>
+<a name="26"><span class="lineNum"> 26 </span> : : const char **props_to_fix(struct dt_node *node);</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 10 : static void check_path(const struct dt_node *node, const char * expected_path)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : char * path;</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 10 : path = dt_get_path(node);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 10 : if (strcmp(path, expected_path) != 0) {</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : printf(&quot;check_path: expected %s, got %s\n&quot;, expected_path, path);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 10 : assert(strcmp(path, expected_path) == 0);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 10 : free(path);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /* constructs a random nodes only device tree */</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 26 : static void build_tree(int max_depth, int min_depth, struct dt_node *parent)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> : : char name[64];</a>
+<a name="43"><span class="lineNum"> 43 </span> : : int i;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 111 : for (i = 0; i &lt; max_depth; i++) {</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct dt_node *new;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 85 : snprintf(name, sizeof name, &quot;prefix@%.8x&quot;, rand());</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 85 : new = dt_new(parent, name);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 85 : if(max_depth &gt; min_depth)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 25 : build_tree(max_depth - 1, min_depth, new);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 26 : }</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 179 : static bool is_sorted(const struct dt_node *root)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 179 : struct dt_node *end = list_tail(&amp;root-&gt;children, struct dt_node, list);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : struct dt_node *node;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 355 : dt_for_each_child(root, node) {</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 176 : struct dt_node *next =</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 176 : list_entry(node-&gt;list.next, struct dt_node, list);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : /* current node must be &quot;less than&quot; the next node */</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 176 : if (node != end &amp;&amp; dt_cmp_subnodes(node, next) != -1) {</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : printf(&quot;nodes '%s' and '%s' out of order\n&quot;,</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : node-&gt;name, next-&gt;name);</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : }</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 176 : if (!is_sorted(node))</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 179 : return true;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : /*handler for phandle fixup test */</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 6 : const char **props_to_fix(struct dt_node *node)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : const struct dt_property *prop;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 6 : prop = dt_find_property(node, &quot;something&quot;);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 6 : if (prop)</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 2 : return prop_to_fix;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 4 : return NULL;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : }</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : {</a>
+<a name="95"><span class="lineNum"> 95 </span> : : struct dt_node *root, *other_root, *c1, *c2, *c2_c, *gc1, *gc2, *gc3, *ggc1, *ggc2;</a>
+<a name="96"><span class="lineNum"> 96 </span> : : struct dt_node *addrs, *addr1, *addr2;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : struct dt_node *i, *subtree, *ev1, *ut1, *ut2;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : const struct dt_property *p;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : struct dt_property *p2;</a>
+<a name="100"><span class="lineNum"> 100 </span> : : unsigned int n;</a>
+<a name="101"><span class="lineNum"> 101 </span> : : char *s;</a>
+<a name="102"><span class="lineNum"> 102 </span> : : size_t sz;</a>
+<a name="103"><span class="lineNum"> 103 </span> : : u32 phandle, ev1_ph, new_prop_ph;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : root = dt_new_root(&quot;&quot;);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;root-&gt;properties, struct dt_property, list));</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : check_path(root, &quot;/&quot;);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : c1 = dt_new_check(root, &quot;c1&quot;);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;c1-&gt;properties, struct dt_property, list));</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : check_path(c1, &quot;/c1&quot;);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;c1&quot;) == c1);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/c1&quot;) == c1);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : assert(dt_new(root, &quot;c1&quot;) == NULL);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : c2 = dt_new(root, &quot;c2&quot;);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : c2_c = dt_new_check(root, &quot;c2&quot;);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : assert(c2 == c2_c);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;c2-&gt;properties, struct dt_property, list));</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : check_path(c2, &quot;/c2&quot;);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;c2&quot;) == c2);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/c2&quot;) == c2);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : gc1 = dt_new(c1, &quot;gc1&quot;);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;gc1-&gt;properties, struct dt_property, list));</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : check_path(gc1, &quot;/c1/gc1&quot;);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;gc1&quot;) == gc1);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/c1/gc1&quot;) == gc1);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : gc2 = dt_new(c1, &quot;gc2&quot;);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;gc2-&gt;properties, struct dt_property, list));</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : check_path(gc2, &quot;/c1/gc2&quot;);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;gc2&quot;) == gc2);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/c1/gc2&quot;) == gc2);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : gc3 = dt_new(c1, &quot;gc3&quot;);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;gc3-&gt;properties, struct dt_property, list));</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : check_path(gc3, &quot;/c1/gc3&quot;);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;gc3&quot;) == gc3);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/c1/gc3&quot;) == gc3);</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1 : ggc1 = dt_new(gc1, &quot;ggc1&quot;);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;ggc1-&gt;properties, struct dt_property, list));</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : check_path(ggc1, &quot;/c1/gc1/ggc1&quot;);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;ggc1&quot;) == ggc1);</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/c1/gc1/ggc1&quot;) == ggc1);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 1 : addrs = dt_new(root, &quot;addrs&quot;);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;addrs-&gt;properties, struct dt_property, list));</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : check_path(addrs, &quot;/addrs&quot;);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;addrs&quot;) == addrs);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/addrs&quot;) == addrs);</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : addr1 = dt_new_addr(addrs, &quot;addr&quot;, 0x1337);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;addr1-&gt;properties, struct dt_property, list));</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 1 : check_path(addr1, &quot;/addrs/addr@1337&quot;);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;addr@1337&quot;) == addr1);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name_addr(root, &quot;addr&quot;, 0x1337) == addr1);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/addrs/addr@1337&quot;) == addr1);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : assert(dt_new_addr(addrs, &quot;addr&quot;, 0x1337) == NULL);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 1 : addr2 = dt_new_2addr(addrs, &quot;2addr&quot;, 0xdead, 0xbeef);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 1 : assert(!list_top(&amp;addr2-&gt;properties, struct dt_property, list));</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 1 : check_path(addr2, &quot;/addrs/2addr@dead,beef&quot;);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 1 : assert(dt_find_by_name(root, &quot;2addr@dead,beef&quot;) == addr2);</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 1 : assert(dt_find_by_path(root, &quot;/addrs/2addr@dead,beef&quot;) == addr2);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 1 : assert(dt_new_2addr(addrs, &quot;2addr&quot;, 0xdead, 0xbeef) == NULL);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : /* Test walking the tree, checking and setting values */</a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 10 : for (n = 0, i = dt_first(root); i; i = dt_next(root, i), n++) {</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 9 : assert(!list_top(&amp;i-&gt;properties, struct dt_property, list));</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 9 : dt_add_property_cells(i, &quot;visited&quot;, 1);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : }</a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 1 : assert(n == 9);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 10 : for (n = 0, i = dt_first(root); i; i = dt_next(root, i), n++) {</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 9 : p = list_top(&amp;i-&gt;properties, struct dt_property, list);</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 9 : assert(strcmp(p-&gt;name, &quot;visited&quot;) == 0);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 9 : assert(p-&gt;len == sizeof(u32));</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 9 : assert(fdt32_to_cpu(*(u32 *)p-&gt;prop) == 1);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : }</a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 1 : assert(n == 9);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : /* Test cells */</a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c1, &quot;some-property&quot;, 1, 2, 3);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : p = dt_find_property(c1, &quot;some-property&quot;);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 1 : assert(strcmp(p-&gt;name, &quot;some-property&quot;) == 0);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 1 : assert(p-&gt;len == sizeof(u32) * 3);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 1 : assert(fdt32_to_cpu(*(u32 *)p-&gt;prop) == 1);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_cell(c1, &quot;some-property&quot;, 0) == 1);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 1 : assert(fdt32_to_cpu(*((u32 *)p-&gt;prop + 1)) == 2);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_cell(c1, &quot;some-property&quot;, 1) == 2);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 1 : assert(fdt32_to_cpu(*((u32 *)p-&gt;prop + 2)) == 3);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_cell_def(c1, &quot;some-property&quot;, 2, 42) == 3);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_cell_def(c1, &quot;not-a-property&quot;, 2, 42) == 42);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> : : /* Test u64s */</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 1 : dt_add_property_u64s(c2, &quot;some-property&quot;, (2LL &lt;&lt; 33), (3LL &lt;&lt; 33), (4LL &lt;&lt; 33));</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 1 : p = dt_find_property(c2, &quot;some-property&quot;);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 1 : assert(p-&gt;len == sizeof(u64) * 3);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 1 : assert(fdt64_to_cpu(*(u64 *)p-&gt;prop) == (2LL &lt;&lt; 33));</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 1 : assert(fdt64_to_cpu(*((u64 *)p-&gt;prop + 1)) == (3LL &lt;&lt; 33));</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 1 : assert(fdt64_to_cpu(*((u64 *)p-&gt;prop + 2)) == (4LL &lt;&lt; 33));</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> : : /* Test u32/u64 get defaults */</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_u32_def(c1, &quot;u32&quot;, 42) == 42);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c1, &quot;u32&quot;, 1337);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_u32_def(c1, &quot;u32&quot;, 42) == 1337);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_u32(c1, &quot;u32&quot;) == 1337);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_u64_def(c1, &quot;u64&quot;, (42LL &lt;&lt; 42)) == (42LL &lt;&lt; 42));</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 1 : dt_add_property_u64s(c1, &quot;u64&quot;, (1337LL &lt;&lt; 42));</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_u64_def(c1, &quot;u64&quot;, (42LL &lt;&lt; 42)) == (1337LL &lt;&lt; 42));</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_u64(c1, &quot;u64&quot;) == (1337LL &lt;&lt; 42));</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : </a>
+<a name="219"><span class="lineNum"> 219 </span> : : /* Test freeing a single node */</a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 1 : assert(!list_empty(&amp;gc1-&gt;children));</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : dt_free(ggc1);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 1 : assert(list_empty(&amp;gc1-&gt;children));</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> : : /* Test rodata logic. */</a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1 : assert(!is_rodata(&quot;hello&quot;));</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1 : assert(is_rodata(__rodata_start));</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 1 : strcpy(__rodata_start, &quot;name&quot;);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 1 : ggc1 = dt_new(root, __rodata_start);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 1 : assert(ggc1-&gt;name == __rodata_start);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /* Test string node. */</a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : dt_add_property_string(ggc1, &quot;somestring&quot;, &quot;someval&quot;);</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 1 : assert(dt_has_node_property(ggc1, &quot;somestring&quot;, &quot;someval&quot;));</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 1 : assert(!dt_has_node_property(ggc1, &quot;somestrin&quot;, &quot;someval&quot;));</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 1 : assert(!dt_has_node_property(ggc1, &quot;somestring&quot;, &quot;someva&quot;));</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 1 : assert(!dt_has_node_property(ggc1, &quot;somestring&quot;, &quot;somevale&quot;));</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : /* Test nstr, which allows for non-null-terminated inputs */</a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 1 : dt_add_property_nstr(ggc1, &quot;nstring&quot;, &quot;somevalue_long&quot;, 7);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 1 : assert(dt_has_node_property(ggc1, &quot;nstring&quot;, &quot;someval&quot;));</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 1 : assert(!dt_has_node_property(ggc1, &quot;nstring&quot;, &quot;someva&quot;));</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 1 : assert(!dt_has_node_property(ggc1, &quot;nstring&quot;, &quot;somevalue_long&quot;));</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : </a>
+<a name="244"><span class="lineNum"> 244 </span> : : /* Test multiple strings */</a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 1 : dt_add_property_strings(ggc1, &quot;somestrings&quot;,</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : &quot;These&quot;, &quot;are&quot;, &quot;strings!&quot;);</a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 1 : p = dt_find_property(ggc1, &quot;somestrings&quot;);</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 1 : assert(p-&gt;len == sizeof(char) * (6 + 4 + 9));</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 1 : s = (char *)p-&gt;prop;</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 1 : assert(strcmp(s, &quot;These&quot;) == 0);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 1 : assert(strlen(s) == 5);</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 1 : s += 6;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 1 : assert(strcmp(s, &quot;are&quot;) == 0);</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 1 : assert(strlen(s) == 3);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 1 : s += 4;</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 1 : assert(strcmp(s, &quot;strings!&quot;) == 0);</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 1 : assert(strlen(s) == 8);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 1 : s += 9;</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 1 : assert(s == (char *)p-&gt;prop + p-&gt;len);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 1 : assert(dt_prop_find_string(p, &quot;These&quot;));</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : /* dt_prop_find_string is case insensitve */</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 1 : assert(dt_prop_find_string(p, &quot;ARE&quot;));</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 1 : assert(!dt_prop_find_string(p, &quot;integers!&quot;));</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : /* And always returns false for NULL properties */</a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 1 : assert(!dt_prop_find_string(NULL, &quot;anything!&quot;));</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> : : /* Test more get/get_def varieties */</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_def(c1, &quot;does-not-exist&quot;, NULL) == NULL);</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 1 : sz = 0xbad;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_def_size(c1, &quot;does-not-exist&quot;, NULL, &amp;sz) == NULL);</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 1 : assert(sz == 0);</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 1 : dt_add_property_string(c1, &quot;another-property&quot;, &quot;xyzzy&quot;);</span></a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_def(c1, &quot;another-property&quot;, NULL) != NULL);</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 1 : assert(strcmp(dt_prop_get(c1, &quot;another-property&quot;), &quot;xyzzy&quot;) == 0);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 1 : n = 0xbad;</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_def_size(c1, &quot;another-property&quot;, NULL, &amp;sz) != NULL);</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 1 : assert(sz == strlen(&quot;xyzzy&quot;) + 1);</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> : : /* Test resizing property. */</a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 1 : p = p2 = __dt_find_property(c1, &quot;some-property&quot;);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 1 : n = p2-&gt;len;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 3 : while (p2 == p) {</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 2 : n *= 2;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 2 : dt_resize_property(&amp;p2, n);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : }</a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 1 : assert(dt_find_property(c1, &quot;some-property&quot;) == p2);</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 1 : list_check(&amp;c1-&gt;properties, &quot;properties after resizing&quot;);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 1 : dt_del_property(c1, p2);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 1 : list_check(&amp;c1-&gt;properties, &quot;properties after delete&quot;);</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> : : /* No leaks for valgrind! */</a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 1 : dt_free(root);</span></a>
+<a name="297"><span class="lineNum"> 297 </span> : : </a>
+<a name="298"><span class="lineNum"> 298 </span> : : /* Test compatible and chip id. */</a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 1 : root = dt_new_root(&quot;&quot;);</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : </a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 1 : c1 = dt_new(root, &quot;chip1&quot;);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c1, &quot;ibm,chip-id&quot;, 0xcafe);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 1 : assert(dt_get_chip_id(c1) == 0xcafe);</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 1 : dt_add_property_strings(c1, &quot;compatible&quot;,</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : &quot;specific-fake-chip&quot;,</a>
+<a name="306"><span class="lineNum"> 306 </span> : : &quot;generic-fake-chip&quot;);</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 1 : assert(dt_node_is_compatible(c1, &quot;specific-fake-chip&quot;));</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 1 : assert(dt_node_is_compatible(c1, &quot;generic-fake-chip&quot;));</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 1 : c2 = dt_new(root, &quot;chip2&quot;);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c2, &quot;ibm,chip-id&quot;, 0xbeef);</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 1 : assert(dt_get_chip_id(c2) == 0xbeef);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 1 : dt_add_property_strings(c2, &quot;compatible&quot;,</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : &quot;specific-fake-bus&quot;,</a>
+<a name="315"><span class="lineNum"> 315 </span> : : &quot;generic-fake-bus&quot;);</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 1 : gc1 = dt_new(c1, &quot;coprocessor1&quot;);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 1 : dt_add_property_strings(gc1, &quot;compatible&quot;,</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : &quot;specific-fake-coprocessor&quot;);</a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 1 : gc2 = dt_new(gc1, &quot;coprocessor2&quot;);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 1 : dt_add_property_strings(gc2, &quot;compatible&quot;,</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : &quot;specific-fake-coprocessor&quot;);</a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 1 : gc3 = dt_new(c1, &quot;coprocessor3&quot;);</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 1 : dt_add_property_strings(gc3, &quot;compatible&quot;,</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : &quot;specific-fake-coprocessor&quot;);</a>
+<a name="326"><span class="lineNum"> 326 </span> : : </a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(root, NULL, &quot;generic-fake-bus&quot;) == c2);</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(root, c2, &quot;generic-fake-bus&quot;) == NULL);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> : : /* we can find all compatible nodes */</a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(c1, NULL, &quot;specific-fake-coprocessor&quot;) == gc1);</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(c1, gc1, &quot;specific-fake-coprocessor&quot;) == gc2);</span></a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(c1, gc2, &quot;specific-fake-coprocessor&quot;) == gc3);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(c1, gc3, &quot;specific-fake-coprocessor&quot;) == NULL);</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(root, NULL, &quot;specific-fake-coprocessor&quot;) == gc1);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(root, gc1, &quot;specific-fake-coprocessor&quot;) == gc2);</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(root, gc2, &quot;specific-fake-coprocessor&quot;) == gc3);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node(root, gc3, &quot;specific-fake-coprocessor&quot;) == NULL);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : </a>
+<a name="341"><span class="lineNum"> 341 </span> : : /* we can find the coprocessor once on the cpu */</a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node_on_chip(root,</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : NULL,</a>
+<a name="344"><span class="lineNum"> 344 </span> : : &quot;specific-fake-coprocessor&quot;,</a>
+<a name="345"><span class="lineNum"> 345 </span> : : 0xcafe) == gc1);</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node_on_chip(root,</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : gc1,</a>
+<a name="348"><span class="lineNum"> 348 </span> : : &quot;specific-fake-coprocessor&quot;,</a>
+<a name="349"><span class="lineNum"> 349 </span> : : 0xcafe) == gc2);</a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node_on_chip(root,</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : gc2,</a>
+<a name="352"><span class="lineNum"> 352 </span> : : &quot;specific-fake-coprocessor&quot;,</a>
+<a name="353"><span class="lineNum"> 353 </span> : : 0xcafe) == gc3);</a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node_on_chip(root,</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : gc3,</a>
+<a name="356"><span class="lineNum"> 356 </span> : : &quot;specific-fake-coprocessor&quot;,</a>
+<a name="357"><span class="lineNum"> 357 </span> : : 0xcafe) == NULL);</a>
+<a name="358"><span class="lineNum"> 358 </span> : : </a>
+<a name="359"><span class="lineNum"> 359 </span> : : /* we can't find the coprocessor on the bus */</a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 1 : assert(dt_find_compatible_node_on_chip(root,</span></a>
+<a name="361"><span class="lineNum"> 361 </span> : : NULL,</a>
+<a name="362"><span class="lineNum"> 362 </span> : : &quot;specific-fake-coprocessor&quot;,</a>
+<a name="363"><span class="lineNum"> 363 </span> : : 0xbeef) == NULL);</a>
+<a name="364"><span class="lineNum"> 364 </span> : : </a>
+<a name="365"><span class="lineNum"> 365 </span> : : /* Test phandles. We override the automatically generated one. */</a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1 : phandle = 0xf00;</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 1 : dt_add_property(gc3, &quot;phandle&quot;, (const void *)&amp;phandle, 4);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 1 : assert(last_phandle == 0xf00);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 1 : assert(dt_find_by_phandle(root, 0xf00) == gc3);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 1 : assert(dt_find_by_phandle(root, 0xf0f) == NULL);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : </a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 1 : dt_free(root);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> : : /* basic sorting */</a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 1 : root = dt_new_root(&quot;rewt&quot;);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 1 : dt_new(root, &quot;a@1&quot;);</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 1 : dt_new(root, &quot;a@2&quot;);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 1 : dt_new(root, &quot;a@3&quot;);</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 1 : dt_new(root, &quot;a@4&quot;);</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 1 : dt_new(root, &quot;b@4&quot;);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 1 : dt_new(root, &quot;c@4&quot;);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 1 : assert(is_sorted(root));</span></a>
+<a name="384"><span class="lineNum"> 384 </span> : : </a>
+<a name="385"><span class="lineNum"> 385 </span> : : /* Now test dt_attach_root */</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 1 : other_root = dt_new_root(&quot;other_root&quot;);</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 1 : dt_new(other_root, &quot;d@1&quot;);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 1 : assert(dt_attach_root(root, other_root));</span></a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 1 : other_root = dt_new_root(&quot;other_root&quot;);</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 1 : assert(!dt_attach_root(root, other_root));</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 1 : dt_free(root);</span></a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> : : /* Test child node sorting */</a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 1 : root = dt_new_root(&quot;test root&quot;);</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineCov"> 1 : build_tree(5, 3, root);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 1 : if (!is_sorted(root)) {</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : dump_dt(root, 1, false);</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : }</a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 1 : assert(is_sorted(root));</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : </a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 1 : dt_free(root);</span></a>
+<a name="404"><span class="lineNum"> 404 </span> : : </a>
+<a name="405"><span class="lineNum"> 405 </span> : : /* check dt_translate_address */</a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* NB: the root bus has two address cells */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 1 : root = dt_new_root(&quot;&quot;);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : </a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 1 : c1 = dt_new_addr(root, &quot;some-32bit-bus&quot;, 0x80000000);</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c1, &quot;#address-cells&quot;, 1);</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c1, &quot;#size-cells&quot;, 1);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c1, &quot;ranges&quot;, 0x0, 0x8, 0x0, 0x1000);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> : : </a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 1 : gc1 = dt_new_addr(c1, &quot;test&quot;, 0x0500);</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 1 : dt_add_property_cells(gc1, &quot;reg&quot;, 0x0500, 0x10);</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 1 : assert(dt_translate_address(gc1, 0, NULL) == 0x800000500ul);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : </a>
+<a name="420"><span class="lineNum"> 420 </span> : : /* try three level translation */</a>
+<a name="421"><span class="lineNum"> 421 </span> : : </a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineCov"> 1 : gc2 = dt_new_addr(c1, &quot;another-32bit-bus&quot;, 0x40000000);</span></a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 1 : dt_add_property_cells(gc2, &quot;#address-cells&quot;, 1);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 1 : dt_add_property_cells(gc2, &quot;#size-cells&quot;, 1);</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 1 : dt_add_property_cells(gc2, &quot;ranges&quot;, 0x0, 0x600, 0x100,</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : 0x100, 0x800, 0x100);</a>
+<a name="427"><span class="lineNum"> 427 </span> : : </a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 1 : ggc1 = dt_new_addr(gc2, &quot;test&quot;, 0x50);</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 1 : dt_add_property_cells(ggc1, &quot;reg&quot;, 0x50, 0x10);</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 1 : assert(dt_translate_address(ggc1, 0, NULL) == 0x800000650ul);</span></a>
+<a name="431"><span class="lineNum"> 431 </span> : : </a>
+<a name="432"><span class="lineNum"> 432 </span> : : /* test multiple ranges work */</a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 1 : ggc2 = dt_new_addr(gc2, &quot;test&quot;, 0x150);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 1 : dt_add_property_cells(ggc2, &quot;reg&quot;, 0x150, 0x10);</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineCov"> 1 : assert(dt_translate_address(ggc2, 0, NULL) == 0x800000850ul);</span></a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> : : /* try 64bit -&gt; 64bit */</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 1 : c2 = dt_new_addr(root, &quot;some-64bit-bus&quot;, 0xe00000000);</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c2, &quot;#address-cells&quot;, 2);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c2, &quot;#size-cells&quot;, 2);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 1 : dt_add_property_cells(c2, &quot;ranges&quot;, 0x0, 0x0, 0xe, 0x0, 0x2, 0x0);</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 1 : gc2 = dt_new_addr(c2, &quot;test&quot;, 0x100000000ul);</span></a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 1 : dt_add_property_u64s(gc2, &quot;reg&quot;, 0x100000000ul, 0x10ul);</span></a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 1 : assert(dt_translate_address(gc2, 0, NULL) == 0xf00000000ul);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> : : </a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 1 : dt_free(root);</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> : : /* phandle fixup test */</a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineCov"> 1 : subtree = dt_new_root(&quot;subtree&quot;);</span></a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 1 : ev1 = dt_new(subtree, &quot;ev@1&quot;);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 1 : ev1_ph = ev1-&gt;phandle;</span></a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 1 : dt_new(ev1,&quot;a@1&quot;);</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 1 : dt_new(ev1,&quot;a@2&quot;);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineCov"> 1 : dt_new(ev1,&quot;a@3&quot;);</span></a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 1 : ut1 = dt_new(subtree, &quot;ut@1&quot;);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 1 : dt_add_property(ut1, &quot;something&quot;, (const void *)&amp;ev1-&gt;phandle, 4);</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 1 : ut2 = dt_new(subtree, &quot;ut@2&quot;);</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 1 : dt_add_property(ut2, &quot;something&quot;, (const void *)&amp;ev1-&gt;phandle, 4);</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : </a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 1 : dt_adjust_subtree_phandle(subtree, props_to_fix);</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 1 : assert(!(ev1-&gt;phandle == ev1_ph));</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 1 : new_prop_ph = dt_prop_get_u32(ut1, &quot;something&quot;);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineCov"> 1 : assert(!(new_prop_ph == ev1_ph));</span></a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 1 : new_prop_ph = dt_prop_get_u32(ut2, &quot;something&quot;);</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 1 : assert(!(new_prop_ph == ev1_ph));</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 1 : dt_free(subtree);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : }</a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-flash-firmware-versions.c.func-sort-c.html b/coverage-report/core/test/run-flash-firmware-versions.c.func-sort-c.html
new file mode 100644
index 0000000..ebc3d3f
--- /dev/null
+++ b/coverage-report/core/test/run-flash-firmware-versions.c.func-sort-c.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-flash-firmware-versions.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-flash-firmware-versions.c<span style="font-size: 80%;"> (<a href="run-flash-firmware-versions.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntryMed">81.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-flash-firmware-versions.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#56">__realloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#62">__zalloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#50">__free</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#123">main</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#100">start_preload_resource</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#116">wait_for_resource_loaded</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#44">__malloc</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#38">__memalign</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-flash-firmware-versions.c.func.html b/coverage-report/core/test/run-flash-firmware-versions.c.func.html
new file mode 100644
index 0000000..8333a31
--- /dev/null
+++ b/coverage-report/core/test/run-flash-firmware-versions.c.func.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-flash-firmware-versions.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-flash-firmware-versions.c<span style="font-size: 80%;"> (<a href="run-flash-firmware-versions.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntryMed">81.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-flash-firmware-versions.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#50">__free</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#44">__malloc</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#38">__memalign</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#56">__realloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#62">__zalloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#123">main</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#100">start_preload_resource</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-firmware-versions.c.gcov.html#116">wait_for_resource_loaded</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-flash-firmware-versions.c.gcov.html b/coverage-report/core/test/run-flash-firmware-versions.c.gcov.html
new file mode 100644
index 0000000..9f103fb
--- /dev/null
+++ b/coverage-report/core/test/run-flash-firmware-versions.c.gcov.html
@@ -0,0 +1,239 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-flash-firmware-versions.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-flash-firmware-versions.c<span style="font-size: 80%;"> (source / <a href="run-flash-firmware-versions.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntryMed">81.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2018-2019 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;malloc.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;sys/mman.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;assert.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &lt;interrupts.h&gt;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;bitutils.h&gt;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /*</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * Skiboot malloc stubs</a>
+<a name="31"><span class="lineNum"> 31 </span> : : *</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * The actual prototypes for these are defined in mem_region-malloc.h,</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * but that file also #defines malloc, and friends so we don't pull that in</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * directly.</a>
+<a name="35"><span class="lineNum"> 35 </span> : : */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define DEFAULT_ALIGN __alignof__(long)</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : void *__memalign(size_t blocksize, size_t bytes, const char *location __unused);</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 126 : void *__memalign(size_t blocksize, size_t bytes, const char *location __unused)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 126 : return memalign(blocksize, bytes);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : void *__malloc(size_t bytes, const char *location);</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 126 : void *__malloc(size_t bytes, const char *location)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 126 : return __memalign(DEFAULT_ALIGN, bytes, location);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : }</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> : : void __free(void *p, const char *location __unused);</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 13 : void __free(void *p, const char *location __unused)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 13 : free(p);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 13 : }</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> : : void *__realloc(void *ptr, size_t size, const char *location __unused);</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : void *__realloc(void *ptr, size_t size, const char *location __unused)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : return realloc(ptr, size);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : void *__zalloc(size_t bytes, const char *location);</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : void *__zalloc(size_t bytes, const char *location)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : {</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : void *p = __malloc(bytes, location);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : if (p)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : memset(p, 0, bytes);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : return p;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : }</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : #include &lt;opal-api.h&gt;</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : #include &quot;../../libfdt/fdt.c&quot;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : #include &quot;../../libfdt/fdt_ro.c&quot;</a>
+<a name="79"><span class="lineNum"> 79 </span> : : #include &quot;../../libfdt/fdt_sw.c&quot;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : #include &quot;../../libfdt/fdt_strerror.c&quot;</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : #include &quot;../../core/device.c&quot;</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : #include &quot;../../libstb/container-utils.h&quot;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : #include &quot;../../libstb/container.h&quot;</a>
+<a name="86"><span class="lineNum"> 86 </span> : : #include &quot;../../libstb/container.c&quot;</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : #include &quot;../flash-firmware-versions.c&quot;</a>
+<a name="89"><span class="lineNum"> 89 </span> : : #include &lt;assert.h&gt;</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : char __rodata_start[1], __rodata_end[1];</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> : : const char version[]=&quot;Hello world!&quot;;</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : enum proc_gen proc_gen = proc_gen_p8;</a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> : : static char *loaded_version_buf;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : static size_t loaded_version_buf_size;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> : : #define min(x,y) ((x) &lt; (y) ? x : y)</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 13 : int start_preload_resource(enum resource_id id, uint32_t subid,</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : void *buf, size_t *len)</a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> : : (void)id;</a>
+<a name="106"><span class="lineNum"> 106 </span> : : (void)subid;</a>
+<a name="107"><span class="lineNum"> 107 </span> : : (void)buf;</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 13 : if (loaded_version_buf) {</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 12 : *len = min(*len, loaded_version_buf_size);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 12 : memcpy(buf, loaded_version_buf, *len);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : } else {</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : *len = 0;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : }</a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 13 : return 0;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : }</a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 13 : int wait_for_resource_loaded(enum resource_id id, uint32_t idx)</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : {</a>
+<a name="120"><span class="lineNum"> 120 </span> : : (void)id;</a>
+<a name="121"><span class="lineNum"> 121 </span> : : (void)idx;</a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 13 : return 0;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : }</a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 13 : int main(int argc, char *argv[])</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : {</a>
+<a name="127"><span class="lineNum"> 127 </span> : : int fd;</a>
+<a name="128"><span class="lineNum"> 128 </span> : : struct stat ver_st;</a>
+<a name="129"><span class="lineNum"> 129 </span> : : int r;</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 13 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 13 : if (argc &gt; 1) {</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 12 : fd = open(argv[1], O_RDONLY);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 12 : assert(fd &gt; 0);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 12 : r = fstat(fd, &amp;ver_st);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 12 : assert(r == 0);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 12 : loaded_version_buf = mmap(NULL, ver_st.st_size,</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : PROT_READ, MAP_PRIVATE, fd, 0);</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 12 : assert(loaded_version_buf != (char*)-1);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 12 : loaded_version_buf_size = ver_st.st_size;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 13 : flash_fw_version_preload();</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 13 : proc_gen = proc_gen_p9;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 13 : flash_fw_version_preload();</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 13 : flash_dt_add_fw_version();</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 13 : return 0;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : }</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-flash-subpartition.c.func-sort-c.html b/coverage-report/core/test/run-flash-subpartition.c.func-sort-c.html
new file mode 100644
index 0000000..c9018ce
--- /dev/null
+++ b/coverage-report/core/test/run-flash-subpartition.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-flash-subpartition.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-flash-subpartition.c<span style="font-size: 80%;"> (<a href="run-flash-subpartition.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-flash-subpartition.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-subpartition.c.gcov.html#22">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-flash-subpartition.c.func.html b/coverage-report/core/test/run-flash-subpartition.c.func.html
new file mode 100644
index 0000000..35924a9
--- /dev/null
+++ b/coverage-report/core/test/run-flash-subpartition.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-flash-subpartition.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-flash-subpartition.c<span style="font-size: 80%;"> (<a href="run-flash-subpartition.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-flash-subpartition.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-flash-subpartition.c.gcov.html#22">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-flash-subpartition.c.gcov.html b/coverage-report/core/test/run-flash-subpartition.c.gcov.html
new file mode 100644
index 0000000..f1f2adc
--- /dev/null
+++ b/coverage-report/core/test/run-flash-subpartition.c.gcov.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-flash-subpartition.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-flash-subpartition.c<span style="font-size: 80%;"> (source / <a href="run-flash-subpartition.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2016 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;opal-api.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;../flash-subpartition.c&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;assert.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : /* This is a straight dump of the CAPP ucode partition header */</a>
+<a name="14"><span class="lineNum"> 14 </span> : : char capp[4096] = {0x43, 0x41, 0x50, 0x50, 0x00, 0x00, 0x00, 0x01,</a>
+<a name="15"><span class="lineNum"> 15 </span> : : 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x10, 0x00,</a>
+<a name="16"><span class="lineNum"> 16 </span> : : 0x00, 0x00, 0x8e, 0x50, 0x00, 0x02, 0x00, 0xea,</a>
+<a name="17"><span class="lineNum"> 17 </span> : : 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x8e, 0x50,</a>
+<a name="18"><span class="lineNum"> 18 </span> : : 0x00, 0x02, 0x00, 0xef, 0x00, 0x00, 0x10, 0x00,</a>
+<a name="19"><span class="lineNum"> 19 </span> : : 0x00, 0x00, 0x8e, 0x50, 0x00, 0x02, 0x01, 0xef,</a>
+<a name="20"><span class="lineNum"> 20 </span> : : 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x8e, 0x50,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : 0x00, 0x01, 0x00, 0xd3, 0x00, 0x00, 0x10, 0x00,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : 0x00, 0x00, 0x8e, 0x50, 0x00, 0x00, 0x00, 0x00 };</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : int rc;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : uint32_t part_actual;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : uint32_t offset;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : uint32_t size;</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : uint32_t subids[] = { 0x100ea, 0x200ea, 0x200ef, 0x201ef, 0x100d3 };</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 6 : for (int i = 0; i &lt; sizeof(subids)/sizeof(uint32_t); i++) {</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 5 : offset = 0;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 5 : rc = flash_subpart_info(capp, sizeof(capp), 0x24000,</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : &amp;part_actual, subids[i],</a>
+<a name="36"><span class="lineNum"> 36 </span> : : &amp;offset, &amp;size);</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 5 : printf(&quot;\nsubid %x\n&quot;, subids[i]);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 5 : printf(&quot;part_actual %u\n&quot;, part_actual);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 5 : printf(&quot;offset %u\n&quot;, offset);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 5 : printf(&quot;size %u\n&quot;, size);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 5 : assert (rc == 0);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 5 : assert (size == 36432);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 5 : assert (offset == 4096);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 5 : assert (part_actual == 40960);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : }</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-malloc-speed.c.func-sort-c.html b/coverage-report/core/test/run-malloc-speed.c.func-sort-c.html
new file mode 100644
index 0000000..548ba60
--- /dev/null
+++ b/coverage-report/core/test/run-malloc-speed.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-malloc-speed.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-malloc-speed.c<span style="font-size: 80%;"> (<a href="run-malloc-speed.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-malloc-speed.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#64">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#17">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#12">real_malloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#41">lock_caller</a></td>
+ <td class="coverFnHi">4096</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#54">lock_held_by_me</a></td>
+ <td class="coverFnHi">4096</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#48">unlock</a></td>
+ <td class="coverFnHi">4096</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-malloc-speed.c.func.html b/coverage-report/core/test/run-malloc-speed.c.func.html
new file mode 100644
index 0000000..591e9a7
--- /dev/null
+++ b/coverage-report/core/test/run-malloc-speed.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-malloc-speed.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-malloc-speed.c<span style="font-size: 80%;"> (<a href="run-malloc-speed.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-malloc-speed.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#41">lock_caller</a></td>
+ <td class="coverFnHi">4096</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#54">lock_held_by_me</a></td>
+ <td class="coverFnHi">4096</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#64">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#17">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#12">real_malloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc-speed.c.gcov.html#48">unlock</a></td>
+ <td class="coverFnHi">4096</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-malloc-speed.c.gcov.html b/coverage-report/core/test/run-malloc-speed.c.gcov.html
new file mode 100644
index 0000000..9fdfb00
--- /dev/null
+++ b/coverage-report/core/test/run-malloc-speed.c.gcov.html
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-malloc-speed.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-malloc-speed.c<span style="font-size: 80%;"> (source / <a href="run-malloc-speed.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : /* Use these before we undefine them below. */</a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 2 : static inline void *real_malloc(size_t size)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 2 : return malloc(size);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : }</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 1 : static inline void real_free(void *p)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : return free(p);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : /* We need mem_region to accept __location__ */</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define is_rodata(p) true</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &quot;../malloc.c&quot;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #include &quot;../device.c&quot;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : #undef malloc</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #undef free</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #undef realloc</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : #include &lt;assert.h&gt;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : char __rodata_start[1], __rodata_end[1];</a>
+<a name="40"><span class="lineNum"> 40 </span> : : struct dt_node *dt_root;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 4096 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> : : (void)caller;</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 4096 : assert(!l-&gt;lock_val);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 4096 : l-&gt;lock_val = 1;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 4096 : }</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 4096 : void unlock(struct lock *l)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 4096 : assert(l-&gt;lock_val);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 4096 : l-&gt;lock_val = 0;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 4096 : }</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 4096 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : {</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 4096 : return l-&gt;lock_val;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : }</a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define TEST_HEAP_ORDER 27</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : #define NUM_ALLOCS 4096</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : uint64_t i, len;</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : void **p = real_malloc(sizeof(void*)*NUM_ALLOCS);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (unsigned long)real_malloc(skiboot_heap.len);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : len = skiboot_heap.len / NUM_ALLOCS - sizeof(struct alloc_hdr);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 4097 : for (i = 0; i &lt; NUM_ALLOCS; i++) {</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 4096 : p[i] = __malloc(len, __location__);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 4096 : assert(p[i] &gt; region_start(&amp;skiboot_heap));</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 4096 : assert(p[i] + len &lt;= region_start(&amp;skiboot_heap)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : + skiboot_heap.len);</a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : assert(skiboot_heap.free_list_lock.lock_val == 0);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : free(region_start(&amp;skiboot_heap));</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : real_free(p);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-malloc.c.func-sort-c.html b/coverage-report/core/test/run-malloc.c.func-sort-c.html
new file mode 100644
index 0000000..ca6a04a
--- /dev/null
+++ b/coverage-report/core/test/run-malloc.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-malloc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-malloc.c<span style="font-size: 80%;"> (<a href="run-malloc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-malloc.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#67">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#18">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#13">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#61">heap_empty</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#43">lock_caller</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#50">unlock</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#56">lock_held_by_me</a></td>
+ <td class="coverFnHi">61</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-malloc.c.func.html b/coverage-report/core/test/run-malloc.c.func.html
new file mode 100644
index 0000000..4c2abf7
--- /dev/null
+++ b/coverage-report/core/test/run-malloc.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-malloc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-malloc.c<span style="font-size: 80%;"> (<a href="run-malloc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-malloc.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#61">heap_empty</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#43">lock_caller</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#56">lock_held_by_me</a></td>
+ <td class="coverFnHi">61</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#67">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#18">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#13">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-malloc.c.gcov.html#50">unlock</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-malloc.c.gcov.html b/coverage-report/core/test/run-malloc.c.gcov.html
new file mode 100644
index 0000000..cd5c63a
--- /dev/null
+++ b/coverage-report/core/test/run-malloc.c.gcov.html
@@ -0,0 +1,259 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-malloc.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-malloc.c<span style="font-size: 80%;"> (source / <a href="run-malloc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : /* Use these before we undefine them below. */</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 1 : static inline void *real_malloc(size_t size)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 1 : return malloc(size);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 1 : static inline void real_free(void *p)</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 1 : return free(p);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : #undef malloc</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #undef free</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #undef realloc</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : #define is_rodata(p) true</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #include &quot;../malloc.c&quot;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #include &quot;../device.c&quot;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #include &quot;mem_region-malloc.h&quot;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define TEST_HEAP_ORDER 16</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : struct dt_node *dt_root;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 58 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> : : (void)caller;</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 58 : assert(!l-&gt;lock_val);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 58 : l-&gt;lock_val = 1;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 58 : }</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 58 : void unlock(struct lock *l)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 58 : assert(l-&gt;lock_val);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 58 : l-&gt;lock_val = 0;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 58 : }</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 61 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 61 : return l-&gt;lock_val;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 21 : static bool heap_empty(void)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 21 : const struct alloc_hdr *h = region_start(&amp;skiboot_heap);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 21 : return h-&gt;num_longs == skiboot_heap.len / sizeof(long);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : }</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : {</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : char *test_heap = real_malloc(TEST_HEAP_SIZE);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : char *p, *p2, *p3, *p4;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : char *pr;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : size_t i;</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (unsigned long)test_heap;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : /* Allocations of various sizes. */</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 17 : for (i = 0; i &lt; TEST_HEAP_ORDER; i++) {</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 16 : p = malloc(1ULL &lt;&lt; i);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 16 : assert(p);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 16 : assert(p &gt; (char *)test_heap);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 16 : assert(p + (1ULL &lt;&lt; i) &lt;= (char *)test_heap + TEST_HEAP_SIZE);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 16 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 16 : free(p);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 16 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 16 : assert(heap_empty());</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : /* Realloc as malloc. */</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : skiboot_heap.free_list_lock.lock_val = 0;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : p = realloc(NULL, 100);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> : : /* Realloc as free. */</a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : p = realloc(p, 0);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : assert(!p);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> : : /* Realloc longer. */</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : p = realloc(NULL, 100);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : p2 = realloc(p, 200);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : assert(p2 == p);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : free(p2);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> : : /* Realloc shorter. */</a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : skiboot_heap.free_list_lock.lock_val = 0;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : p = realloc(NULL, 100);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : p2 = realloc(p, 1);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : assert(p2 == p);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1 : free(p2);</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> : : /* zalloc failure */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : p2 = zalloc(TEST_HEAP_SIZE * 2);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : assert(p2 == NULL);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : /* Realloc with move. */</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : p2 = malloc(TEST_HEAP_SIZE - 64 - sizeof(struct alloc_hdr)*2);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 1 : memset(p2, 'a', TEST_HEAP_SIZE - 64 - sizeof(struct alloc_hdr)*2);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : assert(p2);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : p = malloc(64);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : memset(p, 'b', 64);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 1 : p[63] = 'c';</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 1 : free(p2);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 1 : p2 = realloc(p, 128);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1 : assert(p2 != p);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 1 : assert(p2[63] == 'c');</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : free(p2);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> : : /* Realloc with failure to allocate new size */</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : p2 = malloc(TEST_HEAP_SIZE - sizeof(struct alloc_hdr)*2);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : assert(p2);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : memset(p2, 'a', TEST_HEAP_SIZE - sizeof(struct alloc_hdr)*2);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : p = p2;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : p2 = realloc(p, TEST_HEAP_SIZE*2);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : assert(p2==NULL);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1 : memset(p, 'b', TEST_HEAP_SIZE - sizeof(struct alloc_hdr)*2);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 1 : free(p);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> : : /* Reproduce bug BZ109128/SW257364 */</a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 1 : p = malloc(100);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : p2 = malloc(100);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1 : p3 = malloc(100);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 1 : p4 = malloc(100);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 1 : free(p2);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 1 : pr = realloc(p,216);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 1 : assert(pr);</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 1 : free(p3);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 1 : free(pr);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 1 : free(p4);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 1 : assert(!skiboot_heap.free_list_lock.lock_val);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 1 : real_free(test_heap);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_range_is_reserved.c.func-sort-c.html b/coverage-report/core/test/run-mem_range_is_reserved.c.func-sort-c.html
new file mode 100644
index 0000000..98df65e
--- /dev/null
+++ b/coverage-report/core/test/run-mem_range_is_reserved.c.func-sort-c.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_range_is_reserved.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_range_is_reserved.c<span style="font-size: 80%;"> (<a href="run-mem_range_is_reserved.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">51</td>
+ <td class="headerCovTableEntry">57</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-mem_range_is_reserved.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#69">add_mem_node</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#178">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#20">real_free</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#15">real_malloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#90">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#146">run_test</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#61">lock_held_by_me</a></td>
+ <td class="coverFnHi">75</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#48">lock_caller</a></td>
+ <td class="coverFnHi">124</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#55">unlock</a></td>
+ <td class="coverFnHi">124</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_range_is_reserved.c.func.html b/coverage-report/core/test/run-mem_range_is_reserved.c.func.html
new file mode 100644
index 0000000..e034835
--- /dev/null
+++ b/coverage-report/core/test/run-mem_range_is_reserved.c.func.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_range_is_reserved.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_range_is_reserved.c<span style="font-size: 80%;"> (<a href="run-mem_range_is_reserved.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">51</td>
+ <td class="headerCovTableEntry">57</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-mem_range_is_reserved.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#90">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#69">add_mem_node</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#48">lock_caller</a></td>
+ <td class="coverFnHi">124</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#61">lock_held_by_me</a></td>
+ <td class="coverFnHi">75</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#178">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#20">real_free</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#15">real_malloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#146">run_test</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_range_is_reserved.c.gcov.html#55">unlock</a></td>
+ <td class="coverFnHi">124</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_range_is_reserved.c.gcov.html b/coverage-report/core/test/run-mem_range_is_reserved.c.gcov.html
new file mode 100644
index 0000000..643ebcc
--- /dev/null
+++ b/coverage-report/core/test/run-mem_range_is_reserved.c.gcov.html
@@ -0,0 +1,292 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_range_is_reserved.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_range_is_reserved.c<span style="font-size: 80%;"> (source / <a href="run-mem_range_is_reserved.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">51</td>
+ <td class="headerCovTableEntry">57</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2015-2019 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : /* The lock backtrace structures consume too much room on the skiboot heap */</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #undef DEBUG_LOCKS_BACKTRACE</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 2 : static void *real_malloc(size_t size)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 2 : return malloc(size);</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : }</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 2 : static void real_free(void *p)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 2 : return free(p);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #undef malloc</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #undef free</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #undef realloc</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* We need mem_region to accept __location__ */</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #define is_rodata(p) true</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #include &quot;../malloc.c&quot;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /* But we need device tree to make copies of names. */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #undef is_rodata</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define is_rodata(p) false</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #include &quot;../../libc/string/strdup.c&quot;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : #include &quot;../device.c&quot;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #include &lt;assert.h&gt;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 124 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> : : (void)caller;</a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 124 : assert(!l-&gt;lock_val);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 124 : l-&gt;lock_val++;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 124 : }</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 124 : void unlock(struct lock *l)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 124 : assert(l-&gt;lock_val);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 124 : l-&gt;lock_val--;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 124 : }</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 75 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 75 : return l-&gt;lock_val;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : }</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> : : #define TEST_HEAP_ORDER 16</a>
+<a name="69"><span class="lineNum"> 69 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : static void add_mem_node(uint64_t start, uint64_t len)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> : : struct dt_node *mem;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : u64 reg[2];</a>
+<a name="75"><span class="lineNum"> 75 </span> : : char *name;</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : name = (char*)malloc(sizeof(&quot;memory@&quot;) + STR_MAX_CHARS(reg[0]));</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : assert(name);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : /* reg contains start and length */</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : reg[0] = cpu_to_be64(start);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : reg[1] = cpu_to_be64(len);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : sprintf(name, &quot;memory@%llx&quot;, (long long)start);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : mem = dt_new(dt_root, name);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : dt_add_property_string(mem, &quot;device_type&quot;, &quot;memory&quot;);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : dt_add_property(mem, &quot;reg&quot;, reg, sizeof(reg));</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : free(name);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 14 : void add_chip_dev_associativity(struct dt_node *dev __attribute__((unused)))</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : {</a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 14 : }</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : struct test_region {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : uint64_t start;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : uint64_t end;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : };</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : static struct test {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : struct test_region regions[3];</a>
+<a name="103"><span class="lineNum"> 103 </span> : : bool reserved;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : } tests[] = {</a>
+<a name="105"><span class="lineNum"> 105 </span> : : /* empty region set */</a>
+<a name="106"><span class="lineNum"> 106 </span> : : { { { 0 } }, false },</a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> : : /* single exact match */</a>
+<a name="109"><span class="lineNum"> 109 </span> : : { { { 0x1000, 0x2000 }, }, true },</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> : : /* overlap downwards */</a>
+<a name="112"><span class="lineNum"> 112 </span> : : { { { 0x0fff, 0x2000 }, }, true },</a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* overlap upwards */</a>
+<a name="115"><span class="lineNum"> 115 </span> : : { { { 0x1000, 0x2001 }, }, true },</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : /* missing first byte */</a>
+<a name="118"><span class="lineNum"> 118 </span> : : { { { 0x1001, 0x2000 }, }, false },</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /* missing last byte */</a>
+<a name="121"><span class="lineNum"> 121 </span> : : { { { 0x1000, 0x1fff }, }, false },</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> : : /* two regions, full coverage, split before start of range */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : { { { 0x0500, 0x1000 }, { 0x1000, 0x2500 } }, true },</a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> : : /* two regions, full coverage, split after start of range */</a>
+<a name="127"><span class="lineNum"> 127 </span> : : { { { 0x0500, 0x1001 }, { 0x1001, 0x2500 } }, true },</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> : : /* two regions, full coverage, split at middle of range */</a>
+<a name="130"><span class="lineNum"> 130 </span> : : { { { 0x0500, 0x1500 }, { 0x1500, 0x2500 } }, true },</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* two regions, full coverage, split before end of range */</a>
+<a name="133"><span class="lineNum"> 133 </span> : : { { { 0x0500, 0x1fff }, { 0x1fff, 0x2500 } }, true },</a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> : : /* two regions, full coverage, split after end of range */</a>
+<a name="136"><span class="lineNum"> 136 </span> : : { { { 0x0500, 0x2000 }, { 0x2000, 0x2500 } }, true },</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : /* two regions, missing byte in middle of range */</a>
+<a name="139"><span class="lineNum"> 139 </span> : : { { { 0x0500, 0x14ff }, { 0x1500, 0x2500 } }, false },</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : /* two regions, missing byte after start of range */</a>
+<a name="142"><span class="lineNum"> 142 </span> : : { { { 0x0500, 0x1000 }, { 0x1001, 0x2500 } }, false },</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> : : /* two regions, missing byte before end of range */</a>
+<a name="145"><span class="lineNum"> 145 </span> : : { { { 0x0500, 0x1fff }, { 0x2000, 0x2500 } }, false },</a>
+<a name="146"><span class="lineNum"> 146 </span> : : };</a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 14 : static void run_test(struct test *test)</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : {</a>
+<a name="150"><span class="lineNum"> 150 </span> : : struct test_region *r;</a>
+<a name="151"><span class="lineNum"> 151 </span> : : bool reserved;</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 14 : list_head_init(&amp;regions);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 14 : mem_region_init();</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* create our reservations */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 35 : for (r = test-&gt;regions; r-&gt;start; r++)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 21 : mem_reserve_fw(&quot;r&quot;, r-&gt;start, r-&gt;end - r-&gt;start);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : </a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 14 : reserved = mem_range_is_reserved(0x1000, 0x1000);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 14 : if (reserved != test-&gt;reserved) {</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : struct mem_region *r;</a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;test failed; got %s, expected %s\n&quot;,</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : reserved ? &quot;reserved&quot; : &quot;unreserved&quot;,</a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : test-&gt;reserved ? &quot;reserved&quot; : &quot;unreserved&quot;);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;reserved regions:\n&quot;);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineNoCov"> 0 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;\t: %08&quot;PRIx64&quot;[%08&quot;PRIx64&quot;] %s\n&quot;,</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : r-&gt;start, r-&gt;len, r-&gt;name);</a>
+<a name="174"><span class="lineNum"> 174 </span> : : }</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : exit(EXIT_FAILURE);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 14 : }</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : {</a>
+<a name="182"><span class="lineNum"> 182 </span> : : unsigned int i;</a>
+<a name="183"><span class="lineNum"> 183 </span> : : void *buf;</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (long)real_malloc(TEST_HEAP_SIZE);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> : : /* shift the OS reserve area out of the way of our playground */</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 1 : skiboot_os_reserve.start = 0x100000;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 1 : skiboot_os_reserve.len = 0x1000;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#address-cells&quot;, 2);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#size-cells&quot;, 2);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 1 : buf = real_malloc(1024*1024);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 1 : add_mem_node((unsigned long)buf, 1024*1024);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 15 : for (i = 0; i &lt; ARRAY_SIZE(tests); i++)</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 14 : run_test(&amp;tests[i]);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 1 : real_free(buf);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 1 : real_free((void *)(long)skiboot_heap.start);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region.c.func-sort-c.html b/coverage-report/core/test/run-mem_region.c.func-sort-c.html
new file mode 100644
index 0000000..5b82944
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region.c<span style="font-size: 80%;"> (<a href="run-mem_region.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">136</td>
+ <td class="headerCovTableEntry">137</td>
+ <td class="headerCovTableEntryHi">99.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-mem_region.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#74">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#24">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#19">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#47">lock_caller</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#54">unlock</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#68">heap_empty</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#60">lock_held_by_me</a></td>
+ <td class="coverFnHi">131344</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region.c.func.html b/coverage-report/core/test/run-mem_region.c.func.html
new file mode 100644
index 0000000..62327d3
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region.c<span style="font-size: 80%;"> (<a href="run-mem_region.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">136</td>
+ <td class="headerCovTableEntry">137</td>
+ <td class="headerCovTableEntryHi">99.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-mem_region.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#68">heap_empty</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#47">lock_caller</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#60">lock_held_by_me</a></td>
+ <td class="coverFnHi">131344</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#74">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#24">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#19">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region.c.gcov.html#54">unlock</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region.c.gcov.html b/coverage-report/core/test/run-mem_region.c.gcov.html
new file mode 100644
index 0000000..68f8b67
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region.c.gcov.html
@@ -0,0 +1,337 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region.c<span style="font-size: 80%;"> (source / <a href="run-mem_region.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">136</td>
+ <td class="headerCovTableEntry">137</td>
+ <td class="headerCovTableEntryHi">99.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : /* The lock backtrace structures consume too much room on the skiboot heap */</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #undef DEBUG_LOCKS_BACKTRACE</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;string.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* Use these before we override definitions below. */</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : static void *real_malloc(size_t size)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : return malloc(size);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : static inline void real_free(void *p)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1 : return free(p);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : #undef malloc</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #undef free</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #undef realloc</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define is_rodata(p) true</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #include &quot;../malloc.c&quot;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #include &quot;../device.c&quot;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : #include &lt;assert.h&gt;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct dt_node *dt_root;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 10 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> : : (void)caller;</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 10 : assert(!l-&gt;lock_val);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 10 : l-&gt;lock_val++;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 10 : void unlock(struct lock *l)</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : {</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 10 : assert(l-&gt;lock_val);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 10 : l-&gt;lock_val--;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 131344 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : {</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 131344 : return l-&gt;lock_val;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define TEST_HEAP_ORDER 16</a>
+<a name="68"><span class="lineNum"> 68 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 20 : static bool heap_empty(void)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 20 : const struct alloc_hdr *h = region_start(&amp;skiboot_heap);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 20 : return h-&gt;num_longs == skiboot_heap.len / sizeof(long);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : }</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : {</a>
+<a name="78"><span class="lineNum"> 78 </span> : : char *test_heap;</a>
+<a name="79"><span class="lineNum"> 79 </span> : : void *p, *ptrs[100];</a>
+<a name="80"><span class="lineNum"> 80 </span> : : size_t i;</a>
+<a name="81"><span class="lineNum"> 81 </span> : : struct mem_region *r;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : test_heap = real_malloc(TEST_HEAP_SIZE);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (unsigned long)test_heap;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : lock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : /* Allocations of various sizes. */</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 17 : for (i = 0; i &lt; TEST_HEAP_ORDER; i++) {</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 16 : p = mem_alloc(&amp;skiboot_heap, 1ULL &lt;&lt; i, 1, &quot;here&quot;);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 16 : assert(p);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 16 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 16 : assert(!strcmp(((struct alloc_hdr *)p)[-1].location, &quot;here&quot;));</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 16 : assert(p &gt; (void *)test_heap);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 16 : assert(p + (1ULL &lt;&lt; i) &lt;= (void *)test_heap + TEST_HEAP_SIZE);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 16 : assert(mem_allocated_size(p) &gt;= 1ULL &lt;&lt; i);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 16 : mem_free(&amp;skiboot_heap, p, &quot;freed&quot;);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 16 : assert(heap_empty());</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 16 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 16 : assert(!strcmp(((struct alloc_hdr *)p)[-1].location, &quot;freed&quot;));</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : p = mem_alloc(&amp;skiboot_heap, 1ULL &lt;&lt; i, 1, &quot;here&quot;);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : assert(!p);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, p, &quot;freed&quot;);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Allocations of various alignments: use small alloc first. */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : ptrs[0] = mem_alloc(&amp;skiboot_heap, 1, 1, &quot;small&quot;);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : for (i = 0; ; i++) {</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 23 : p = mem_alloc(&amp;skiboot_heap, 1, 1ULL &lt;&lt; i, &quot;here&quot;);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 23 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : /* We will eventually fail... */</a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 23 : if (!p) {</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : assert(i &gt;= TEST_HEAP_ORDER);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 22 : assert(p);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 22 : assert((long)p % (1ULL &lt;&lt; i) == 0);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 22 : assert(p &gt; (void *)test_heap);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 22 : assert(p + 1 &lt;= (void *)test_heap + TEST_HEAP_SIZE);</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 22 : mem_free(&amp;skiboot_heap, p, &quot;freed&quot;);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 22 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : }</a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, ptrs[0], &quot;small freed&quot;);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : /* Many little allocations, freed in reverse order. */</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 101 : for (i = 0; i &lt; 100; i++) {</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 100 : ptrs[i] = mem_alloc(&amp;skiboot_heap, sizeof(long), 1, &quot;here&quot;);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 100 : assert(ptrs[i]);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 100 : assert(ptrs[i] &gt; (void *)test_heap);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 100 : assert(ptrs[i] + sizeof(long)</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : &lt;= (void *)test_heap + TEST_HEAP_SIZE);</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 100 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : mem_dump_free();</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 101 : for (i = 0; i &lt; 100; i++)</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 100 : mem_free(&amp;skiboot_heap, ptrs[100 - 1 - i], &quot;freed&quot;);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> : : /* Check the prev_free gets updated properly. */</a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 1 : ptrs[0] = mem_alloc(&amp;skiboot_heap, sizeof(long), 1, &quot;ptrs[0]&quot;);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : ptrs[1] = mem_alloc(&amp;skiboot_heap, sizeof(long), 1, &quot;ptrs[1]&quot;);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : assert(ptrs[1] &gt; ptrs[0]);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, ptrs[0], &quot;ptrs[0] free&quot;);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : ptrs[0] = mem_alloc(&amp;skiboot_heap, sizeof(long), 1, &quot;ptrs[0] again&quot;);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, ptrs[1], &quot;ptrs[1] free&quot;);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, ptrs[0], &quot;ptrs[0] free&quot;);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 1 : assert(heap_empty());</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : #if 0</a>
+<a name="161"><span class="lineNum"> 161 </span> : : printf(&quot;Heap map:\n&quot;);</a>
+<a name="162"><span class="lineNum"> 162 </span> : : for (i = 0; i &lt; TEST_HEAP_SIZE / sizeof(long); i++) {</a>
+<a name="163"><span class="lineNum"> 163 </span> : : printf(&quot;%u&quot;, test_bit(skiboot_heap.bitmap, i));</a>
+<a name="164"><span class="lineNum"> 164 </span> : : if (i % 64 == 63)</a>
+<a name="165"><span class="lineNum"> 165 </span> : : printf(&quot;\n&quot;);</a>
+<a name="166"><span class="lineNum"> 166 </span> : : else if (i % 8 == 7)</a>
+<a name="167"><span class="lineNum"> 167 </span> : : printf(&quot; &quot;);</a>
+<a name="168"><span class="lineNum"> 168 </span> : : }</a>
+<a name="169"><span class="lineNum"> 169 </span> : : #endif</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> : : /* Simple enlargement, then free */</a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 1 : p = mem_alloc(&amp;skiboot_heap, 1, 1, &quot;one byte&quot;);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 1 : assert(mem_resize(&amp;skiboot_heap, p, 100, &quot;hundred bytes&quot;));</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 1 : assert(mem_allocated_size(p) &gt;= 100);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 1 : assert(!strcmp(((struct alloc_hdr *)p)[-1].location, &quot;hundred bytes&quot;));</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, p, &quot;freed&quot;);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> : : /* Simple shrink, then free */</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 1 : p = mem_alloc(&amp;skiboot_heap, 100, 1, &quot;100 bytes&quot;);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 1 : assert(mem_resize(&amp;skiboot_heap, p, 1, &quot;1 byte&quot;));</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 1 : assert(mem_allocated_size(p) &lt; 100);</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : assert(!strcmp(((struct alloc_hdr *)p)[-1].location, &quot;1 byte&quot;));</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, p, &quot;freed&quot;);</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> : : /* Lots of resizing (enlarge). */</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 1 : p = mem_alloc(&amp;skiboot_heap, 1, 1, &quot;one byte&quot;);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 1 : assert(p);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 65521 : for (i = 1; i &lt;= TEST_HEAP_SIZE - sizeof(struct alloc_hdr); i++) {</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 65520 : assert(mem_resize(&amp;skiboot_heap, p, i, &quot;enlarge&quot;));</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 65520 : assert(mem_allocated_size(p) &gt;= i);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 65520 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : }</a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> : : /* Can't make it larger though. */</a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 1 : assert(!mem_resize(&amp;skiboot_heap, p, i, &quot;enlarge&quot;));</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 65521 : for (i = TEST_HEAP_SIZE - sizeof(struct alloc_hdr); i &gt; 0; i--) {</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 65520 : assert(mem_resize(&amp;skiboot_heap, p, i, &quot;shrink&quot;));</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 65520 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 1 : mem_free(&amp;skiboot_heap, p, &quot;freed&quot;);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 1 : unlock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> : : /* lock the regions list */</a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 1 : lock(&amp;mem_region_lock);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : /* Test splitting of a region. */</a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 1 : r = new_region(&quot;base&quot;, (unsigned long)test_heap,</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : TEST_HEAP_SIZE, NULL, REGION_SKIBOOT_HEAP);</a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 1 : assert(add_region(r));</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 1 : r = new_region(&quot;splitter&quot;, (unsigned long)test_heap + TEST_HEAP_SIZE/4,</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : TEST_HEAP_SIZE/2, NULL, REGION_RESERVED);</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 1 : assert(add_region(r));</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : /* Now we should have *three* regions. */</a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : i = 0;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 4 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 3 : if (region_start(r) == test_heap) {</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 1 : assert(r-&gt;len == TEST_HEAP_SIZE/4);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1 : assert(strcmp(r-&gt;name, &quot;base&quot;) == 0);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1 : assert(r-&gt;type == REGION_SKIBOOT_HEAP);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 2 : } else if (region_start(r) == test_heap + TEST_HEAP_SIZE / 4) {</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 1 : assert(r-&gt;len == TEST_HEAP_SIZE/2);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 1 : assert(strcmp(r-&gt;name, &quot;splitter&quot;) == 0);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 1 : assert(r-&gt;type == REGION_RESERVED);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 1 : assert(!r-&gt;free_list.n.next);</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : } else if (region_start(r) == test_heap + TEST_HEAP_SIZE/4*3) {</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 1 : assert(r-&gt;len == TEST_HEAP_SIZE/4);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 1 : assert(strcmp(r-&gt;name, &quot;base&quot;) == 0);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 1 : assert(r-&gt;type == REGION_SKIBOOT_HEAP);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : } else</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 3 : assert(mem_check(r));</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 3 : i++;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 1 : mem_dump_free();</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 1 : assert(i == 3);</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 4 : while ((r = list_pop(&amp;regions, struct mem_region, list)) != NULL) {</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 3 : lock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 3 : mem_free(&amp;skiboot_heap, r, __location__);</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 3 : unlock(&amp;skiboot_heap.free_list_lock);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : }</a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 1 : unlock(&amp;mem_region_lock);</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 1 : assert(skiboot_heap.free_list_lock.lock_val == 0);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 1 : real_free(test_heap);</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_init.c.func-sort-c.html b/coverage-report/core/test/run-mem_region_init.c.func-sort-c.html
new file mode 100644
index 0000000..2478510
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_init.c.func-sort-c.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_init.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_init.c<span style="font-size: 80%;"> (<a href="run-mem_region_init.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">80</td>
+ <td class="headerCovTableEntry">80</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-mem_region_init.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#98">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#18">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#13">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#94">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#73">add_mem_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#34">skiboot_strdup</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#64">lock_held_by_me</a></td>
+ <td class="coverFnHi">62</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#51">lock_caller</a></td>
+ <td class="coverFnHi">65</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#58">unlock</a></td>
+ <td class="coverFnHi">65</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_init.c.func.html b/coverage-report/core/test/run-mem_region_init.c.func.html
new file mode 100644
index 0000000..7bde439
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_init.c.func.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_init.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_init.c<span style="font-size: 80%;"> (<a href="run-mem_region_init.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">80</td>
+ <td class="headerCovTableEntry">80</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-mem_region_init.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#94">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#73">add_mem_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#51">lock_caller</a></td>
+ <td class="coverFnHi">65</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#64">lock_held_by_me</a></td>
+ <td class="coverFnHi">62</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#98">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#18">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#13">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#34">skiboot_strdup</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_init.c.gcov.html#58">unlock</a></td>
+ <td class="coverFnHi">65</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_init.c.gcov.html b/coverage-report/core/test/run-mem_region_init.c.gcov.html
new file mode 100644
index 0000000..2eba9b9
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_init.c.gcov.html
@@ -0,0 +1,260 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_init.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_init.c<span style="font-size: 80%;"> (source / <a href="run-mem_region_init.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">80</td>
+ <td class="headerCovTableEntry">80</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : /* Use these before we undefine them below. */</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 1 : static inline void *real_malloc(size_t size)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 1 : return malloc(size);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 1 : static inline void real_free(void *p)</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 1 : return free(p);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &quot;../malloc.c&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : /* We need mem_region to accept __location__ */</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #define is_rodata(p) true</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : /* But we need device tree to make copies of names. */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #undef is_rodata</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define is_rodata(p) false</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 9 : static inline char *skiboot_strdup(const char *str)</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : {</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 9 : char *ret = __malloc(strlen(str) + 1, &quot;&quot;);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 9 : return memcpy(ret, str, strlen(str) + 1);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #undef strdup</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define strdup skiboot_strdup</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : #include &quot;../device.c&quot;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : #include &lt;assert.h&gt;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 65 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> : : (void)caller;</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 65 : assert(!l-&gt;lock_val);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 65 : l-&gt;lock_val = 1;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 65 : }</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 65 : void unlock(struct lock *l)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 65 : assert(l-&gt;lock_val);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 65 : l-&gt;lock_val = 0;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 65 : }</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 62 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 62 : return l-&gt;lock_val;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : }</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> : : /* We actually need a lot of room for the bitmaps! */</a>
+<a name="72"><span class="lineNum"> 72 </span> : : #define TEST_HEAP_ORDER 27</a>
+<a name="73"><span class="lineNum"> 73 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 2 : static void add_mem_node(uint64_t start, uint64_t len)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : {</a>
+<a name="77"><span class="lineNum"> 77 </span> : : struct dt_node *mem;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : u64 reg[2];</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 2 : char *name= (char*)malloc(sizeof(&quot;memory@&quot;) + STR_MAX_CHARS(reg[0]));</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 2 : assert(name);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : /* reg contains start and length */</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : reg[0] = cpu_to_be64(start);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 2 : reg[1] = cpu_to_be64(len);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 2 : sprintf(name, &quot;memory@%llx&quot;, (unsigned long long)start);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 2 : mem = dt_new(dt_root, name);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 2 : assert(mem);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 2 : dt_add_property_string(mem, &quot;device_type&quot;, &quot;memory&quot;);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 2 : dt_add_property(mem, &quot;reg&quot;, reg, sizeof(reg));</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 2 : free(name);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 2 : void add_chip_dev_associativity(struct dt_node *dev __attribute__((unused)))</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : {</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : uint64_t end;</a>
+<a name="103"><span class="lineNum"> 103 </span> : : int builtins;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : struct mem_region *r;</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : char *heap = real_malloc(TEST_HEAP_SIZE);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (unsigned long)heap;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : skiboot_os_reserve.len = 16384;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#address-cells&quot;, 2);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#size-cells&quot;, 2);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* Make sure we overlap the heap, at least. */</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : add_mem_node(0, (uint64_t)(heap + 0x100000000ULL));</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : add_mem_node((uint64_t)heap+0x100000000ULL , 0x100000000ULL);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : end = (uint64_t)(heap+ 0x100000000ULL + 0x100000000ULL);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : /* Now convert. */</a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : mem_region_init();</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1 : mem_dump_allocs();</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : builtins = 0;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 11 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* Regions must not overlap. */</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 10 : struct mem_region *r2, *pre = NULL, *post = NULL;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 110 : list_for_each(&amp;regions, r2, list) {</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 100 : if (r == r2)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 10 : continue;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 90 : assert(!overlaps(r, r2));</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /* But should have exact neighbours. */</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 110 : list_for_each(&amp;regions, r2, list) {</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 100 : if (r == r2)</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 10 : continue;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 90 : if (r2-&gt;start == r-&gt;start + r-&gt;len)</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 9 : post = r2;</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 90 : if (r2-&gt;start + r2-&gt;len == r-&gt;start)</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 9 : pre = r2;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 10 : assert(r-&gt;start == 0 || pre);</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 10 : assert(r-&gt;start + r-&gt;len == end || post);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 10 : if (r == &amp;skiboot_code_and_text ||</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 8 : r == &amp;skiboot_heap ||</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 7 : r == &amp;skiboot_after_heap ||</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 6 : r == &amp;skiboot_cpu_stacks ||</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : r == &amp;skiboot_os_reserve)</a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 5 : builtins++;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : else</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 5 : assert(r-&gt;type == REGION_MEMORY);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 10 : assert(mem_check(r));</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : }</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 1 : assert(builtins == 5);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 11 : while ((r = list_pop(&amp;regions, struct mem_region, list)) != NULL) {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 10 : if (r != &amp;skiboot_code_and_text &amp;&amp;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 8 : r != &amp;skiboot_heap &amp;&amp;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 7 : r != &amp;skiboot_after_heap &amp;&amp;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 6 : r != &amp;skiboot_os_reserve &amp;&amp;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : r != &amp;skiboot_cpu_stacks) {</a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 5 : free(r);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : }</a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 10 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 1 : assert(skiboot_heap.free_list_lock.lock_val == 0);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 1 : real_free(heap);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_next.c.func-sort-c.html b/coverage-report/core/test/run-mem_region_next.c.func-sort-c.html
new file mode 100644
index 0000000..8a6fbda
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_next.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_next.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_next.c<span style="font-size: 80%;"> (<a href="run-mem_region_next.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-mem_region_next.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#62">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#19">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#14">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#40">lock_caller</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#47">unlock</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#53">lock_held_by_me</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_next.c.func.html b/coverage-report/core/test/run-mem_region_next.c.func.html
new file mode 100644
index 0000000..1e2804d
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_next.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_next.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_next.c<span style="font-size: 80%;"> (<a href="run-mem_region_next.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-mem_region_next.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#40">lock_caller</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#53">lock_held_by_me</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#62">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#19">real_free</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#14">real_malloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_next.c.gcov.html#47">unlock</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_next.c.gcov.html b/coverage-report/core/test/run-mem_region_next.c.gcov.html
new file mode 100644
index 0000000..92b782d
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_next.c.gcov.html
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_next.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_next.c<span style="font-size: 80%;"> (source / <a href="run-mem_region_next.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2015-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : /* Use these before we override definitions below. */</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1 : static void *real_malloc(size_t size)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 1 : return malloc(size);</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : }</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : static void real_free(void *p)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : return free(p);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : #undef malloc</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #undef free</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : #define is_rodata(p) true</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #include &quot;../malloc.c&quot;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #include &quot;../device.c&quot;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #include &lt;assert.h&gt;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 3 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> : : (void)caller;</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 3 : assert(!l-&gt;lock_val);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 3 : l-&gt;lock_val++;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 3 : }</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 3 : void unlock(struct lock *l)</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 3 : assert(l-&gt;lock_val);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 3 : l-&gt;lock_val--;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 3 : }</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 6 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 6 : return l-&gt;lock_val;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define TEST_HEAP_ORDER 16</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : {</a>
+<a name="66"><span class="lineNum"> 66 </span> : : struct mem_region *r;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : char *test_heap;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : test_heap = real_malloc(TEST_HEAP_SIZE);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (unsigned long)test_heap;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : lock(&amp;mem_region_lock);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : /* empty regions */</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : r = mem_region_next(NULL);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : assert(!r);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : r = new_region(&quot;test.1&quot;, 0x1000, 0x1000, NULL, REGION_RESERVED);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : assert(add_region(r));</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : r = new_region(&quot;test.2&quot;, 0x2000, 0x1000, NULL, REGION_RESERVED);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : assert(add_region(r));</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : mem_regions_finalised = true;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : r = mem_region_next(NULL);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : assert(r);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : assert(r-&gt;start == 0x1000);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : assert(r-&gt;len == 0x1000);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : assert(r-&gt;type == REGION_RESERVED);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : r = mem_region_next(r);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : assert(r);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : assert(r-&gt;start == 0x2000);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : assert(r-&gt;len == 0x1000);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : assert(r-&gt;type == REGION_RESERVED);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : r = mem_region_next(r);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : assert(!r);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : unlock(&amp;mem_region_lock);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : real_free(test_heap);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_release_unused.c.func-sort-c.html b/coverage-report/core/test/run-mem_region_release_unused.c.func-sort-c.html
new file mode 100644
index 0000000..3a2f5e0
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_release_unused.c.func-sort-c.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_release_unused.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_release_unused.c<span style="font-size: 80%;"> (<a href="run-mem_region_release_unused.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">79</td>
+ <td class="headerCovTableEntry">82</td>
+ <td class="headerCovTableEntryHi">96.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">90.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-mem_region_release_unused.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#17">__realloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#22">__zalloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#88">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#67">add_mem_node</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#59">lock_held_by_me</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#92">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#48">lock_caller</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#54">unlock</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#12">__malloc</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#27">__free</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_release_unused.c.func.html b/coverage-report/core/test/run-mem_region_release_unused.c.func.html
new file mode 100644
index 0000000..021d64b
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_release_unused.c.func.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_release_unused.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_release_unused.c<span style="font-size: 80%;"> (<a href="run-mem_region_release_unused.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">79</td>
+ <td class="headerCovTableEntry">82</td>
+ <td class="headerCovTableEntryHi">96.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">90.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-mem_region_release_unused.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#27">__free</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#12">__malloc</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#17">__realloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#22">__zalloc</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#88">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#67">add_mem_node</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#48">lock_caller</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#59">lock_held_by_me</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#92">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused.c.gcov.html#54">unlock</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_release_unused.c.gcov.html b/coverage-report/core/test/run-mem_region_release_unused.c.gcov.html
new file mode 100644
index 0000000..1308ca4
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_release_unused.c.gcov.html
@@ -0,0 +1,262 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_release_unused.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_release_unused.c<span style="font-size: 80%;"> (source / <a href="run-mem_region_release_unused.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">79</td>
+ <td class="headerCovTableEntry">82</td>
+ <td class="headerCovTableEntryHi">96.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">90.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 11 : static void *__malloc(size_t size, const char *location __attribute__((unused)))</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 11 : return malloc(size);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : }</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : static void *__realloc(void *ptr, size_t size, const char *location __attribute__((unused)))</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : return realloc(ptr, size);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1 : static void *__zalloc(size_t size, const char *location __attribute__((unused)))</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : return calloc(size, 1);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : }</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 16 : static inline void __free(void *p, const char *location __attribute__((unused)))</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : {</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 16 : return free(p);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : /* We need mem_region to accept __location__ */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define is_rodata(p) true</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : /* But we need device tree to make copies of names. */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #undef is_rodata</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define is_rodata(p) false</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : #include &quot;../device.c&quot;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #include &lt;assert.h&gt;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 4 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> : : (void)caller;</a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 4 : l-&gt;lock_val++;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 4 : void unlock(struct lock *l)</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : {</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 4 : l-&gt;lock_val--;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : {</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : return l-&gt;lock_val;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define TEST_HEAP_ORDER 16</a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : static void add_mem_node(uint64_t start, uint64_t len)</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : {</a>
+<a name="71"><span class="lineNum"> 71 </span> : : struct dt_node *mem;</a>
+<a name="72"><span class="lineNum"> 72 </span> : : u64 reg[2];</a>
+<a name="73"><span class="lineNum"> 73 </span> : : char *name;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : name = (char*)malloc(sizeof(&quot;memory@&quot;) + STR_MAX_CHARS(reg[0]));</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : assert(name);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* reg contains start and length */</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : reg[0] = cpu_to_be64(start);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : reg[1] = cpu_to_be64(len);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : sprintf(name, &quot;memory@%llx&quot;, (long long)start);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : mem = dt_new(dt_root, name);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : dt_add_property_string(mem, &quot;device_type&quot;, &quot;memory&quot;);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : dt_add_property(mem, &quot;reg&quot;, reg, sizeof(reg));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : free(name);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : void add_chip_dev_associativity(struct dt_node *dev __attribute__((unused)))</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : {</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : {</a>
+<a name="96"><span class="lineNum"> 96 </span> : : uint64_t i;</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : struct mem_region *r, *other = NULL;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : void *other_mem;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : const char *last;</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (unsigned long)malloc(TEST_HEAP_SIZE);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : skiboot_os_reserve.len = 0;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#address-cells&quot;, 2);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#size-cells&quot;, 2);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : other_mem = malloc(1024*1024);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : add_mem_node((unsigned long)other_mem, 1024*1024);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : /* Now convert. */</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : mem_region_init();</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* Find our node to allocate from */</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 7 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 6 : if (region_start(r) == other_mem)</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : other = r;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : }</a>
+<a name="121"><span class="lineNum"> 121 </span> : : /* This could happen if skiboot addresses clashed with our alloc. */</a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : assert(other);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1 : assert(mem_check(other));</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> : : /* Allocate 1k from other region. */</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : lock(&amp;other-&gt;free_list_lock);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : mem_alloc(other, 1024, 1, &quot;1k&quot;);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : unlock(&amp;other-&gt;free_list_lock);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : mem_region_release_unused();</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : /* Now we expect it to be split. */</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : i = 0;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 8 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 7 : assert(mem_check(r));</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 7 : i++;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 7 : if (r == &amp;skiboot_os_reserve)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 6 : if (r == &amp;skiboot_code_and_text)</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 5 : if (r == &amp;skiboot_heap)</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 4 : if (r == &amp;skiboot_after_heap)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 3 : if (r == &amp;skiboot_cpu_stacks)</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 2 : if (r == other) {</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : assert(r-&gt;type == REGION_MEMORY);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : assert(r-&gt;len &lt; 1024 * 1024);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : } else {</a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : assert(r-&gt;type == REGION_OS);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : assert(r-&gt;start == other-&gt;start + other-&gt;len);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1 : assert(r-&gt;start + r-&gt;len == other-&gt;start + 1024*1024);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : }</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 1 : assert(i == 7);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : last = NULL;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 1 : if (last != r-&gt;name &amp;&amp;</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 1 : strncmp(r-&gt;name, NODE_REGION_PREFIX,</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : strlen(NODE_REGION_PREFIX)) == 0) {</a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* It's safe to cast away const as this is</a>
+<a name="166"><span class="lineNum"> 166 </span> : : * only going to happen in test code */</a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 1 : free((void*)r-&gt;name);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : }</a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : last = r-&gt;name;</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 1 : free((void *)(long)skiboot_heap.start);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 1 : free(other_mem);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func-sort-c.html b/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func-sort-c.html
new file mode 100644
index 0000000..5dbbf9a
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func-sort-c.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_release_unused_noalloc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_release_unused_noalloc.c<span style="font-size: 80%;"> (<a href="run-mem_region_release_unused_noalloc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">93.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-mem_region_release_unused_noalloc.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#17">__realloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#59">lock_held_by_me</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#92">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#22">__zalloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#88">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#67">add_mem_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#48">lock_caller</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#54">unlock</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#12">__malloc</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#27">__free</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func.html b/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func.html
new file mode 100644
index 0000000..eb8c574
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.func.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_release_unused_noalloc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_release_unused_noalloc.c<span style="font-size: 80%;"> (<a href="run-mem_region_release_unused_noalloc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">93.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-mem_region_release_unused_noalloc.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#27">__free</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#12">__malloc</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#17">__realloc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#22">__zalloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#88">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#67">add_mem_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#48">lock_caller</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#59">lock_held_by_me</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#92">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_release_unused_noalloc.c.gcov.html#54">unlock</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.gcov.html b/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.gcov.html
new file mode 100644
index 0000000..5960614
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_release_unused_noalloc.c.gcov.html
@@ -0,0 +1,241 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_release_unused_noalloc.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_release_unused_noalloc.c<span style="font-size: 80%;"> (source / <a href="run-mem_region_release_unused_noalloc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">93.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 19 : static void *__malloc(size_t size, const char *location __attribute__((unused)))</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 19 : return malloc(size);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : }</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : static void *__realloc(void *ptr, size_t size, const char *location __attribute__((unused)))</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : return realloc(ptr, size);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 2 : static void *__zalloc(size_t size, const char *location __attribute__((unused)))</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 2 : return calloc(size, 1);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : }</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 26 : static inline void __free(void *p, const char *location __attribute__((unused)))</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : {</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 26 : return free(p);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : /* We need mem_region to accept __location__ */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define is_rodata(p) true</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : /* But we need device tree to make copies of names. */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #undef is_rodata</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define is_rodata(p) false</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : #include &quot;../device.c&quot;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #include &lt;assert.h&gt;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 4 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> : : (void)caller;</a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 4 : l-&gt;lock_val++;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 4 : void unlock(struct lock *l)</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : {</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 4 : l-&gt;lock_val--;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineNoCov"> 0 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : {</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineNoCov"> 0 : return l-&gt;lock_val;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define TEST_HEAP_ORDER 16</a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 2 : static void add_mem_node(uint64_t start, uint64_t len)</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : {</a>
+<a name="71"><span class="lineNum"> 71 </span> : : struct dt_node *mem;</a>
+<a name="72"><span class="lineNum"> 72 </span> : : u64 reg[2];</a>
+<a name="73"><span class="lineNum"> 73 </span> : : char *name;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 2 : name = (char*)malloc(sizeof(&quot;memory@&quot;) + STR_MAX_CHARS(reg[0]));</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 2 : assert(name);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* reg contains start and length */</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 2 : reg[0] = cpu_to_be64(start);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 2 : reg[1] = cpu_to_be64(len);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 2 : sprintf(name, &quot;memory@%llx&quot;, (long long)start);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : mem = dt_new(dt_root, name);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 2 : dt_add_property_string(mem, &quot;device_type&quot;, &quot;memory&quot;);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 2 : dt_add_property(mem, &quot;reg&quot;, reg, sizeof(reg));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 2 : free(name);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 2 : void add_chip_dev_associativity(struct dt_node *dev __attribute__((unused)))</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : {</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : {</a>
+<a name="96"><span class="lineNum"> 96 </span> : : uint64_t i;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : struct mem_region *r;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : const char *last;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : skiboot_heap.start = 0;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : skiboot_os_reserve.start = 0;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : skiboot_os_reserve.len = 0;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#address-cells&quot;, 2);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#size-cells&quot;, 2);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : add_mem_node(0, 0x100000000ULL);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : add_mem_node(0x100000000ULL, 0x100000000ULL);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : mem_region_init();</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : mem_region_release_unused();</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : assert(mem_check(&amp;skiboot_heap));</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : /* Now we expect it to be split. */</a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : i = 0;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 10 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 9 : assert(mem_check(r));</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 9 : i++;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 9 : if (r == &amp;skiboot_os_reserve)</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 8 : if (r == &amp;skiboot_code_and_text)</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 7 : if (r == &amp;skiboot_heap)</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 6 : if (r == &amp;skiboot_after_heap)</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 5 : if (r == &amp;skiboot_cpu_stacks)</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 1 : continue;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> : : /* the memory nodes should all be available to the OS now */</a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 4 : assert(r-&gt;type == REGION_OS);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : }</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : assert(i == 9);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : last = NULL;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 10 : list_for_each(&amp;regions, r, list) {</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 9 : if (last != r-&gt;name &amp;&amp;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 7 : strncmp(r-&gt;name, NODE_REGION_PREFIX,</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : strlen(NODE_REGION_PREFIX)) == 0) {</a>
+<a name="145"><span class="lineNum"> 145 </span> : : /* It's safe to cast away the const as</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * this never happens at runtime,</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * only in test and only for valgrind</a>
+<a name="148"><span class="lineNum"> 148 </span> : : */</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 2 : free((void*)r-&gt;name);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 2 : last = r-&gt;name;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : }</a>
+<a name="152"><span class="lineNum"> 152 </span> : : }</a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_reservations.c.func-sort-c.html b/coverage-report/core/test/run-mem_region_reservations.c.func-sort-c.html
new file mode 100644
index 0000000..7401df4
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_reservations.c.func-sort-c.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_reservations.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_reservations.c<span style="font-size: 80%;"> (<a href="run-mem_region_reservations.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-mem_region_reservations.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#87">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#66">add_mem_node</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#142">check_node_reservations</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#101">check_property_reservations</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#177">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#17">real_free</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#12">real_malloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#58">lock_held_by_me</a></td>
+ <td class="coverFnHi">167</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#45">lock_caller</a></td>
+ <td class="coverFnHi">175</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#52">unlock</a></td>
+ <td class="coverFnHi">175</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_reservations.c.func.html b/coverage-report/core/test/run-mem_region_reservations.c.func.html
new file mode 100644
index 0000000..f123289
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_reservations.c.func.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_reservations.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_reservations.c<span style="font-size: 80%;"> (<a href="run-mem_region_reservations.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-mem_region_reservations.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#87">add_chip_dev_associativity</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#66">add_mem_node</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#142">check_node_reservations</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#101">check_property_reservations</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#45">lock_caller</a></td>
+ <td class="coverFnHi">175</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#58">lock_held_by_me</a></td>
+ <td class="coverFnHi">167</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#177">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#17">real_free</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#12">real_malloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-mem_region_reservations.c.gcov.html#52">unlock</a></td>
+ <td class="coverFnHi">175</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-mem_region_reservations.c.gcov.html b/coverage-report/core/test/run-mem_region_reservations.c.gcov.html
new file mode 100644
index 0000000..bfce88f
--- /dev/null
+++ b/coverage-report/core/test/run-mem_region_reservations.c.gcov.html
@@ -0,0 +1,313 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-mem_region_reservations.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-mem_region_reservations.c<span style="font-size: 80%;"> (source / <a href="run-mem_region_reservations.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define BITS_PER_LONG (sizeof(long) * 8)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;dummy-cpu.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 2 : static void *real_malloc(size_t size)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 2 : return malloc(size);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : }</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 2 : static void real_free(void *p)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 2 : return free(p);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #undef malloc</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #undef free</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #undef realloc</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* We need mem_region to accept __location__ */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #define is_rodata(p) true</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #include &quot;../mem_region.c&quot;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #include &quot;../malloc.c&quot;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : /* But we need device tree to make copies of names. */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #undef is_rodata</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define is_rodata(p) false</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #include &quot;../../libc/string/strdup.c&quot;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : #include &quot;../device.c&quot;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #include &lt;assert.h&gt;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 175 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : {</a>
+<a name="49"><span class="lineNum"> 49 </span> : : (void)caller;</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 175 : assert(!l-&gt;lock_val);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 175 : l-&gt;lock_val++;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 175 : }</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 175 : void unlock(struct lock *l)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 175 : assert(l-&gt;lock_val);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 175 : l-&gt;lock_val--;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 175 : }</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 167 : bool lock_held_by_me(struct lock *l)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 167 : return l-&gt;lock_val;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : #define TEST_HEAP_ORDER 16</a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define TEST_HEAP_SIZE (1ULL &lt;&lt; TEST_HEAP_ORDER)</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 1 : static void add_mem_node(uint64_t start, uint64_t len)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : {</a>
+<a name="70"><span class="lineNum"> 70 </span> : : struct dt_node *mem;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : u64 reg[2];</a>
+<a name="72"><span class="lineNum"> 72 </span> : : char *name;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : name = (char*)malloc(sizeof(&quot;memory@&quot;) + STR_MAX_CHARS(reg[0]));</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : assert(name);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : /* reg contains start and length */</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : reg[0] = cpu_to_be64(start);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : reg[1] = cpu_to_be64(len);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : sprintf(name, &quot;memory@%llx&quot;, (long long)start);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : mem = dt_new(dt_root, name);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : dt_add_property_string(mem, &quot;device_type&quot;, &quot;memory&quot;);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : dt_add_property(mem, &quot;reg&quot;, reg, sizeof(reg));</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : free(name);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : void add_chip_dev_associativity(struct dt_node *dev __attribute__((unused)))</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> : : static struct {</a>
+<a name="94"><span class="lineNum"> 94 </span> : : const char *name;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : uint64_t addr;</a>
+<a name="96"><span class="lineNum"> 96 </span> : : bool found;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : } test_regions[] = {</a>
+<a name="98"><span class="lineNum"> 98 </span> : : { &quot;test.1&quot;, 0x1000, false },</a>
+<a name="99"><span class="lineNum"> 99 </span> : : { &quot;test.2&quot;, 0x2000, false },</a>
+<a name="100"><span class="lineNum"> 100 </span> : : { &quot;test.3&quot;, 0x4000, false },</a>
+<a name="101"><span class="lineNum"> 101 </span> : : };</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : static void check_property_reservations(void)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> : : const struct dt_property *names, *ranges;</a>
+<a name="106"><span class="lineNum"> 106 </span> : : unsigned int i, l;</a>
+<a name="107"><span class="lineNum"> 107 </span> : : const char *name;</a>
+<a name="108"><span class="lineNum"> 108 </span> : : uint64_t *rangep;</a>
+<a name="109"><span class="lineNum"> 109 </span> : : const char *at;</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> : : /* check dt properties */</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : names = dt_find_property(dt_root, &quot;reserved-names&quot;);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : ranges = dt_find_property(dt_root, &quot;reserved-ranges&quot;);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : assert(names &amp;&amp; ranges);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : /* walk through names &amp; ranges properies, ensuring that the test</a>
+<a name="118"><span class="lineNum"> 118 </span> : : * regions are all present */</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : for (name = names-&gt;prop, rangep = (uint64_t *)ranges-&gt;prop;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 9 : name &lt; names-&gt;prop + names-&gt;len;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 8 : name += l, rangep += 2) {</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : uint64_t addr;</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 8 : addr = dt_get_number(rangep, 2);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 8 : l = strlen(name) + 1;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 32 : for (i = 0; i &lt; ARRAY_SIZE(test_regions); i++) {</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 24 : at = strchr(name, '@');</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 48 : if (strncmp(test_regions[i].name, name,</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 24 : at ? at-name: strlen(name)))</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 21 : continue;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 3 : assert(test_regions[i].addr == addr);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 3 : assert(!test_regions[i].found);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 3 : test_regions[i].found = true;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : }</a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 4 : for (i = 0; i &lt; ARRAY_SIZE(test_regions); i++) {</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 3 : assert(test_regions[i].found);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 3 : test_regions[i].found = false;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : }</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : static void check_node_reservations(void)</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : {</a>
+<a name="146"><span class="lineNum"> 146 </span> : : struct dt_node *parent, *node;</a>
+<a name="147"><span class="lineNum"> 147 </span> : : unsigned int i;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : parent = dt_find_by_name(dt_root, &quot;reserved-memory&quot;);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : assert(parent);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_cell(parent, &quot;#address-cells&quot;, 0) == 2);</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : assert(dt_prop_get_cell(parent, &quot;#size-cells&quot;, 0) == 2);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : dt_require_property(parent, &quot;ranges&quot;, 0);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 9 : dt_for_each_child(parent, node) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : uint64_t addr, size;</a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 8 : addr = dt_get_address(node, 0, &amp;size);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : </a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 32 : for (i = 0; i &lt; ARRAY_SIZE(test_regions); i++) {</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 24 : if (strncmp(test_regions[i].name, node-&gt;name,</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : strlen(test_regions[i].name)))</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 21 : continue;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 3 : assert(!test_regions[i].found);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 3 : assert(test_regions[i].addr == addr);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 3 : assert(size == 0x1000);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 3 : test_regions[i].found = true;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 4 : for (i = 0; i &lt; ARRAY_SIZE(test_regions); i++) {</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 3 : assert(test_regions[i].found);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 3 : test_regions[i].found = false;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : {</a>
+<a name="181"><span class="lineNum"> 181 </span> : : struct mem_region *r;</a>
+<a name="182"><span class="lineNum"> 182 </span> : : unsigned int i;</a>
+<a name="183"><span class="lineNum"> 183 </span> : : void *buf;</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> : : /* Use malloc for the heap, so valgrind can find issues. */</a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : skiboot_heap.start = (long)real_malloc(TEST_HEAP_SIZE);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 1 : skiboot_heap.len = TEST_HEAP_SIZE;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 1 : skiboot_os_reserve.len = skiboot_heap.start;</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#address-cells&quot;, 2);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 1 : dt_add_property_cells(dt_root, &quot;#size-cells&quot;, 2);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 1 : buf = real_malloc(1024*1024);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1 : add_mem_node((unsigned long)buf, 1024*1024);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> : : /* add pre-init reservations */</a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 4 : for (i = 0; i &lt; ARRAY_SIZE(test_regions); i++)</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 3 : mem_reserve_fw(test_regions[i].name,</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : test_regions[i].addr, 0x1000);</a>
+<a name="201"><span class="lineNum"> 201 </span> : : </a>
+<a name="202"><span class="lineNum"> 202 </span> : : /* Now convert. */</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 1 : mem_region_init();</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> : : /* add a post-init reservation */</a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 1 : mem_reserve_fw(&quot;test.4&quot;, 0x5000, 0x1000);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> : : /* release unused */</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 1 : mem_region_release_unused();</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> : : /* and create reservations */</a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 1 : mem_region_add_dt_reserved();</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> : : /* ensure we can't create further reservations */</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 1 : r = new_region(&quot;test.5&quot;, 0x5000, 0x1000, NULL, REGION_RESERVED);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 1 : assert(!add_region(r));</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* check old property-style reservations */</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 1 : check_property_reservations();</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : /* and new node-style reservations */</a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 1 : check_node_reservations();</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 1 : dt_free(dt_root);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1 : real_free(buf);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1 : real_free((void *)(long)skiboot_heap.start);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-msg.c.func-sort-c.html b/coverage-report/core/test/run-msg.c.func-sort-c.html
new file mode 100644
index 0000000..66716e1
--- /dev/null
+++ b/coverage-report/core/test/run-msg.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-msg.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-msg.c<span style="font-size: 80%;"> (<a href="run-msg.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntry">156</td>
+ <td class="headerCovTableEntryHi">98.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-msg.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#68">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#52">callback</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#17">zalloc</a></td>
+ <td class="coverFnHi">32</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#45">opal_update_pending_evt</a></td>
+ <td class="coverFnHi">54</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#32">lock_caller</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#39">unlock</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#58">list_count</a></td>
+ <td class="coverFnHi">81</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-msg.c.func.html b/coverage-report/core/test/run-msg.c.func.html
new file mode 100644
index 0000000..6e15e0e
--- /dev/null
+++ b/coverage-report/core/test/run-msg.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-msg.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-msg.c<span style="font-size: 80%;"> (<a href="run-msg.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntry">156</td>
+ <td class="headerCovTableEntryHi">98.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-msg.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#52">callback</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#58">list_count</a></td>
+ <td class="coverFnHi">81</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#32">lock_caller</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#68">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#45">opal_update_pending_evt</a></td>
+ <td class="coverFnHi">54</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#39">unlock</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-msg.c.gcov.html#17">zalloc</a></td>
+ <td class="coverFnHi">32</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-msg.c.gcov.html b/coverage-report/core/test/run-msg.c.gcov.html
new file mode 100644
index 0000000..6690252
--- /dev/null
+++ b/coverage-report/core/test/run-msg.c.gcov.html
@@ -0,0 +1,366 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-msg.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-msg.c<span style="font-size: 80%;"> (source / <a href="run-msg.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntry">156</td>
+ <td class="headerCovTableEntryHi">98.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;errno.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : static bool zalloc_should_fail = false;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : static int zalloc_should_fail_after = 0;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : /* Fake top_of_ram -- needed for API's */</a>
+<a name="17"><span class="lineNum"> 17 </span> : : unsigned long top_of_ram = 0xffffffffffffffffULL;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 32 : static void *zalloc(size_t size)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 32 : if (zalloc_should_fail &amp;&amp; zalloc_should_fail_after == 0) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 2 : errno = ENOMEM;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 30 : if (zalloc_should_fail_after &gt; 0)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 3 : zalloc_should_fail_after--;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 30 : return calloc(size, 1);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : #include &quot;../opal-msg.c&quot;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 80 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : {</a>
+<a name="36"><span class="lineNum"> 36 </span> : : (void)caller;</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 80 : assert(!l-&gt;lock_val);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 80 : l-&gt;lock_val = 1;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 80 : }</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 80 : void unlock(struct lock *l)</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : {</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 80 : assert(l-&gt;lock_val);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 80 : l-&gt;lock_val = 0;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 80 : }</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 54 : void opal_update_pending_evt(uint64_t evt_mask, uint64_t evt_values)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : {</a>
+<a name="49"><span class="lineNum"> 49 </span> : : (void)evt_mask;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : (void)evt_values;</a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 54 : }</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : static long magic = 8097883813087437089UL;</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 2 : static void callback(void *data, int status)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 2 : assert((status == OPAL_SUCCESS || status == OPAL_PARTIAL));</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 2 : assert(*(uint64_t *)data == magic);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 81 : static size_t list_count(struct list_head *list)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 81 : size_t count = 0;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : struct opal_msg_entry *dummy;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1073 : list_for_each(list, dummy, link)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 992 : count++;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 81 : return count;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> : : struct opal_msg_entry* entry;</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : int free_size = OPAL_MAX_MSGS;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : int nfree = free_size;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : int npending = 0;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : int r;</a>
+<a name="77"><span class="lineNum"> 77 </span> : : static struct opal_msg m;</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : uint64_t *m_ptr = (uint64_t *)&amp;m;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : zalloc_should_fail = true;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : zalloc_should_fail_after = 3;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : opal_init_msg();</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : zalloc_should_fail = false;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : opal_init_msg();</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == npending);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : /* Callback. */</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(0, &amp;magic, callback, (u64)0, (u64)1, (u64)2);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == --nfree);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : assert(m.params[0] == 0);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : assert(m.params[1] == 1);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : assert(m.params[2] == 2);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == --npending);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == ++nfree);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* No params. */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(0, NULL, NULL);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == --nfree);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == --npending);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == ++nfree);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /* &gt; 8 params (ARRAY_SIZE(entry-&gt;msg.params) */</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(0, NULL, NULL, 0, 1, 2, 3, 4, 5, 6, 7, 0xBADDA7A);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : assert(r == OPAL_PARTIAL);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == --npending);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> : : /* Return OPAL_PARTIAL to callback */</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(0, &amp;magic, callback, 0, 1, 2, 3, 4, 5, 6, 7, 0xBADDA7A);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 1 : assert(r == OPAL_PARTIAL);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == --npending);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> : : /* return OPAL_PARAMETER */</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 1 : r = _opal_queue_msg(0, NULL, NULL, OPAL_MSG_SIZE, m_ptr);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 1 : assert(r == OPAL_PARAMETER);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : assert(m.params[0] == 0);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : assert(m.params[1] == 1);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : assert(m.params[2] == 2);</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : assert(m.params[3] == 3);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : assert(m.params[4] == 4);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1 : assert(m.params[5] == 5);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 1 : assert(m.params[6] == 6);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 1 : assert(m.params[7] == 7);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> : : /* 8 params (ARRAY_SIZE(entry-&gt;msg.params) */</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(0, NULL, NULL, 0, 10, 20, 30, 40, 50, 60, 70);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == --nfree);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == --npending);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == ++nfree);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 1 : assert(m.params[0] == 0);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 1 : assert(m.params[1] == 10);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 1 : assert(m.params[2] == 20);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 1 : assert(m.params[3] == 30);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 1 : assert(m.params[4] == 40);</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 1 : assert(m.params[5] == 50);</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 1 : assert(m.params[6] == 60);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 1 : assert(m.params[7] == 70);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> : : /* Full list (no free nodes in pending). */</a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 25 : while (nfree &gt; 0) {</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 24 : r = opal_queue_msg(OPAL_MSG_ASYNC_COMP, NULL, NULL);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 24 : assert(r == 0);</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 24 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 24 : assert(list_count(&amp;msg_free_list) == --nfree);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : }</a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == 0);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 1 : assert(nfree == 0);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 1 : assert(npending == OPAL_MAX_MSGS);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(OPAL_MSG_ASYNC_COMP, NULL, NULL);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == OPAL_MAX_MSGS+1);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> : : /* Make zalloc fail to test error handling. */</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 1 : zalloc_should_fail = true;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(OPAL_MSG_ASYNC_COMP, NULL, NULL);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 1 : assert(r == OPAL_RESOURCE);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == OPAL_MAX_MSGS+1);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == npending);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> : : /* Empty list (no nodes). */</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 26 : while(!list_empty(&amp;msg_pending_list)) {</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 25 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 25 : assert(r == 0);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 25 : npending--;</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 25 : nfree++;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : }</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == npending);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == nfree);</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 1 : assert(npending == 0);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 1 : assert(nfree == OPAL_MAX_MSGS+1);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 1 : r = opal_queue_msg(OPAL_MSG_ASYNC_COMP, NULL, NULL);</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_pending_list) == ++npending);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 1 : assert(list_count(&amp;msg_free_list) == --nfree);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> : : /* Request invalid size. */</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m) - 1);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 1 : assert(r == OPAL_PARAMETER);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> : : /* Pass null buffer. */</a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 1 : r = opal_get_msg(NULL, sizeof(m));</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : assert(r == OPAL_PARAMETER);</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : </a>
+<a name="234"><span class="lineNum"> 234 </span> : : /* Get msg when none are pending. */</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 1 : assert(r == 0);</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 1 : r = opal_get_msg(m_ptr, sizeof(m));</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 1 : assert(r == OPAL_RESOURCE);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> : : #define test_queue_num(type, val) \</a>
+<a name="242"><span class="lineNum"> 242 </span> : : r = opal_queue_msg(0, NULL, NULL, \</a>
+<a name="243"><span class="lineNum"> 243 </span> : : (type)val, (type)val, (type)val, (type)val, \</a>
+<a name="244"><span class="lineNum"> 244 </span> : : (type)val, (type)val, (type)val, (type)val); \</a>
+<a name="245"><span class="lineNum"> 245 </span> : : assert(r == 0); \</a>
+<a name="246"><span class="lineNum"> 246 </span> : : opal_get_msg(m_ptr, sizeof(m)); \</a>
+<a name="247"><span class="lineNum"> 247 </span> : : assert(r == OPAL_SUCCESS); \</a>
+<a name="248"><span class="lineNum"> 248 </span> : : assert(m.params[0] == (type)val); \</a>
+<a name="249"><span class="lineNum"> 249 </span> : : assert(m.params[1] == (type)val); \</a>
+<a name="250"><span class="lineNum"> 250 </span> : : assert(m.params[2] == (type)val); \</a>
+<a name="251"><span class="lineNum"> 251 </span> : : assert(m.params[3] == (type)val); \</a>
+<a name="252"><span class="lineNum"> 252 </span> : : assert(m.params[4] == (type)val); \</a>
+<a name="253"><span class="lineNum"> 253 </span> : : assert(m.params[5] == (type)val); \</a>
+<a name="254"><span class="lineNum"> 254 </span> : : assert(m.params[6] == (type)val); \</a>
+<a name="255"><span class="lineNum"> 255 </span> : : assert(m.params[7] == (type)val)</a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> : : /* Test types of various widths */</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 1 : test_queue_num(u64, -1);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 1 : test_queue_num(s64, -1);</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 1 : test_queue_num(u32, -1);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 1 : test_queue_num(s32, -1);</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 1 : test_queue_num(u16, -1);</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 1 : test_queue_num(s16, -1);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 1 : test_queue_num(u8, -1);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 1 : test_queue_num(s8, -1);</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : /* Clean up the list to keep valgrind happy. */</a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 26 : while(!list_empty(&amp;msg_free_list)) {</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 25 : entry = list_pop(&amp;msg_free_list, struct opal_msg_entry, link);</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 25 : assert(entry);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 25 : free(entry);</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 1 : while(!list_empty(&amp;msg_pending_list)) {</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : entry = list_pop(&amp;msg_pending_list, struct opal_msg_entry, link);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : assert(entry);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : free(entry);</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-nvram-format.c.func-sort-c.html b/coverage-report/core/test/run-nvram-format.c.func-sort-c.html
new file mode 100644
index 0000000..1626bc4
--- /dev/null
+++ b/coverage-report/core/test/run-nvram-format.c.func-sort-c.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-nvram-format.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-nvram-format.c<span style="font-size: 80%;"> (<a href="run-nvram-format.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">88</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntryHi">97.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-nvram-format.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#8">nvram_wait_for_load</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#35">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#18">nvram_has_loaded</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#23">nvram_reset</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#13">nvram_validate</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-nvram-format.c.func.html b/coverage-report/core/test/run-nvram-format.c.func.html
new file mode 100644
index 0000000..bc11f8d
--- /dev/null
+++ b/coverage-report/core/test/run-nvram-format.c.func.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-nvram-format.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-nvram-format.c<span style="font-size: 80%;"> (<a href="run-nvram-format.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">88</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntryHi">97.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-nvram-format.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#35">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#18">nvram_has_loaded</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#23">nvram_reset</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#13">nvram_validate</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-nvram-format.c.gcov.html#8">nvram_wait_for_load</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-nvram-format.c.gcov.html b/coverage-report/core/test/run-nvram-format.c.gcov.html
new file mode 100644
index 0000000..a304d34
--- /dev/null
+++ b/coverage-report/core/test/run-nvram-format.c.gcov.html
@@ -0,0 +1,252 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-nvram-format.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-nvram-format.c<span style="font-size: 80%;"> (source / <a href="run-nvram-format.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">88</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntryHi">97.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &quot;../nvram-format.c&quot;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> :<span class="lineNoCov"> 0 : bool nvram_wait_for_load(void)</span></a>
+<a name="11"><span class="lineNum"> 11 </span> : : {</a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : }</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 5 : bool nvram_validate(void)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 5 : return true;</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 5 : bool nvram_has_loaded(void)</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 5 : return true;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 5 : static char *nvram_reset(void *nvram_image, int size)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : {</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 5 : struct chrp_nvram_hdr *h = nvram_image;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* entire partition used by one key */</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 5 : assert(nvram_format(nvram_image, size) == 0);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 5 : memset((char *) h + sizeof(*h), 0, NVRAM_SIZE_FW_PRIV - sizeof(*h));</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 5 : assert(nvram_check(nvram_image, size) == 0);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 5 : return (char *) h + sizeof(*h);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : {</a>
+<a name="39"><span class="lineNum"> 39 </span> : : char *nvram_image;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : size_t sz;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : struct chrp_nvram_hdr *h;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : char *data;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : const char *result;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : /* 1024 bytes is too small for our NVRAM */</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : nvram_image = malloc(1024);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 1024)!=0);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : free(nvram_image);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : /* 4096 bytes is too small for our NVRAM */</a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : nvram_image = malloc(4096);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 4096)!=0);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : free(nvram_image);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : /* 64k is too small for our NVRAM */</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : nvram_image = malloc(0x10000);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 0x10000)!=0);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : free(nvram_image);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : /* 68k is too small for our NVRAM */</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : nvram_image = malloc(68*1024);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 68*1024)!=0);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : free(nvram_image);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : /* 68k+16 bytes (nvram header) should generate empty free space */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : sz = NVRAM_SIZE_COMMON + NVRAM_SIZE_FW_PRIV</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : + sizeof(struct chrp_nvram_hdr);</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 1 : nvram_image = malloc(sz);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, sz)==0);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image, sz)==0);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : assert(nvram_image[sz-14]==0);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : assert(nvram_image[sz-13]==1);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : h = (struct chrp_nvram_hdr*)(&amp;nvram_image[NVRAM_SIZE_COMMON + NVRAM_SIZE_FW_PRIV]);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : assert(memcmp(h-&gt;name, &quot;wwwwwwwwwwww&quot;, 12)==0);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : free(nvram_image);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : /* 128k NVRAM check */</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : nvram_image = malloc(128*1024);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 128*1024)==0);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image,128*1024)==0);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* Now, we corrupt it */</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : nvram_image[0] = 0;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image,128*1024) != 0);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /* Does our NUL checking work? */</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 128 * 1024) == 0);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : h = (struct chrp_nvram_hdr *) nvram_image;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : memset((char *) h + sizeof(*h), 0xFF, be16_to_cpu(h-&gt;len) * 16 - sizeof(*h));</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image, 128 * 1024) != 0);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 128*1024)==0);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : /* corrupt the length of the partition */</a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : nvram_image[2] = 0;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : nvram_image[3] = 0;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image,128*1024) != 0);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 128*1024)==0);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : /* corrupt the length of the partition */</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : nvram_image[2] = 0;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : nvram_image[3] = 0;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : /* but reset checksum! */</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : h = (struct chrp_nvram_hdr*)nvram_image;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : h-&gt;cksum = chrp_nv_cksum(h);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image,128*1024) != 0);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 128*1024)==0);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : /* make the length insanely beyond end of nvram */</a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : nvram_image[2] = 42;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : nvram_image[3] = 32;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : /* but reset checksum! */</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : h = (struct chrp_nvram_hdr*)nvram_image;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : h-&gt;cksum = chrp_nv_cksum(h);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image,128*1024) != 0);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 128*1024)==0);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : /* remove skiboot partition */</a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : nvram_image[12] = '\0';</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : /* but reset checksum! */</a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : h = (struct chrp_nvram_hdr*)nvram_image;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 1 : h-&gt;cksum = chrp_nv_cksum(h);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image,128*1024) != 0);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : assert(nvram_format(nvram_image, 128*1024)==0);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : /* remove common partition */</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : nvram_image[NVRAM_SIZE_FW_PRIV+5] = '\0';</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : /* but reset checksum! */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : h = (struct chrp_nvram_hdr*)(&amp;nvram_image[NVRAM_SIZE_FW_PRIV]);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : h-&gt;cksum = chrp_nv_cksum(h);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : assert(nvram_check(nvram_image,128*1024) != 0);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* test nvram_query() */</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : /* does an empty partition break us? */</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : data = nvram_reset(nvram_image, 128*1024);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : assert(nvram_query_safe(&quot;test&quot;) == NULL);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : /* does a zero length key break us? */</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 1 : data = nvram_reset(nvram_image, 128*1024);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : data[0] = '=';</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 1 : assert(nvram_query_safe(&quot;test&quot;) == NULL);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : /* does a missing = break us? */</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : data = nvram_reset(nvram_image, 128*1024);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1 : data[0] = 'a';</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 1 : assert(nvram_query_safe(&quot;test&quot;) == NULL);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> : : /* does an empty value break us? */</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : data = nvram_reset(nvram_image, 128*1024);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : data[0] = 'a';</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : data[1] = '=';</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : result = nvram_query_safe(&quot;a&quot;);</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : assert(result);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : assert(strlen(result) == 0);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> : : /* do we trip over malformed keys? */</a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 1 : data = nvram_reset(nvram_image, 128*1024);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : #define TEST_1 &quot;a\0a=\0test=test\0&quot;</a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 1 : memcpy(data, TEST_1, sizeof(TEST_1));</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : result = nvram_query_safe(&quot;test&quot;);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1 : assert(result);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 1 : assert(strcmp(result, &quot;test&quot;) == 0);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 1 : free(nvram_image);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pci-quirk.c.func-sort-c.html b/coverage-report/core/test/run-pci-quirk.c.func-sort-c.html
new file mode 100644
index 0000000..f41d772
--- /dev/null
+++ b/coverage-report/core/test/run-pci-quirk.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pci-quirk.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pci-quirk.c<span style="font-size: 80%;"> (<a href="run-pci-quirk.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryLo">70.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-pci-quirk.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#27">__dt_add_property_cells</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#22">ast_ahb_readl</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#17">ast_sio_is_enabled</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#42">pci_add_cfg_reg_filter</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#73">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#57">test_fixup</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pci-quirk.c.func.html b/coverage-report/core/test/run-pci-quirk.c.func.html
new file mode 100644
index 0000000..58baa85
--- /dev/null
+++ b/coverage-report/core/test/run-pci-quirk.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pci-quirk.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pci-quirk.c<span style="font-size: 80%;"> (<a href="run-pci-quirk.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryLo">70.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-pci-quirk.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#27">__dt_add_property_cells</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#22">ast_ahb_readl</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#17">ast_sio_is_enabled</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#73">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#42">pci_add_cfg_reg_filter</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pci-quirk.c.gcov.html#57">test_fixup</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pci-quirk.c.gcov.html b/coverage-report/core/test/run-pci-quirk.c.gcov.html
new file mode 100644
index 0000000..30343be
--- /dev/null
+++ b/coverage-report/core/test/run-pci-quirk.c.gcov.html
@@ -0,0 +1,183 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pci-quirk.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pci-quirk.c<span style="font-size: 80%;"> (source / <a href="run-pci-quirk.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryLo">70.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2018 IBM Corp</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;assert.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : /* Stubs for quirk_astbmc_vga() */</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : struct dt_property;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct dt_node;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : static struct bmc_platform fake_bmc;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : const struct bmc_platform *bmc_platform = &amp;fake_bmc;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : static int ast_sio_is_enabled(void)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : static uint32_t ast_ahb_readl(uint32_t reg)</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : return reg;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : }</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : static struct dt_property *__dt_add_property_cells(</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : struct dt_node *node __unused, const char *name __unused,</a>
+<a name="31"><span class="lineNum"> 31 </span> : : int count __unused, ...)</a>
+<a name="32"><span class="lineNum"> 32 </span> : : {</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : return (void *)0;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : struct pci_device;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct pci_cfg_reg_filter;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : typedef int64_t (*pci_cfg_reg_func)(void *dev,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct pci_cfg_reg_filter *pcrf,</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t offset, uint32_t len,</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint32_t *data, bool write);</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : static struct pci_cfg_reg_filter *pci_add_cfg_reg_filter(</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct pci_device *pd __unused,</a>
+<a name="46"><span class="lineNum"> 46 </span> : : uint32_t start __unused,</a>
+<a name="47"><span class="lineNum"> 47 </span> : : uint32_t len __unused,</a>
+<a name="48"><span class="lineNum"> 48 </span> : : uint32_t flags __unused,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : pci_cfg_reg_func func __unused)</a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : #include &quot;../pci-quirk.c&quot;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : struct pci_device test_pd;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : int test_fixup_ran;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : static void test_fixup(struct phb *phb __unused, struct pci_device *pd __unused)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : assert(PCI_VENDOR_ID(pd-&gt;vdid) == 0x1a03);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : assert(PCI_DEVICE_ID(pd-&gt;vdid) == 0x2000);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : test_fixup_ran = 1;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : /* Quirks are: {fixup function, vendor ID, (device ID or PCI_ANY_ID)} */</a>
+<a name="67"><span class="lineNum"> 67 </span> : : static const struct pci_quirk test_quirk_table[] = {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : /* ASPEED 2400 VGA device */</a>
+<a name="69"><span class="lineNum"> 69 </span> : : { 0x1a03, 0x2000, &amp;test_fixup },</a>
+<a name="70"><span class="lineNum"> 70 </span> : : { 0, 0, NULL }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : };</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : #define PCI_COMPOSE_VDID(vendor, device) (((device) &lt;&lt; 16) | (vendor))</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : {</a>
+<a name="77"><span class="lineNum"> 77 </span> : : /* Unrecognised vendor and device ID */</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : test_pd.vdid = PCI_COMPOSE_VDID(0xabcd, 0xef01);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : __pci_handle_quirk(NULL, &amp;test_pd, test_quirk_table);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : assert(test_fixup_ran == 0);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* Unrecognised vendor ID, matching device ID */</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : test_pd.vdid = PCI_COMPOSE_VDID(0xabcd, 0x2000);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : __pci_handle_quirk(NULL, &amp;test_pd, test_quirk_table);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : assert(test_fixup_ran == 0);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> : : /* Matching vendor ID, unrecognised device ID */</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : test_pd.vdid = PCI_COMPOSE_VDID(0x1a03, 0xef01);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : __pci_handle_quirk(NULL, &amp;test_pd, test_quirk_table);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : assert(test_fixup_ran == 0);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : /* Matching vendor and device ID */</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : test_pd.vdid = PCI_COMPOSE_VDID(0x1a03, 0x2000);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : __pci_handle_quirk(NULL, &amp;test_pd, test_quirk_table);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : assert(test_fixup_ran == 1);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pel.c.func-sort-c.html b/coverage-report/core/test/run-pel.c.func-sort-c.html
new file mode 100644
index 0000000..0909404
--- /dev/null
+++ b/coverage-report/core/test/run-pel.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pel.c<span style="font-size: 80%;"> (<a href="run-pel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-pel.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pel.c.gcov.html#51">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pel.c.gcov.html#29">fake_is_rodata</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pel.c.gcov.html#42">rtc_cache_get_datetime</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pel.c.func.html b/coverage-report/core/test/run-pel.c.func.html
new file mode 100644
index 0000000..5ef3e7b
--- /dev/null
+++ b/coverage-report/core/test/run-pel.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pel.c<span style="font-size: 80%;"> (<a href="run-pel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-pel.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pel.c.gcov.html#29">fake_is_rodata</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pel.c.gcov.html#51">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pel.c.gcov.html#42">rtc_cache_get_datetime</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pel.c.gcov.html b/coverage-report/core/test/run-pel.c.gcov.html
new file mode 100644
index 0000000..e3476f7
--- /dev/null
+++ b/coverage-report/core/test/run-pel.c.gcov.html
@@ -0,0 +1,205 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pel.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pel.c<span style="font-size: 80%;"> (source / <a href="run-pel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Test for our PEL record generation. Currently this doesn't actually</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * test that the records we generate are correct, but it at least lets</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * us run valgrind over the generation routines to check for buffer</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * overflows, etc.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * Copyright 2013-2016 IBM Corp.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;assert.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;pel.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;errorlog.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;device.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define TEST_ERROR 0x1234</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define TEST_SUBSYS 0x5678</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : DEFINE_LOG_ENTRY(TEST_ERROR, OPAL_PLATFORM_ERR_EVT, TEST_SUBSYS,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : OPAL_PLATFORM_FIRMWARE, OPAL_INFO,</a>
+<a name="23"><span class="lineNum"> 23 </span> : : OPAL_NA);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : /* Override this for testing. */</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #define is_rodata(p) fake_is_rodata(p)</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : char __rodata_start[16];</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #define __rodata_end (__rodata_start + sizeof(__rodata_start))</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 2 : static inline bool fake_is_rodata(const void *p)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : {</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 2 : return ((char *)p &gt;= __rodata_start &amp;&amp; (char *)p &lt; __rodata_end);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : #define zalloc(bytes) calloc((bytes), 1)</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> : : #include &quot;../device.c&quot;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #include &quot;../pel.c&quot;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : struct dt_node *dt_root = NULL;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : char dt_prop[] = &quot;DUMMY DT PROP&quot;;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 4 : int rtc_cache_get_datetime(uint32_t *year_month_day,</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : uint64_t *hour_minute_second_millisecond)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 4 : *year_month_day = 0;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 4 : *hour_minute_second_millisecond = 0;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 4 : return 0;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> : : char *pel_buf;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : size_t size;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : struct errorlog *elog;</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : struct opal_err_info *opal_err_info = &amp;err_TEST_ERROR;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : char *buffer;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : struct elog_user_data_section *tmp;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : dt_add_property_string(dt_root, &quot;model&quot;, &quot;run-pel-unittest&quot;);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : elog = malloc(sizeof(struct errorlog));</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : pel_buf = malloc(PEL_MIN_SIZE + 4);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : assert(elog);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 1 : assert(pel_buf);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : memset(elog, 0, sizeof(struct errorlog));</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : elog-&gt;error_event_type = opal_err_info-&gt;err_type;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : elog-&gt;component_id = opal_err_info-&gt;cmp_id;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : elog-&gt;subsystem_id = opal_err_info-&gt;subsystem;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : elog-&gt;event_severity = opal_err_info-&gt;sev;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : elog-&gt;event_subtype = opal_err_info-&gt;event_subtype;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : elog-&gt;reason_code = opal_err_info-&gt;reason_code;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : elog-&gt;elog_origin = ORG_SAPPHIRE;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : size = pel_size(elog);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : printf(&quot;Test buffer too small: &quot;);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : assert(0 == create_pel_log(elog, NULL, size - 1));</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : assert(size &lt;= PEL_MIN_SIZE + 4);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : assert(size == create_pel_log(elog, pel_buf, size));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : memset(elog, 0, sizeof(struct errorlog));</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : elog-&gt;error_event_type = opal_err_info-&gt;err_type;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : elog-&gt;component_id = opal_err_info-&gt;cmp_id;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : elog-&gt;subsystem_id = opal_err_info-&gt;subsystem;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : elog-&gt;event_severity = opal_err_info-&gt;sev;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : elog-&gt;event_subtype = opal_err_info-&gt;event_subtype;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : elog-&gt;reason_code = opal_err_info-&gt;reason_code;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : elog-&gt;elog_origin = ORG_SAPPHIRE;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : size = pel_size(elog);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : pel_buf = realloc(pel_buf, size);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : assert(pel_buf);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : buffer = elog-&gt;user_data_dump + elog-&gt;user_section_size;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : tmp = (struct elog_user_data_section *)buffer;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 1 : tmp-&gt;tag = OPAL_ELOG_SEC_DESC; /* ASCII of DESC */</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : tmp-&gt;size = size + sizeof(struct elog_user_data_section) - 1;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : strcpy(tmp-&gt;data_dump, &quot;Hello World!&quot;);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : elog-&gt;user_section_size += tmp-&gt;size;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : elog-&gt;user_section_count++;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : size = pel_size(elog);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : pel_buf = realloc(pel_buf, size);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : assert(pel_buf);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : assert(size == create_pel_log(elog, pel_buf, size));</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : free(pel_buf);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : free(elog);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pool.c.func-sort-c.html b/coverage-report/core/test/run-pool.c.func-sort-c.html
new file mode 100644
index 0000000..be88a84
--- /dev/null
+++ b/coverage-report/core/test/run-pool.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pool.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pool.c<span style="font-size: 80%;"> (<a href="run-pool.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-pool.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pool.c.gcov.html#19">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pool.c.func.html b/coverage-report/core/test/run-pool.c.func.html
new file mode 100644
index 0000000..b09080b
--- /dev/null
+++ b/coverage-report/core/test/run-pool.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pool.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pool.c<span style="font-size: 80%;"> (<a href="run-pool.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-pool.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-pool.c.gcov.html#19">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-pool.c.gcov.html b/coverage-report/core/test/run-pool.c.gcov.html
new file mode 100644
index 0000000..fb6e4e9
--- /dev/null
+++ b/coverage-report/core/test/run-pool.c.gcov.html
@@ -0,0 +1,144 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-pool.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-pool.c<span style="font-size: 80%;"> (source / <a href="run-pool.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2014 IBM Corp</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;pool.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &quot;../pool.c&quot;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #define POOL_OBJ_COUNT 10</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define POOL_RESERVED_COUNT 2</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define POOL_NORMAL_COUNT (POOL_OBJ_COUNT - POOL_RESERVED_COUNT)</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct test_object</a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> : : int a;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : int b;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : int c;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : };</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : int i, count = 0;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct pool pool;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct test_object *a[POOL_OBJ_COUNT];</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1 : assert(!pool_init(&amp;pool, sizeof(struct test_object), POOL_OBJ_COUNT,</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : POOL_RESERVED_COUNT));</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : a[0] = pool_get(&amp;pool, POOL_NORMAL);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1 : assert(a[0]);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1 : pool_free_object(&amp;pool, a[0]);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 9 : for(i = 0; i &lt; POOL_NORMAL_COUNT; i++)</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : {</a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 8 : a[i] = pool_get(&amp;pool, POOL_NORMAL);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 8 : if (a[i])</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 8 : count++;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : }</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1 : assert(count == POOL_NORMAL_COUNT);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /* Normal pool should be exhausted */</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : assert(!pool_get(&amp;pool, POOL_NORMAL));</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : /* Reserved pool should still be available */</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : a[POOL_NORMAL_COUNT] = pool_get(&amp;pool, POOL_HIGH);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : assert(a[POOL_NORMAL_COUNT]);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : a[POOL_NORMAL_COUNT + 1] = pool_get(&amp;pool, POOL_HIGH);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : assert(a[POOL_NORMAL_COUNT + 1]);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : pool_free_object(&amp;pool, a[3]);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : /* Should be a free object to get now */</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : a[3] = pool_get(&amp;pool, POOL_HIGH);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : assert(a[3]);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> : : /* This exits depending on whether all tests passed */</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-time-utils.c.func-sort-c.html b/coverage-report/core/test/run-time-utils.c.func-sort-c.html
new file mode 100644
index 0000000..4f965a1
--- /dev/null
+++ b/coverage-report/core/test/run-time-utils.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-time-utils.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-time-utils.c<span style="font-size: 80%;"> (<a href="run-time-utils.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-time-utils.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-time-utils.c.gcov.html#15">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-time-utils.c.func.html b/coverage-report/core/test/run-time-utils.c.func.html
new file mode 100644
index 0000000..b765541
--- /dev/null
+++ b/coverage-report/core/test/run-time-utils.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-time-utils.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-time-utils.c<span style="font-size: 80%;"> (<a href="run-time-utils.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-time-utils.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-time-utils.c.gcov.html#15">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-time-utils.c.gcov.html b/coverage-report/core/test/run-time-utils.c.gcov.html
new file mode 100644
index 0000000..31a7895
--- /dev/null
+++ b/coverage-report/core/test/run-time-utils.c.gcov.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-time-utils.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-time-utils.c<span style="font-size: 80%;"> (source / <a href="run-time-utils.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2015-2017 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;string.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define __TEST__</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;../time-utils.c&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 1 : struct tm *t = malloc(sizeof(struct tm));</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 1 : uint32_t *ymd = malloc(sizeof(uint32_t));</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : uint64_t *hms = malloc(sizeof(uint64_t));</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : t-&gt;tm_year = 1982;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1 : t-&gt;tm_mon = 0;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : t-&gt;tm_mday = 29;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : t-&gt;tm_hour = 7;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1 : t-&gt;tm_min = 42;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1 : t-&gt;tm_sec = 24;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : tm_to_datetime(t, ymd, hms);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1 : assert(*ymd == 0x19820129);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 1 : assert(*hms == 0x742240000000000ULL);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : memset(t, 0, sizeof(struct tm));</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : *ymd = 0x19760412;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : datetime_to_tm(*ymd, *hms, t);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1 : assert(t-&gt;tm_year == 1976);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : assert(t-&gt;tm_mon == 03);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : assert(t-&gt;tm_mday == 12);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : assert(t-&gt;tm_hour == 7);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : assert(t-&gt;tm_min == 42);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : assert(t-&gt;tm_sec == 24);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : free(t);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : free(ymd);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : free(hms);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-timebase.c.func-sort-c.html b/coverage-report/core/test/run-timebase.c.func-sort-c.html
new file mode 100644
index 0000000..3a2c033
--- /dev/null
+++ b/coverage-report/core/test/run-timebase.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-timebase.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-timebase.c<span style="font-size: 80%;"> (<a href="run-timebase.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-timebase.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timebase.c.gcov.html#14">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-timebase.c.func.html b/coverage-report/core/test/run-timebase.c.func.html
new file mode 100644
index 0000000..1393e80
--- /dev/null
+++ b/coverage-report/core/test/run-timebase.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-timebase.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-timebase.c<span style="font-size: 80%;"> (<a href="run-timebase.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-timebase.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timebase.c.gcov.html#14">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-timebase.c.gcov.html b/coverage-report/core/test/run-timebase.c.gcov.html
new file mode 100644
index 0000000..410a3d3
--- /dev/null
+++ b/coverage-report/core/test/run-timebase.c.gcov.html
@@ -0,0 +1,132 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-timebase.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-timebase.c<span style="font-size: 80%;"> (source / <a href="run-timebase.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2015-2016 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define __TEST__</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;timebase.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : unsigned long tb_hz = 512000000;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : /* This is a fairly solid assumption that the math we're doing</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * is based on tb_hz of exactly 512mhz.</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * If we do start doing the math on different tb_hz, you probably</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * want to go and audit every bit of code that touches tb to</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * count/delay things.</a>
+<a name="23"><span class="lineNum"> 23 </span> : : */</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1 : assert(tb_hz == 512000000);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : assert(secs_to_tb(1) == tb_hz);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : assert(secs_to_tb(2) == 1024000000);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1 : assert(secs_to_tb(10) == 5120000000);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1 : assert(tb_to_secs(512000000) == 1);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : assert(tb_to_secs(5120000000) == 10);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : assert(tb_to_secs(1024000000) == 2);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1 : assert(msecs_to_tb(1) == 512000);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 1 : assert(msecs_to_tb(100) == 51200000);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1 : assert(msecs_to_tb(5) == 2560000);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : assert(tb_to_msecs(512000) == 1);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : assert(usecs_to_tb(5) == 2560);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : assert(tb_to_usecs(2560) == 5);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : assert(usecs_to_tb(5)*1000 == msecs_to_tb(5));</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1 : assert(tb_to_usecs(512000) == 1000);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : assert(tb_compare(msecs_to_tb(5), usecs_to_tb(5)) == TB_AAFTERB);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : assert(tb_compare(msecs_to_tb(5), usecs_to_tb(50000)) == TB_ABEFOREB);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : assert(tb_compare(msecs_to_tb(5), usecs_to_tb(5)*1000) == TB_AEQUALB);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-timer.c.func-sort-c.html b/coverage-report/core/test/run-timer.c.func-sort-c.html
new file mode 100644
index 0000000..7fb6cd9
--- /dev/null
+++ b/coverage-report/core/test/run-timer.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-timer.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-timer.c<span style="font-size: 80%;"> (<a href="run-timer.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryHi">92.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-timer.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#56">p8_sbe_update_timer_expiry</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#37">init_rand</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#67">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#48">expiry</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#62">p9_sbe_update_timer_expiry</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#21">lock_caller</a></td>
+ <td class="coverFnHi">65666</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#26">unlock</a></td>
+ <td class="coverFnHi">65666</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-timer.c.func.html b/coverage-report/core/test/run-timer.c.func.html
new file mode 100644
index 0000000..3f18ee2
--- /dev/null
+++ b/coverage-report/core/test/run-timer.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-timer.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-timer.c<span style="font-size: 80%;"> (<a href="run-timer.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryHi">92.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-timer.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#48">expiry</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#37">init_rand</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#21">lock_caller</a></td>
+ <td class="coverFnHi">65666</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#67">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#56">p8_sbe_update_timer_expiry</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#62">p9_sbe_update_timer_expiry</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-timer.c.gcov.html#26">unlock</a></td>
+ <td class="coverFnHi">65666</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-timer.c.gcov.html b/coverage-report/core/test/run-timer.c.gcov.html
new file mode 100644
index 0000000..ce1526b
--- /dev/null
+++ b/coverage-report/core/test/run-timer.c.gcov.html
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-timer.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-timer.c<span style="font-size: 80%;"> (source / <a href="run-timer.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryHi">92.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2014-2018 IBM Corp</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #define __TEST__</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;timer.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define mftb() (stamp)</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define sync()</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define smt_lowest()</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define smt_medium()</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : enum proc_gen proc_gen = proc_gen_p9;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : static uint64_t stamp, last;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct lock;</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 65666 : static inline void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : {</a>
+<a name="25"><span class="lineNum"> 25 </span> : : (void)caller;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : (void)l;</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 65666 : }</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 65666 : static inline void unlock(struct lock *l) { (void)l; }</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : unsigned long tb_hz = 512000000;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : #include &quot;../timer.c&quot;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define NUM_TIMERS 100</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : static struct timer timers[NUM_TIMERS];</a>
+<a name="37"><span class="lineNum"> 37 </span> : : static unsigned int rand_shift, count;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : static void init_rand(void)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : unsigned long max = RAND_MAX;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : /* Get something reasonably small */</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 16 : while(max &gt; 0x10000) {</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 15 : rand_shift++;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 15 : max &gt;&gt;= 1;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 100 : static void expiry(struct timer *t, void *data, uint64_t now)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> : : (void)data;</a>
+<a name="53"><span class="lineNum"> 53 </span> : : (void)now;</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 100 : assert(t-&gt;target &gt;= last);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 100 : count--;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 100 : }</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : void p8_sbe_update_timer_expiry(uint64_t new_target)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> : : (void)new_target;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : /* FIXME: do intersting SLW timer sim */</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 100 : void p9_sbe_update_timer_expiry(uint64_t new_target)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : {</a>
+<a name="66"><span class="lineNum"> 66 </span> : : (void)new_target;</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 100 : }</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : {</a>
+<a name="71"><span class="lineNum"> 71 </span> : : unsigned int i;</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : init_rand();</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 101 : for (i = 0; i &lt; NUM_TIMERS; i++) {</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 100 : init_timer(&amp;timers[i], expiry, NULL);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 100 : schedule_timer(&amp;timers[i], random() &gt;&gt; rand_shift);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : count = NUM_TIMERS;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 65467 : while(count) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 65466 : check_timers(false);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 65466 : stamp++;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-trace.c.func-sort-c.html b/coverage-report/core/test/run-trace.c.func-sort-c.html
new file mode 100644
index 0000000..2f2802e
--- /dev/null
+++ b/coverage-report/core/test/run-trace.c.func-sort-c.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-trace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-trace.c<span style="font-size: 80%;"> (<a href="run-trace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">195</td>
+ <td class="headerCovTableEntry">196</td>
+ <td class="headerCovTableEntryHi">99.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-trace.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#253">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#155">test_parallel</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#76">local_alloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#125">write_trace_entries</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#55">next_cpu</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#145">all_done</a></td>
+ <td class="coverFnHi">1870638</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#103">lock_caller</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#71">mftb</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#110">unlock</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#25">full_barrier</a></td>
+ <td class="coverFnHi">10850485</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#117">this_cpu</a></td>
+ <td class="coverFnHi">12836233</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-trace.c.func.html b/coverage-report/core/test/run-trace.c.func.html
new file mode 100644
index 0000000..881a44a
--- /dev/null
+++ b/coverage-report/core/test/run-trace.c.func.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-trace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-trace.c<span style="font-size: 80%;"> (<a href="run-trace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">195</td>
+ <td class="headerCovTableEntry">196</td>
+ <td class="headerCovTableEntryHi">99.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-trace.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#145">all_done</a></td>
+ <td class="coverFnHi">1870638</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#25">full_barrier</a></td>
+ <td class="coverFnHi">10850485</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#76">local_alloc</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#103">lock_caller</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#253">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#71">mftb</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#55">next_cpu</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#155">test_parallel</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#117">this_cpu</a></td>
+ <td class="coverFnHi">12836233</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#110">unlock</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-trace.c.gcov.html#125">write_trace_entries</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/run-trace.c.gcov.html b/coverage-report/core/test/run-trace.c.gcov.html
new file mode 100644
index 0000000..56ce678
--- /dev/null
+++ b/coverage-report/core/test/run-trace.c.gcov.html
@@ -0,0 +1,477 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/run-trace.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - run-trace.c<span style="font-size: 80%;"> (source / <a href="run-trace.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">195</td>
+ <td class="headerCovTableEntry">196</td>
+ <td class="headerCovTableEntryHi">99.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;config.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;assert.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;sched.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;sys/wait.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;skiboot-valgrind.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* Don't include these: PPC-specific */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define __CPU_H</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define __TIME_H</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #define __PROCESSOR_H</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : #if defined(__i386__) || defined(__x86_64__)</a>
+<a name="26"><span class="lineNum"> 26 </span> : : /* This is more than a lwsync, but it'll work */</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 10850485 : static void full_barrier(void)</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : {</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 10850485 : asm volatile(&quot;mfence&quot; : : : &quot;memory&quot;);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 10850485 : }</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : #define lwsync full_barrier</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #elif defined(__powerpc__) || defined(__powerpc64__)</a>
+<a name="33"><span class="lineNum"> 33 </span> : : static inline void lwsync(void)</a>
+<a name="34"><span class="lineNum"> 34 </span> : : {</a>
+<a name="35"><span class="lineNum"> 35 </span> : : asm volatile(&quot;lwsync&quot; : : : &quot;memory&quot;);</a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #else</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #error &quot;Define lwsync for this arch&quot;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #endif</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define zalloc(size) calloc((size), 1)</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct cpu_thread {</a>
+<a name="44"><span class="lineNum"> 44 </span> : : uint32_t pir;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : uint32_t chip_id;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct trace_info *trace;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : uint32_t server_no;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : bool is_secondary;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : struct cpu_thread *primary;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : };</a>
+<a name="51"><span class="lineNum"> 51 </span> : : static struct cpu_thread *this_cpu(void);</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : #define CPUS 4</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : static struct cpu_thread fake_cpus[CPUS];</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 15 : static inline struct cpu_thread *next_cpu(struct cpu_thread *cpu)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 15 : if (cpu == NULL)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 3 : return &amp;fake_cpus[0];</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 12 : cpu++;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 12 : if (cpu == &amp;fake_cpus[CPUS])</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 3 : return NULL;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 9 : return cpu;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define first_cpu() next_cpu(NULL)</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : #define for_each_cpu(cpu) \</a>
+<a name="70"><span class="lineNum"> 70 </span> : : for (cpu = first_cpu(); cpu; cpu = next_cpu(cpu))</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : static unsigned long timestamp;</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 6418116 : static unsigned long mftb(void)</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : {</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 6418116 : return timestamp;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 2 : static void *local_alloc(unsigned int chip_id,</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : size_t size, size_t align)</a>
+<a name="80"><span class="lineNum"> 80 </span> : : {</a>
+<a name="81"><span class="lineNum"> 81 </span> : : void *p;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : (void)chip_id;</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : if (posix_memalign(&amp;p, align, size))</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : p = NULL;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 2 : return p;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : struct dt_node;</a>
+<a name="90"><span class="lineNum"> 90 </span> : : extern struct dt_node *opal_node;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : #include &quot;../trace.c&quot;</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : #include &quot;../external/trace/trace.c&quot;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : static struct trace_reader trace_readers[CPUS];</a>
+<a name="96"><span class="lineNum"> 96 </span> : : struct trace_reader *my_trace_reader;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : #include &quot;../device.c&quot;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : char __rodata_start[1], __rodata_end[1];</a>
+<a name="100"><span class="lineNum"> 100 </span> : : struct dt_node *opal_node;</a>
+<a name="101"><span class="lineNum"> 101 </span> : : struct debug_descriptor debug_descriptor = {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : .trace_mask = -1</a>
+<a name="103"><span class="lineNum"> 103 </span> : : };</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 6418116 : void lock_caller(struct lock *l, const char *caller)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : {</a>
+<a name="107"><span class="lineNum"> 107 </span> : : (void)caller;</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 6418116 : assert(!l-&gt;lock_val);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 6418116 : l-&gt;lock_val = 1;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 6418116 : }</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 6418116 : void unlock(struct lock *l)</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : {</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 6418116 : assert(l-&gt;lock_val);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 6418116 : l-&gt;lock_val = 0;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 6418116 : }</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> : : struct cpu_thread *my_fake_cpu;</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 12836233 : static struct cpu_thread *this_cpu(void)</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : {</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 12836233 : return my_fake_cpu;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : #include &lt;sys/mman.h&gt;</a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define PER_CHILD_TRACES ((RUNNING_ON_VALGRIND) ? (1024*16) : (1024*1024))</a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 4 : static void write_trace_entries(int id)</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : {</a>
+<a name="129"><span class="lineNum"> 129 </span> : : void exit(int);</a>
+<a name="130"><span class="lineNum"> 130 </span> : : unsigned int i;</a>
+<a name="131"><span class="lineNum"> 131 </span> : : union trace trace;</a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 4 : timestamp = id;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 4194308 : for (i = 0; i &lt; PER_CHILD_TRACES; i++) {</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 4194304 : timestamp = i * CPUS + id;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : assert(sizeof(trace.hdr) % 8 == 0);</a>
+<a name="137"><span class="lineNum"> 137 </span> : : /* First child never repeats, second repeats once, etc. */</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 4194304 : trace_add(&amp;trace, 3 + ((i / (id + 1)) % 0x40),</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : sizeof(trace.hdr));</a>
+<a name="140"><span class="lineNum"> 140 </span> : : }</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> : : /* Final entry has special type, so parent knows it's over. */</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 4 : trace_add(&amp;trace, 0x70, sizeof(trace.hdr));</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 4 : exit(0);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : }</a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 1870638 : static bool all_done(const bool done[])</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : {</a>
+<a name="149"><span class="lineNum"> 149 </span> : : unsigned int i;</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 2135583 : for (i = 0; i &lt; CPUS; i++)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 2135582 : if (!done[i])</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1870637 : return false;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : return true;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : }</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 1 : static void test_parallel(void)</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : {</a>
+<a name="159"><span class="lineNum"> 159 </span> : : void *p;</a>
+<a name="160"><span class="lineNum"> 160 </span> : : unsigned int cpu;</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1 : unsigned int i, counts[CPUS] = { 0 }, overflows[CPUS] = { 0 };</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 1 : unsigned int repeats[CPUS] = { 0 }, num_overflows[CPUS] = { 0 };</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 1 : bool done[CPUS] = { false };</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 1 : size_t len = sizeof(struct trace_info) + TBUF_SZ + sizeof(union trace);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 1 : int last = 0;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : </a>
+<a name="167"><span class="lineNum"> 167 </span> : : /* Use a shared mmap to test actual parallel buffers. */</a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 1 : i = (CPUS*len + getpagesize()-1)&amp;~(getpagesize()-1);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 1 : p = mmap(NULL, i, PROT_READ|PROT_WRITE,</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : MAP_ANONYMOUS|MAP_SHARED, -1, 0);</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; CPUS; i++) {</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 4 : fake_cpus[i].trace = p + i * len;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 4 : fake_cpus[i].trace-&gt;tb.buf_size = cpu_to_be64(TBUF_SZ);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 4 : fake_cpus[i].trace-&gt;tb.max_size = cpu_to_be32(sizeof(union trace));</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 4 : fake_cpus[i].is_secondary = false;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 4 : memset(&amp;trace_readers[i], 0, sizeof(struct trace_reader));</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 4 : trace_readers[i].tb = &amp;fake_cpus[i].trace-&gt;tb;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : }</a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; CPUS; i++) {</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 4 : if (!fork()) {</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : /* Child. */</a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 4 : my_fake_cpu = &amp;fake_cpus[i];</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 4 : write_trace_entries(i);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : }</a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 1870638 : while (!all_done(done)) {</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : union trace t;</a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 1877218 : for (i = 0; i &lt; CPUS; i++) {</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1875579 : if (trace_get(&amp;t, &amp;trace_readers[(i+last) % CPUS]))</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 1868998 : break;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : }</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 1870637 : if (i == CPUS) {</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 1639 : sched_yield();</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 1682 : continue;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : }</a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 1868998 : i = (i + last) % CPUS;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 1868998 : last = i;</span></a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 1868998 : if (t.hdr.type == TRACE_OVERFLOW) {</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : /* Conveniently, each record is 16 bytes here. */</a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 43 : assert(be64_to_cpu(t.overflow.bytes_missed) % 16 == 0);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 43 : overflows[i] += be64_to_cpu(t.overflow.bytes_missed) / 16;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 43 : num_overflows[i]++;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 43 : continue;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : }</a>
+<a name="211"><span class="lineNum"> 211 </span> : : </a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 1868955 : assert(be16_to_cpu(t.hdr.cpu) &lt; CPUS);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 1868955 : assert(!done[be16_to_cpu(t.hdr.cpu)]);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 1868955 : assert(be64_to_cpu(t.hdr.timestamp) % CPUS == be16_to_cpu(t.hdr.cpu));</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 1868955 : if (t.hdr.type == TRACE_REPEAT) {</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 723945 : assert(t.hdr.len_div_8 * 8 == sizeof(t.repeat));</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 723945 : assert(be16_to_cpu(t.repeat.num) != 0);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 723945 : assert(be16_to_cpu(t.repeat.num) &lt;= be16_to_cpu(t.hdr.cpu));</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 723945 : repeats[be16_to_cpu(t.hdr.cpu)] += be16_to_cpu(t.repeat.num);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 1145010 : } else if (t.hdr.type == 0x70) {</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 4 : cpu = be16_to_cpu(t.hdr.cpu);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 4 : assert(cpu &lt; CPUS);</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 4 : done[cpu] = true;</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : } else {</a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1145006 : cpu = be16_to_cpu(t.hdr.cpu);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1145006 : assert(cpu &lt; CPUS);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 1145006 : counts[cpu]++;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : }</a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /* Gather children. */</a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; CPUS; i++) {</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : int status;</a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 4 : wait(&amp;status);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : }</a>
+<a name="236"><span class="lineNum"> 236 </span> : : </a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; CPUS; i++) {</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 4 : printf(&quot;Child %i: %u produced, %u overflows, %llu total\n&quot;, i,</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : counts[i], overflows[i],</a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 4 : (long long)be64_to_cpu(fake_cpus[i].trace-&gt;tb.end));</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 4 : assert(counts[i] + repeats[i] &lt;= PER_CHILD_TRACES);</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : }</a>
+<a name="243"><span class="lineNum"> 243 </span> : : /* Child 0 never repeats. */</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 1 : assert(repeats[0] == 0);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 1 : assert(counts[0] + overflows[0] == PER_CHILD_TRACES);</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> : : /*</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * FIXME: Other children have some fuzz, since overflows may</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * include repeat record we already read. And odd-numbered</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * overflows may include more repeat records than normal</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * records (they alternate).</a>
+<a name="252"><span class="lineNum"> 252 </span> : : */</a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : {</a>
+<a name="257"><span class="lineNum"> 257 </span> : : union trace minimal;</a>
+<a name="258"><span class="lineNum"> 258 </span> : : union trace large;</a>
+<a name="259"><span class="lineNum"> 259 </span> : : union trace trace;</a>
+<a name="260"><span class="lineNum"> 260 </span> : : unsigned int i, j;</a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 1 : opal_node = dt_new_root(&quot;opal&quot;);</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 1 : dt_new(dt_new(opal_node, &quot;firmware&quot;), &quot;exports&quot;);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; CPUS; i++) {</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 4 : fake_cpus[i].server_no = i;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 4 : fake_cpus[i].pir = i;</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 4 : fake_cpus[i].is_secondary = (i &amp; 0x1);</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 4 : fake_cpus[i].primary = &amp;fake_cpus[i &amp; ~0x1];</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : }</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 1 : my_fake_cpu = &amp;fake_cpus[0];</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 1 : my_trace_reader = &amp;trace_readers[0];</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 1 : init_trace_buffers();</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; CPUS; i++) {</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 4 : trace_readers[i].tb = &amp;fake_cpus[i].trace-&gt;tb;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 4 : assert(trace_empty(&amp;trace_readers[i]));</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 4 : assert(!trace_get(&amp;trace, &amp;trace_readers[i]));</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> : : assert(sizeof(trace.hdr) % 8 == 0);</a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 1 : timestamp = 1;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 1 : trace_add(&amp;minimal, 100, sizeof(trace.hdr));</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.hdr.timestamp) == timestamp);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> : : /* Make it wrap once. */</a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 65404 : for (i = 0; i &lt; TBUF_SZ / (minimal.hdr.len_div_8 * 8) + 1; i++) {</span></a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 65403 : timestamp = i;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 65403 : trace_add(&amp;minimal, 99 + (i%2), sizeof(trace.hdr));</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : }</a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : /* First one must be overflow marker. */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == TRACE_OVERFLOW);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 * 8 == sizeof(trace.overflow));</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.overflow.bytes_missed) == minimal.hdr.len_div_8 * 8);</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 65403 : for (i = 0; i &lt; TBUF_SZ / (minimal.hdr.len_div_8 * 8); i++) {</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 65402 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 65402 : assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 65402 : assert(be64_to_cpu(trace.hdr.timestamp) == i+1);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 65402 : assert(trace.hdr.type == 99 + ((i+1)%2));</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : }</a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 1 : assert(!trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> : : /* Now put in some weird-length ones, to test overlap.</a>
+<a name="308"><span class="lineNum"> 308 </span> : : * Last power of 2, minus 8. */</a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 8 : for (j = 0; (1 &lt;&lt; j) &lt; sizeof(large); j++);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 1046433 : for (i = 0; i &lt; TBUF_SZ; i++) {</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 1046432 : timestamp = i;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 1046432 : trace_add(&amp;large, 100 + (i%2), (1 &lt;&lt; (j-1)));</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : }</a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == TRACE_OVERFLOW);</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 == large.hdr.len_div_8);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 1 : i = be64_to_cpu(trace.hdr.timestamp);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 16350 : while (trace_get(&amp;trace, my_trace_reader))</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 16349 : assert(be64_to_cpu(trace.hdr.timestamp) == ++i);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> : : </a>
+<a name="322"><span class="lineNum"> 322 </span> : : /* Test repeats. */</a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 65539 : for (i = 0; i &lt; 65538; i++) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 65538 : timestamp = i;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 65538 : trace_add(&amp;minimal, 100, sizeof(trace.hdr));</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 1 : timestamp = i;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 1 : trace_add(&amp;minimal, 101, sizeof(trace.hdr));</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 1 : timestamp = i+1;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 1 : trace_add(&amp;minimal, 101, sizeof(trace.hdr));</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 1 : assert(trace.hdr.timestamp == 0);</span></a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == 100);</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == TRACE_REPEAT);</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 1 : assert(be16_to_cpu(trace.repeat.num) == 65535);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.repeat.timestamp) == 65535);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.hdr.timestamp) == 65536);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == 100);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == TRACE_REPEAT);</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 1 : assert(be16_to_cpu(trace.repeat.num) == 1);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.repeat.timestamp) == 65537);</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : </a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.hdr.timestamp) == 65538);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == 101);</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == TRACE_REPEAT);</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 1 : assert(be16_to_cpu(trace.repeat.num) == 1);</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.repeat.timestamp) == 65539);</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Now, test adding repeat while we're reading... */</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 1 : timestamp = 0;</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 1 : trace_add(&amp;minimal, 100, sizeof(trace.hdr));</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 1 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 1 : assert(be64_to_cpu(trace.hdr.timestamp) == 0);</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1 : assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 1 : assert(trace.hdr.type == 100);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : </a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 1046432 : for (i = 1; i &lt; TBUF_SZ; i++) {</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 1046431 : timestamp = i;</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 1046431 : trace_add(&amp;minimal, 100, sizeof(trace.hdr));</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 1046431 : assert(trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 1046431 : if (i % 65536 == 0) {</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 15 : assert(trace.hdr.type == 100);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 15 : assert(trace.hdr.len_div_8 == minimal.hdr.len_div_8);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> : : } else {</a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 1046416 : assert(trace.hdr.type == TRACE_REPEAT);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 1046416 : assert(trace.hdr.len_div_8 * 8 == sizeof(trace.repeat));</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 1046416 : assert(be16_to_cpu(trace.repeat.num) == 1);</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : }</a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 1046431 : assert(be64_to_cpu(trace.repeat.timestamp) == i);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 1046431 : assert(!trace_get(&amp;trace, my_trace_reader));</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : }</a>
+<a name="384"><span class="lineNum"> 384 </span> : : </a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; CPUS; i++)</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 4 : if (!fake_cpus[i].is_secondary)</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 2 : free(fake_cpus[i].trace);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 1 : test_parallel();</span></a>
+<a name="390"><span class="lineNum"> 390 </span> : : </a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/stubs.c.func-sort-c.html b/coverage-report/core/test/stubs.c.func-sort-c.html
new file mode 100644
index 0000000..4322575
--- /dev/null
+++ b/coverage-report/core/test/stubs.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/stubs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - stubs.c<span style="font-size: 80%;"> (<a href="stubs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">16</td>
+ <td class="headerCovTableEntryLo">31.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="stubs.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#56">__cpu_queue_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#75">cpu_process_local_jobs</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#48">cpu_queue_job_on_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#68">cpu_wait_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#30">stub_function</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#20">_prlog</a></td>
+ <td class="coverFnHi">187</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/stubs.c.func.html b/coverage-report/core/test/stubs.c.func.html
new file mode 100644
index 0000000..4421e7d
--- /dev/null
+++ b/coverage-report/core/test/stubs.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/stubs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - stubs.c<span style="font-size: 80%;"> (<a href="stubs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">16</td>
+ <td class="headerCovTableEntryLo">31.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="stubs.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#56">__cpu_queue_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#20">_prlog</a></td>
+ <td class="coverFnHi">187</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#75">cpu_process_local_jobs</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#48">cpu_queue_job_on_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#68">cpu_wait_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#30">stub_function</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/test/stubs.c.gcov.html b/coverage-report/core/test/stubs.c.gcov.html
new file mode 100644
index 0000000..c7d48cc
--- /dev/null
+++ b/coverage-report/core/test/stubs.c.gcov.html
@@ -0,0 +1,186 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/test/stubs.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">core/test</a> - stubs.c<span style="font-size: 80%;"> (source / <a href="stubs.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">16</td>
+ <td class="headerCovTableEntryLo">31.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2019 IBM Corp</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;../../ccan/list/list.c&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : void _prlog(int log_level __attribute__((unused)), const char* fmt, ...) __attribute__((format (printf, 2, 3)));</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #ifndef pr_fmt</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define pr_fmt(fmt) fmt</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #endif</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define prlog(l, f, ...) do { _prlog(l, pr_fmt(f), ##__VA_ARGS__); } while(0)</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 187 : void _prlog(int log_level __attribute__((unused)), const char* fmt, ...)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> : : va_list ap;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 187 : va_start(ap, fmt);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 187 : vprintf(fmt, ap);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 187 : va_end(ap);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 187 : }</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* Add any stub functions required for linking here. */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : static void stub_function(void)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct cpu_thread;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct cpu_job *__cpu_queue_job(struct cpu_thread *cpu,</a>
+<a name="40"><span class="lineNum"> 40 </span> : : const char *name,</a>
+<a name="41"><span class="lineNum"> 41 </span> : : void (*func)(void *data), void *data,</a>
+<a name="42"><span class="lineNum"> 42 </span> : : bool no_return);</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : void cpu_wait_job(struct cpu_job *job, bool free_it);</a>
+<a name="45"><span class="lineNum"> 45 </span> : : void cpu_process_local_jobs(void);</a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct cpu_job *cpu_queue_job_on_node(uint32_t chip_id,</a>
+<a name="47"><span class="lineNum"> 47 </span> : : const char *name,</a>
+<a name="48"><span class="lineNum"> 48 </span> : : void (*func)(void *data), void *data);</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : struct cpu_job *cpu_queue_job_on_node(uint32_t chip_id,</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : const char *name,</a>
+<a name="52"><span class="lineNum"> 52 </span> : : void (*func)(void *data), void *data)</a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> : : (void)chip_id;</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : return __cpu_queue_job(NULL, name, func, data, false);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : struct cpu_job *__cpu_queue_job(struct cpu_thread *cpu,</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : const char *name,</a>
+<a name="60"><span class="lineNum"> 60 </span> : : void (*func)(void *data), void *data,</a>
+<a name="61"><span class="lineNum"> 61 </span> : : bool no_return)</a>
+<a name="62"><span class="lineNum"> 62 </span> : : {</a>
+<a name="63"><span class="lineNum"> 63 </span> : : (void)cpu;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : (void)name;</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : (func)(data);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : (void)no_return;</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : void cpu_wait_job(struct cpu_job *job, bool free_it)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> : : (void)job;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : (void)free_it;</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : }</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : void cpu_process_local_jobs(void)</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : {</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : #define STUB(fnname) \</a>
+<a name="82"><span class="lineNum"> 82 </span> : : void fnname(void) __attribute__((weak, alias (&quot;stub_function&quot;)))</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : STUB(fdt_begin_node);</a>
+<a name="85"><span class="lineNum"> 85 </span> : : STUB(fdt_property);</a>
+<a name="86"><span class="lineNum"> 86 </span> : : STUB(fdt_end_node);</a>
+<a name="87"><span class="lineNum"> 87 </span> : : STUB(fdt_create_with_flags);</a>
+<a name="88"><span class="lineNum"> 88 </span> : : STUB(fdt_add_reservemap_entry);</a>
+<a name="89"><span class="lineNum"> 89 </span> : : STUB(fdt_finish_reservemap);</a>
+<a name="90"><span class="lineNum"> 90 </span> : : STUB(fdt_strerror);</a>
+<a name="91"><span class="lineNum"> 91 </span> : : STUB(fdt_check_header);</a>
+<a name="92"><span class="lineNum"> 92 </span> : : STUB(fdt_check_node_offset_);</a>
+<a name="93"><span class="lineNum"> 93 </span> : : STUB(fdt_next_tag);</a>
+<a name="94"><span class="lineNum"> 94 </span> : : STUB(fdt_string);</a>
+<a name="95"><span class="lineNum"> 95 </span> : : STUB(fdt_get_name);</a>
+<a name="96"><span class="lineNum"> 96 </span> : : STUB(dt_first);</a>
+<a name="97"><span class="lineNum"> 97 </span> : : STUB(dt_next);</a>
+<a name="98"><span class="lineNum"> 98 </span> : : STUB(dt_has_node_property);</a>
+<a name="99"><span class="lineNum"> 99 </span> : : STUB(dt_get_address);</a>
+<a name="100"><span class="lineNum"> 100 </span> : : STUB(add_chip_dev_associativity);</a>
+<a name="101"><span class="lineNum"> 101 </span> : : STUB(pci_check_clear_freeze);</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/time-utils.c.func-sort-c.html b/coverage-report/core/time-utils.c.func-sort-c.html
new file mode 100644
index 0000000..dd12f38
--- /dev/null
+++ b/coverage-report/core/time-utils.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/time-utils.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - time-utils.c<span style="font-size: 80%;"> (<a href="time-utils.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="time-utils.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.c.gcov.html#15">datetime_to_tm</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.c.gcov.html#50">tm_to_datetime</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/time-utils.c.func.html b/coverage-report/core/time-utils.c.func.html
new file mode 100644
index 0000000..bb7b833
--- /dev/null
+++ b/coverage-report/core/time-utils.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/time-utils.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - time-utils.c<span style="font-size: 80%;"> (<a href="time-utils.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="time-utils.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.c.gcov.html#15">datetime_to_tm</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.c.gcov.html#50">tm_to_datetime</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/time-utils.c.gcov.html b/coverage-report/core/time-utils.c.gcov.html
new file mode 100644
index 0000000..7b5a846
--- /dev/null
+++ b/coverage-report/core/time-utils.c.gcov.html
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/time-utils.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - time-utils.c<span style="font-size: 80%;"> (source / <a href="time-utils.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Converts an OPAL formatted datetime into a struct tm. We ignore microseconds</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * as Linux doesn't use them anyway.</a>
+<a name="5"><span class="lineNum"> 5 </span> : : *</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * | year | month | mday |</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * +------------------------------------+</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * | hour | minute | secs | reserved |</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * +------------------------------------+</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * | microseconds |</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * Copyright 2013-2014 IBM Corp.</a>
+<a name="13"><span class="lineNum"> 13 </span> : : */</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;time-utils.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 1 : void datetime_to_tm(uint32_t y_m_d, uint64_t h_m_s_m, struct tm *tm)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> : : uint32_t x;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : tm-&gt;tm_year = bcd_byte(y_m_d, 3) * 100 + bcd_byte(y_m_d, 2);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 1 : tm-&gt;tm_mon = bcd_byte(y_m_d, 1) - 1;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : tm-&gt;tm_mday = bcd_byte(y_m_d, 0);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : x = h_m_s_m &gt;&gt; 32;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : tm-&gt;tm_hour = bcd_byte(x, 3);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1 : tm-&gt;tm_min = bcd_byte(x, 2);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1 : tm-&gt;tm_sec = bcd_byte(x, 1);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /*</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * The OPAL API is defined as returned a u64 of a similar</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * format to the FSP message; the 32-bit date field is</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * in the format:</a>
+<a name="35"><span class="lineNum"> 35 </span> : : *</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * | year | month | mday |</a>
+<a name="37"><span class="lineNum"> 37 </span> : : *</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * ... and the 64-bit time field is in the format</a>
+<a name="39"><span class="lineNum"> 39 </span> : : *</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * | hour | minutes | secs | millisec |</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * | -------------------------------------</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * | millisec | reserved |</a>
+<a name="43"><span class="lineNum"> 43 </span> : : *</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * We simply ignore the microseconds/milliseconds for now</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * as I don't quite understand why the OPAL API defines that</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * it needs 6 digits for the milliseconds :-) I suspect the</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * doc got that wrong and it's supposed to be micro but</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * let's ignore it.</a>
+<a name="49"><span class="lineNum"> 49 </span> : : *</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * Note that Linux doesn't use nor set the ms field anyway.</a>
+<a name="51"><span class="lineNum"> 51 </span> : : */</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : void tm_to_datetime(struct tm *tm, uint32_t *y_m_d, uint64_t *h_m_s_m)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> : : uint64_t h_m_s;</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : *y_m_d = int_to_bcd4(tm-&gt;tm_year) &lt;&lt; 16 |</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : int_to_bcd2(tm-&gt;tm_mon + 1) &lt;&lt; 8 |</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : int_to_bcd2(tm-&gt;tm_mday);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : h_m_s = int_to_bcd2(tm-&gt;tm_hour) &lt;&lt; 24 |</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : int_to_bcd2(tm-&gt;tm_min) &lt;&lt; 16 |</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : int_to_bcd2(tm-&gt;tm_sec) &lt;&lt; 8;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : *h_m_s_m = h_m_s &lt;&lt; 32;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/timer.c.func-sort-c.html b/coverage-report/core/timer.c.func-sort-c.html
new file mode 100644
index 0000000..baedea2
--- /dev/null
+++ b/coverage-report/core/timer.c.func-sort-c.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/timer.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - timer.c<span style="font-size: 80%;"> (<a href="timer.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">111</td>
+ <td class="headerCovTableEntryLo">61.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="timer.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#58">__sync_timer</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#83">cancel_timer</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#92">cancel_timer_async</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#76">sync_timer</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#52">__remove_timer</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#100">__schedule_timer_at</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#43">init_timer</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#142">schedule_timer</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#135">schedule_timer_at</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#35">update_timer_expiry</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#154">__check_poll_timers</a></td>
+ <td class="coverFnHi">65466</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#208">__check_timers</a></td>
+ <td class="coverFnHi">65466</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#244">check_timers</a></td>
+ <td class="coverFnHi">65466</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/timer.c.func.html b/coverage-report/core/timer.c.func.html
new file mode 100644
index 0000000..fbeeb50
--- /dev/null
+++ b/coverage-report/core/timer.c.func.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/timer.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - timer.c<span style="font-size: 80%;"> (<a href="timer.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">111</td>
+ <td class="headerCovTableEntryLo">61.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="timer.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#154">__check_poll_timers</a></td>
+ <td class="coverFnHi">65466</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#208">__check_timers</a></td>
+ <td class="coverFnHi">65466</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#52">__remove_timer</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#100">__schedule_timer_at</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#58">__sync_timer</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#83">cancel_timer</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#92">cancel_timer_async</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#244">check_timers</a></td>
+ <td class="coverFnHi">65466</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#43">init_timer</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#142">schedule_timer</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#135">schedule_timer_at</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#76">sync_timer</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timer.c.gcov.html#35">update_timer_expiry</a></td>
+ <td class="coverFnHi">100</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/timer.c.gcov.html b/coverage-report/core/timer.c.gcov.html
new file mode 100644
index 0000000..01c4387
--- /dev/null
+++ b/coverage-report/core/timer.c.gcov.html
@@ -0,0 +1,383 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/timer.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - timer.c<span style="font-size: 80%;"> (source / <a href="timer.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">111</td>
+ <td class="headerCovTableEntryLo">61.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * run something, but later.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Timers are run when the SBE timer interrupt triggers (based on us setting</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * it) or when the regular heartbeat call from the OS occurs and there's a</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * timer that's expired.</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Copyright 2014-2019 IBM Corp.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : */</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;timer.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;timebase.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;lock.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;fsp.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;device.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;opal.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;sbe-p8.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;sbe-p9.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #ifdef __TEST__</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define this_cpu() ((void *)-1)</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #define cpu_relax()</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #else</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #endif</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : /* Heartbeat requested from Linux */</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #define HEARTBEAT_DEFAULT_MS 200</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : static struct lock timer_lock = LOCK_UNLOCKED;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : static LIST_HEAD(timer_list);</a>
+<a name="33"><span class="lineNum"> 33 </span> : : static LIST_HEAD(timer_poll_list);</a>
+<a name="34"><span class="lineNum"> 34 </span> : : static bool timer_in_poll;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : static uint64_t timer_poll_gen;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 100 : static inline void update_timer_expiry(uint64_t target)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : {</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 100 : if (proc_gen &lt; proc_gen_p9)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : p8_sbe_update_timer_expiry(target);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : else</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 100 : p9_sbe_update_timer_expiry(target);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 100 : }</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 100 : void init_timer(struct timer *t, timer_func_t expiry, void *data)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 100 : t-&gt;link.next = t-&gt;link.prev = NULL;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 100 : t-&gt;target = 0;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 100 : t-&gt;expiry = expiry;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 100 : t-&gt;user_data = data;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 100 : t-&gt;running = NULL;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 100 : }</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 100 : static void __remove_timer(struct timer *t)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 100 : list_del(&amp;t-&gt;link);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 100 : t-&gt;link.next = t-&gt;link.prev = NULL;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 100 : }</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : static void __sync_timer(struct timer *t)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> : : sync();</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* Guard against re-entrancy */</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : assert(t-&gt;running != this_cpu());</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : while (t-&gt;running) {</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : unlock(&amp;timer_lock);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : smt_lowest();</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : while (t-&gt;running)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : barrier();</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : smt_medium();</a>
+<a name="73"><span class="lineNum"> 73 </span> : : /* Should we call the pollers here ? */</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : lock(&amp;timer_lock);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : }</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : void sync_timer(struct timer *t)</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : {</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : lock(&amp;timer_lock);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : __sync_timer(t);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : unlock(&amp;timer_lock);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : void cancel_timer(struct timer *t)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : {</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : lock(&amp;timer_lock);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : __sync_timer(t);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : if (t-&gt;link.next)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineNoCov"> 0 : __remove_timer(t);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : unlock(&amp;timer_lock);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : void cancel_timer_async(struct timer *t)</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : {</a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : lock(&amp;timer_lock);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : if (t-&gt;link.next)</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : __remove_timer(t);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : unlock(&amp;timer_lock);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 100 : static void __schedule_timer_at(struct timer *t, uint64_t when)</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : {</a>
+<a name="104"><span class="lineNum"> 104 </span> : : struct timer *lt;</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : /* If the timer is already scheduled, take it out */</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 100 : if (t-&gt;link.next)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : __remove_timer(t);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Update target */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 100 : t-&gt;target = when;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 100 : if (when == TIMER_POLL) {</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* It's a poller, add it to the poller list */</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : t-&gt;gen = timer_poll_gen;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : list_add_tail(&amp;timer_poll_list, &amp;t-&gt;link);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : } else {</a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* It's a real timer, add it in the right spot in the</a>
+<a name="119"><span class="lineNum"> 119 </span> : : * ordered timer list</a>
+<a name="120"><span class="lineNum"> 120 </span> : : */</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 2761 : list_for_each(&amp;timer_list, lt, link) {</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 2757 : if (when &gt;= lt-&gt;target)</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 2661 : continue;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 96 : list_add_before(&amp;timer_list, &amp;t-&gt;link, &amp;lt-&gt;link);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 96 : goto bail;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : }</a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 4 : list_add_tail(&amp;timer_list, &amp;t-&gt;link);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : }</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 100 : bail:</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : /* Pick up the next timer and upddate the SBE HW timer */</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 100 : lt = list_top(&amp;timer_list, struct timer, link);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 100 : if (lt) {</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 100 : update_timer_expiry(lt-&gt;target);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 100 : }</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 100 : void schedule_timer_at(struct timer *t, uint64_t when)</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : {</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 100 : lock(&amp;timer_lock);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 100 : __schedule_timer_at(t, when);</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 100 : unlock(&amp;timer_lock);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 100 : }</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 100 : uint64_t schedule_timer(struct timer *t, uint64_t how_long)</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : {</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 100 : uint64_t now = mftb();</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 100 : if (how_long == TIMER_POLL)</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : schedule_timer_at(t, TIMER_POLL);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : else</a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 100 : schedule_timer_at(t, now + how_long);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 100 : return now;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : }</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 65466 : static void __check_poll_timers(uint64_t now)</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : {</a>
+<a name="158"><span class="lineNum"> 158 </span> : : struct timer *t;</a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : /* Don't call this from multiple CPUs at once */</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 65466 : if (timer_in_poll)</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 65466 : timer_in_poll = true;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /*</a>
+<a name="166"><span class="lineNum"> 166 </span> : : * Poll timers might re-enqueue themselves and don't have an</a>
+<a name="167"><span class="lineNum"> 167 </span> : : * expiry so we can't do like normal timers and just run until</a>
+<a name="168"><span class="lineNum"> 168 </span> : : * we hit a wall. Instead, each timer has a generation count,</a>
+<a name="169"><span class="lineNum"> 169 </span> : : * which we set to the current global gen count when we schedule</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * it and update when we run it. It will only be considered if</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * the generation count is different than the current one. We</a>
+<a name="172"><span class="lineNum"> 172 </span> : : * don't try to compare generations being larger or smaller</a>
+<a name="173"><span class="lineNum"> 173 </span> : : * because at boot, this can be called quite quickly and I want</a>
+<a name="174"><span class="lineNum"> 174 </span> : : * to be safe vs. wraps.</a>
+<a name="175"><span class="lineNum"> 175 </span> : : */</a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 65466 : timer_poll_gen++;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : for (;;) {</a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 65466 : t = list_top(&amp;timer_poll_list, struct timer, link);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> : : /* Top timer has a different generation than current ? Must</a>
+<a name="181"><span class="lineNum"> 181 </span> : : * be older, we are done.</a>
+<a name="182"><span class="lineNum"> 182 </span> : : */</a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 65466 : if (!t || t-&gt;gen == timer_poll_gen)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : break;</a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> : : /* Top of list still running, we have to delay handling it,</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * let's reprogram the SLW with a small delay. We chose</a>
+<a name="188"><span class="lineNum"> 188 </span> : : * arbitrarily 1us.</a>
+<a name="189"><span class="lineNum"> 189 </span> : : */</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : if (t-&gt;running) {</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : update_timer_expiry(now + usecs_to_tb(1));</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> : : /* Allright, first remove it and mark it running */</a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : __remove_timer(t);</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : t-&gt;running = this_cpu();</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> : : /* Now we can unlock and call it's expiry */</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : unlock(&amp;timer_lock);</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : t-&gt;expiry(t, t-&gt;user_data, now);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : /* Re-lock and mark not running */</a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : lock(&amp;timer_lock);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : t-&gt;running = NULL;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : }</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 65466 : timer_in_poll = false;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : }</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 65566 : static void __check_timers(uint64_t now)</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : {</a>
+<a name="212"><span class="lineNum"> 212 </span> : : struct timer *t;</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> : : for (;;) {</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 65566 : t = list_top(&amp;timer_list, struct timer, link);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> : : /* Top of list not expired ? that's it ... */</a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 65566 : if (!t || t-&gt;target &gt; now)</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : break;</a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : /* Top of list still running, we have to delay handling</a>
+<a name="222"><span class="lineNum"> 222 </span> : : * it. For now just skip until the next poll, when we have</a>
+<a name="223"><span class="lineNum"> 223 </span> : : * SLW interrupts, we'll probably want to trip another one</a>
+<a name="224"><span class="lineNum"> 224 </span> : : * ASAP</a>
+<a name="225"><span class="lineNum"> 225 </span> : : */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 100 : if (t-&gt;running)</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /* Allright, first remove it and mark it running */</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 100 : __remove_timer(t);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 100 : t-&gt;running = this_cpu();</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> : : /* Now we can unlock and call it's expiry */</a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 100 : unlock(&amp;timer_lock);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 100 : t-&gt;expiry(t, t-&gt;user_data, now);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : </a>
+<a name="237"><span class="lineNum"> 237 </span> : : /* Re-lock and mark not running */</a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 100 : lock(&amp;timer_lock);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 100 : t-&gt;running = NULL;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> : : /* Update time stamp */</a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 100 : now = mftb();</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : }</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 65466 : }</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 65466 : void check_timers(bool from_interrupt)</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : {</a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 65466 : uint64_t now = mftb();</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> : : /* This is the polling variant, the SLW interrupt path, when it</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * exists, will use a slight variant of this that doesn't call</a>
+<a name="252"><span class="lineNum"> 252 </span> : : * the pollers</a>
+<a name="253"><span class="lineNum"> 253 </span> : : */</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /* Lockless &quot;peek&quot;, a bit racy but shouldn't be a problem as</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * we are only looking at whether the list is empty</a>
+<a name="257"><span class="lineNum"> 257 </span> : : */</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 130932 : if (list_empty_nocheck(&amp;timer_poll_list) &amp;&amp;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 65466 : list_empty_nocheck(&amp;timer_list))</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> : : /* Take lock and try again */</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 65466 : lock(&amp;timer_lock);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 65466 : if (!from_interrupt)</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 65466 : __check_poll_timers(now);</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 65466 : __check_timers(now);</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 65466 : unlock(&amp;timer_lock);</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : }</a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> : : #ifndef __TEST__</a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> : : void late_init_timers(void)</a>
+<a name="273"><span class="lineNum"> 273 </span> : : {</a>
+<a name="274"><span class="lineNum"> 274 </span> : : int heartbeat = HEARTBEAT_DEFAULT_MS;</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /* Add a property requesting the OS to call opal_poll_event() at</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * a specified interval in order for us to run our background</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * low priority pollers.</a>
+<a name="279"><span class="lineNum"> 279 </span> : : *</a>
+<a name="280"><span class="lineNum"> 280 </span> : : * If a platform quirk exists, use that, else use the default.</a>
+<a name="281"><span class="lineNum"> 281 </span> : : *</a>
+<a name="282"><span class="lineNum"> 282 </span> : : * If we have an SBE timer facility, we run this 10 times slower,</a>
+<a name="283"><span class="lineNum"> 283 </span> : : * we could possibly completely get rid of it.</a>
+<a name="284"><span class="lineNum"> 284 </span> : : *</a>
+<a name="285"><span class="lineNum"> 285 </span> : : * We use a value in milliseconds, we don't want this to ever be</a>
+<a name="286"><span class="lineNum"> 286 </span> : : * faster than that.</a>
+<a name="287"><span class="lineNum"> 287 </span> : : */</a>
+<a name="288"><span class="lineNum"> 288 </span> : : if (platform.heartbeat_time) {</a>
+<a name="289"><span class="lineNum"> 289 </span> : : heartbeat = platform.heartbeat_time();</a>
+<a name="290"><span class="lineNum"> 290 </span> : : } else if (p9_sbe_timer_ok()) {</a>
+<a name="291"><span class="lineNum"> 291 </span> : : heartbeat = HEARTBEAT_DEFAULT_MS * 10;</a>
+<a name="292"><span class="lineNum"> 292 </span> : : } else if (p8_sbe_timer_ok()) {</a>
+<a name="293"><span class="lineNum"> 293 </span> : : heartbeat = HEARTBEAT_DEFAULT_MS * 10;</a>
+<a name="294"><span class="lineNum"> 294 </span> : : }</a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> : : dt_add_property_cells(opal_node, &quot;ibm,heartbeat-ms&quot;, heartbeat);</a>
+<a name="297"><span class="lineNum"> 297 </span> : : }</a>
+<a name="298"><span class="lineNum"> 298 </span> : : #endif</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/trace.c.func-sort-c.html b/coverage-report/core/trace.c.func-sort-c.html
new file mode 100644
index 0000000..21c11e6
--- /dev/null
+++ b/coverage-report/core/trace.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/trace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - trace.c<span style="font-size: 80%;"> (<a href="trace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntry">127</td>
+ <td class="headerCovTableEntryMed">88.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="trace.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#31">init_boot_tracebuf</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#216">init_trace_buffers</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#156">trace_add_dt_props</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#199">trace_add_desc</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#40">tracebuf_extra</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#48">handle_repeat</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#104">trace_add</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/trace.c.func.html b/coverage-report/core/trace.c.func.html
new file mode 100644
index 0000000..957b48c
--- /dev/null
+++ b/coverage-report/core/trace.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/trace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - trace.c<span style="font-size: 80%;"> (<a href="trace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntry">127</td>
+ <td class="headerCovTableEntryMed">88.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="trace.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#48">handle_repeat</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#31">init_boot_tracebuf</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#216">init_trace_buffers</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#104">trace_add</a></td>
+ <td class="coverFnHi">6418116</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#199">trace_add_desc</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#156">trace_add_dt_props</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#40">tracebuf_extra</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/trace.c.gcov.html b/coverage-report/core/trace.c.gcov.html
new file mode 100644
index 0000000..287c871
--- /dev/null
+++ b/coverage-report/core/trace.c.gcov.html
@@ -0,0 +1,347 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/trace.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - trace.c<span style="font-size: 80%;"> (source / <a href="trace.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">112</td>
+ <td class="headerCovTableEntry">127</td>
+ <td class="headerCovTableEntryMed">88.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Trace various things into in-memory buffers</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;trace.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;timebase.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;lock.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;string.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;device.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;libfdt.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;processor.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;opal-api.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &lt;debug_descriptor.h&gt;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define DEBUG_TRACES</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define MAX_SIZE sizeof(union trace)</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : /* Smaller trace buffer for early booting */</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define BOOT_TBUF_SZ 65536</a>
+<a name="28"><span class="lineNum"> 28 </span> : : static struct {</a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct trace_info trace_info;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : char buf[BOOT_TBUF_SZ + MAX_SIZE];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : } boot_tracebuf __section(&quot;.data.boot_trace&quot;);</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : void init_boot_tracebuf(struct cpu_thread *boot_cpu)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : {</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : init_lock(&amp;boot_tracebuf.trace_info.lock);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : boot_tracebuf.trace_info.tb.buf_size = cpu_to_be64(BOOT_TBUF_SZ);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : boot_tracebuf.trace_info.tb.max_size = cpu_to_be32(MAX_SIZE);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : boot_cpu-&gt;trace = &amp;boot_tracebuf.trace_info;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 4 : static size_t tracebuf_extra(void)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> : : /* We make room for the largest possible record */</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 4 : return TBUF_SZ + MAX_SIZE;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : /* To avoid bloating each entry, repeats are actually specific entries.</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * tb-&gt;last points to the last (non-repeat) entry. */</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 6418116 : static bool handle_repeat(struct tracebuf *tb, const union trace *trace)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> : : struct trace_hdr *prev;</a>
+<a name="53"><span class="lineNum"> 53 </span> : : struct trace_repeat *rpt;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : u32 len;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 6418116 : prev = (void *)tb-&gt;buf + be64_to_cpu(tb-&gt;last) % be64_to_cpu(tb-&gt;buf_size);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 6418116 : if (prev-&gt;type != trace-&gt;hdr.type</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 3121739 : || prev-&gt;len_div_8 != trace-&gt;hdr.len_div_8</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 3121739 : || prev-&gt;cpu != trace-&gt;hdr.cpu)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 3296377 : return false;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 3121739 : len = prev-&gt;len_div_8 &lt;&lt; 3;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 3121739 : if (memcmp(prev + 1, &amp;trace-&gt;hdr + 1, len - sizeof(*prev)) != 0)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : /* If they've consumed prev entry, don't repeat. */</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 3121739 : if (be64_to_cpu(tb-&gt;last) &lt; be64_to_cpu(tb-&gt;start))</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> : : /* OK, it's a duplicate. Do we already have repeat? */</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 3121739 : if (be64_to_cpu(tb-&gt;last) + len != be64_to_cpu(tb-&gt;end)) {</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1985763 : u64 pos = be64_to_cpu(tb-&gt;last) + len;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* FIXME: Reader is not protected from seeing this! */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1985763 : rpt = (void *)tb-&gt;buf + pos % be64_to_cpu(tb-&gt;buf_size);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1985763 : assert(pos + rpt-&gt;len_div_8*8 == be64_to_cpu(tb-&gt;end));</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1985763 : assert(rpt-&gt;type == TRACE_REPEAT);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : /* If this repeat entry is full, don't repeat. */</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1985763 : if (be16_to_cpu(rpt-&gt;num) == 0xFFFF)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 16 : return false;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1985747 : rpt-&gt;num = cpu_to_be16(be16_to_cpu(rpt-&gt;num) + 1);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1985747 : rpt-&gt;timestamp = trace-&gt;hdr.timestamp;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1985747 : return true;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /*</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * Generate repeat entry: it's the smallest possible entry, so we</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * must have eliminated old entries.</a>
+<a name="91"><span class="lineNum"> 91 </span> : : */</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1135976 : assert(trace-&gt;hdr.len_div_8 * 8 &gt;= sizeof(*rpt));</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1135976 : rpt = (void *)tb-&gt;buf + be64_to_cpu(tb-&gt;end) % be64_to_cpu(tb-&gt;buf_size);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1135976 : rpt-&gt;timestamp = trace-&gt;hdr.timestamp;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1135976 : rpt-&gt;type = TRACE_REPEAT;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1135976 : rpt-&gt;len_div_8 = sizeof(*rpt) &gt;&gt; 3;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1135976 : rpt-&gt;cpu = trace-&gt;hdr.cpu;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1135976 : rpt-&gt;prev_len = cpu_to_be16(trace-&gt;hdr.len_div_8 &lt;&lt; 3);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1135976 : rpt-&gt;num = cpu_to_be16(1);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1135976 : lwsync(); /* write barrier: complete repeat record before exposing */</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1135976 : tb-&gt;end = cpu_to_be64(be64_to_cpu(tb-&gt;end) + sizeof(*rpt));</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1135976 : return true;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : }</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 6418116 : void trace_add(union trace *trace, u8 type, u16 len)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 6418116 : struct trace_info *ti = this_cpu()-&gt;trace;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : unsigned int tsz;</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 6418116 : trace-&gt;hdr.type = type;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 6418116 : trace-&gt;hdr.len_div_8 = (len + 7) &gt;&gt; 3;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 6418116 : tsz = trace-&gt;hdr.len_div_8 &lt;&lt; 3;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : #ifdef DEBUG_TRACES</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 6418116 : assert(tsz &gt;= sizeof(trace-&gt;hdr));</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 6418116 : assert(tsz &lt;= sizeof(*trace));</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 6418116 : assert(trace-&gt;hdr.type != TRACE_REPEAT);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 6418116 : assert(trace-&gt;hdr.type != TRACE_OVERFLOW);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : #endif</a>
+<a name="122"><span class="lineNum"> 122 </span> : : /* Skip traces not enabled in the debug descriptor */</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 6418116 : if (trace-&gt;hdr.type &lt; (8 * sizeof(debug_descriptor.trace_mask)) &amp;&amp;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 3997699 : !((1ul &lt;&lt; trace-&gt;hdr.type) &amp; be64_to_cpu(debug_descriptor.trace_mask)))</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 6418116 : trace-&gt;hdr.timestamp = cpu_to_be64(mftb());</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 6418116 : trace-&gt;hdr.cpu = cpu_to_be16(this_cpu()-&gt;server_no);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 6418116 : lock(&amp;ti-&gt;lock);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* Throw away old entries before we overwrite them. */</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 10572499 : while ((be64_to_cpu(ti-&gt;tb.start) + be64_to_cpu(ti-&gt;tb.buf_size))</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 10572499 : &lt; (be64_to_cpu(ti-&gt;tb.end) + tsz)) {</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : struct trace_hdr *hdr;</a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 8308766 : hdr = (void *)ti-&gt;tb.buf +</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 4154383 : be64_to_cpu(ti-&gt;tb.start) % be64_to_cpu(ti-&gt;tb.buf_size);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 8308766 : ti-&gt;tb.start = cpu_to_be64(be64_to_cpu(ti-&gt;tb.start) +</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 4154383 : (hdr-&gt;len_div_8 &lt;&lt; 3));</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : }</a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : /* Must update -&gt;start before we rewrite new entries. */</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 6418116 : lwsync(); /* write barrier */</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> : : /* Check for duplicates... */</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 6418116 : if (!handle_repeat(&amp;ti-&gt;tb, trace)) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : /* This may go off end, and that's why ti-&gt;tb.buf is oversize */</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 3296393 : memcpy(ti-&gt;tb.buf + be64_to_cpu(ti-&gt;tb.end) % be64_to_cpu(ti-&gt;tb.buf_size),</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : trace, tsz);</a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 3296393 : ti-&gt;tb.last = ti-&gt;tb.end;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 3296393 : lwsync(); /* write barrier: write entry before exposing */</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 3296393 : ti-&gt;tb.end = cpu_to_be64(be64_to_cpu(ti-&gt;tb.end) + tsz);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : }</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 6418116 : unlock(&amp;ti-&gt;lock);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 1 : static void trace_add_dt_props(void)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : {</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : uint64_t boot_buf_phys = (uint64_t) &amp;boot_tracebuf.trace_info;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : struct dt_node *exports, *traces;</a>
+<a name="162"><span class="lineNum"> 162 </span> : : unsigned int i;</a>
+<a name="163"><span class="lineNum"> 163 </span> : : fdt64_t *prop;</a>
+<a name="164"><span class="lineNum"> 164 </span> : : u64 tmask;</a>
+<a name="165"><span class="lineNum"> 165 </span> : : char tname[256];</a>
+<a name="166"><span class="lineNum"> 166 </span> : : </a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 1 : exports = dt_find_by_path(opal_node, &quot;firmware/exports&quot;);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 1 : if (!exports)</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 1 : traces = dt_new(exports, &quot;traces&quot;);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 1 : if (!exports)</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 1 : prop = malloc(sizeof(u64) * 2 * be32_to_cpu(debug_descriptor.num_traces));</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : </a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 4 : for (i = 0; i &lt; be32_to_cpu(debug_descriptor.num_traces); i++) {</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 3 : uint64_t addr = be64_to_cpu(debug_descriptor.trace_phys[i]);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 3 : uint64_t size = be32_to_cpu(debug_descriptor.trace_size[i]);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 3 : uint32_t pir = be16_to_cpu(debug_descriptor.trace_pir[i]);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 3 : prop[i * 2] = cpu_to_fdt64(addr);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 3 : prop[i * 2 + 1] = cpu_to_fdt64(size);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 3 : if (addr == boot_buf_phys)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : snprintf(tname, sizeof(tname), &quot;boot-%x&quot;, pir);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : else</a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 2 : snprintf(tname, sizeof(tname), &quot;trace-%x&quot;, pir);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 3 : dt_add_property_u64s(traces, tname, addr, size);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1 : dt_add_property(opal_node, &quot;ibm,opal-traces&quot;,</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : prop, sizeof(u64) * 2 * i);</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1 : free(prop);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 1 : tmask = (uint64_t)&amp;debug_descriptor.trace_mask;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 1 : dt_add_property_u64(opal_node, &quot;ibm,opal-trace-mask&quot;, tmask);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : }</a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 3 : static void trace_add_desc(struct trace_info *t, uint64_t size, uint16_t pir)</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : {</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 3 : unsigned int i = be32_to_cpu(debug_descriptor.num_traces);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 3 : if (i &gt;= DEBUG_DESC_MAX_TRACES) {</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : prerror(&quot;TRACE: Debug descriptor trace list full !\n&quot;);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : }</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 3 : debug_descriptor.num_traces = cpu_to_be32(i + 1);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 3 : debug_descriptor.trace_phys[i] = cpu_to_be64((uint64_t)t);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 3 : debug_descriptor.trace_tce[i] = 0; /* populated later */</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 3 : debug_descriptor.trace_size[i] = cpu_to_be32(size);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 3 : debug_descriptor.trace_pir[i] = cpu_to_be16(pir);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> : : /* Allocate trace buffers once we know memory topology */</a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 1 : void init_trace_buffers(void)</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : {</a>
+<a name="220"><span class="lineNum"> 220 </span> : : struct cpu_thread *t;</a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : struct trace_info *any = &amp;boot_tracebuf.trace_info;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : uint64_t size;</a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> : : /* Boot the boot trace in the debug descriptor */</a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1 : trace_add_desc(any, sizeof(boot_tracebuf), this_cpu()-&gt;pir);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : </a>
+<a name="227"><span class="lineNum"> 227 </span> : : /* Allocate a trace buffer for each primary cpu. */</a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 5 : for_each_cpu(t) {</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 4 : if (t-&gt;is_secondary)</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 2 : continue;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : </a>
+<a name="232"><span class="lineNum"> 232 </span> : : /* Use a 64K alignment for TCE mapping */</a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 2 : size = ALIGN_UP(sizeof(*t-&gt;trace) + tracebuf_extra(), 0x10000);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 2 : t-&gt;trace = local_alloc(t-&gt;chip_id, size, 0x10000);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 2 : if (t-&gt;trace) {</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 2 : any = t-&gt;trace;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 2 : memset(t-&gt;trace, 0, size);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 2 : init_lock(&amp;t-&gt;trace-&gt;lock);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 2 : t-&gt;trace-&gt;tb.max_size = cpu_to_be32(MAX_SIZE);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 2 : t-&gt;trace-&gt;tb.buf_size = cpu_to_be64(TBUF_SZ);</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 2 : trace_add_desc(any, sizeof(t-&gt;trace-&gt;tb) +</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 2 : tracebuf_extra(), t-&gt;pir);</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : } else</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : prerror(&quot;TRACE: cpu 0x%x allocation failed\n&quot;, t-&gt;pir);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : }</a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> : : /* In case any allocations failed, share trace buffers. */</a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 5 : for_each_cpu(t) {</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 4 : if (!t-&gt;is_secondary &amp;&amp; !t-&gt;trace)</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : t-&gt;trace = any;</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : }</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> : : /* And copy those to the secondaries. */</a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 5 : for_each_cpu(t) {</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 4 : if (!t-&gt;is_secondary)</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 2 : continue;</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 2 : t-&gt;trace = t-&gt;primary-&gt;trace;</span></a>
+<a name="258"><span class="lineNum"> 258 </span> : : }</a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> : : /* Trace node in DT. */</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 1 : trace_add_dt_props();</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 1 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/vpd.c.func-sort-c.html b/coverage-report/core/vpd.c.func-sort-c.html
new file mode 100644
index 0000000..4691600
--- /dev/null
+++ b/coverage-report/core/vpd.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/vpd.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - vpd.c<span style="font-size: 80%;"> (<a href="vpd.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">59</td>
+ <td class="headerCovTableEntryMed">88.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="vpd.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#40">vpd_valid</a></td>
+ <td class="coverFnHi">33</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#126">vpd_find</a></td>
+ <td class="coverFnHi">251</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#72">vpd_find_record</a></td>
+ <td class="coverFnHi">313</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#17">vpd_find_keyword</a></td>
+ <td class="coverFnHi">867</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/vpd.c.func.html b/coverage-report/core/vpd.c.func.html
new file mode 100644
index 0000000..dd512f5
--- /dev/null
+++ b/coverage-report/core/vpd.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/vpd.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - vpd.c<span style="font-size: 80%;"> (<a href="vpd.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">59</td>
+ <td class="headerCovTableEntryMed">88.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="vpd.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#126">vpd_find</a></td>
+ <td class="coverFnHi">251</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#17">vpd_find_keyword</a></td>
+ <td class="coverFnHi">867</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#72">vpd_find_record</a></td>
+ <td class="coverFnHi">313</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#40">vpd_valid</a></td>
+ <td class="coverFnHi">33</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/core/vpd.c.gcov.html b/coverage-report/core/vpd.c.gcov.html
new file mode 100644
index 0000000..21336cb
--- /dev/null
+++ b/coverage-report/core/vpd.c.gcov.html
@@ -0,0 +1,224 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - core/vpd.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">core</a> - vpd.c<span style="font-size: 80%;"> (source / <a href="vpd.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">52</td>
+ <td class="headerCovTableEntry">59</td>
+ <td class="headerCovTableEntryMed">88.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Parse Vital Product Data (VPD)</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;device.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define CHECK_SPACE(_p, _n, _e) (((_e) - (_p)) &gt;= (_n))</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : /* Low level keyword search in a record. Can be used when we</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * need to find the next keyword of a given type, for example</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * when having multiple MF/SM keyword pairs</a>
+<a name="18"><span class="lineNum"> 18 </span> : : */</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 867 : const void *vpd_find_keyword(const void *rec, size_t rec_sz,</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : const char *kw, uint8_t *kw_size)</a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 867 : const uint8_t *p = rec, *end = rec + rec_sz;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 2759 : while (CHECK_SPACE(p, 3, end)) {</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 2729 : uint8_t k1 = *(p++);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 2729 : uint8_t k2 = *(p++);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 2729 : uint8_t sz = *(p++);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 2729 : if (k1 == kw[0] &amp;&amp; k2 == kw[1]) {</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 837 : if (kw_size)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 834 : *kw_size = sz;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 837 : return p;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1892 : p += sz;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 30 : return NULL;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : }</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /* vpd_valid - does some basic sanity checks to ensure a VPD blob is</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * actually a VPD blob</a>
+<a name="41"><span class="lineNum"> 41 </span> : : */</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 33 : bool vpd_valid(const void *vvpd, size_t vpd_size)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 33 : const uint8_t *vpd = vvpd;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 33 : int size, i = 0;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* find the record start byte */</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 33 : while (i &lt; vpd_size)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 33 : if (vpd[i++] == 0x84)</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 33 : break;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 33 : if (i &gt;= vpd_size)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : /* next two bytes are the record length, little endian */</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 33 : size = 2;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 33 : size += vpd[i];</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 33 : size += vpd[i + 1] &lt;&lt; 8;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 33 : i += size; /* skip to the end marker */</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 33 : if (i &gt;= vpd_size || vpd[i] != 0x78)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 33 : return true;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : }</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> : : /* Locate a record in a VPD blob</a>
+<a name="69"><span class="lineNum"> 69 </span> : : *</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * Note: This works with VPD LIDs. It will scan until it finds</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * the first 0x84, so it will skip all those 0's that the VPD</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * LIDs seem to contain</a>
+<a name="73"><span class="lineNum"> 73 </span> : : */</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 313 : const void *vpd_find_record(const void *vpd, size_t vpd_size,</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : const char *record, size_t *sz)</a>
+<a name="76"><span class="lineNum"> 76 </span> : : {</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 313 : const uint8_t *p = vpd, *end = vpd + vpd_size;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 313 : bool first_start = true;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : size_t rec_sz;</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 313 : uint8_t namesz = 0;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : const char *rec_name;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 313 : if (!vpd)</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1002 : while (CHECK_SPACE(p, 4, end)) {</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : /* Get header byte */</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 990 : if (*(p++) != 0x84) {</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* Skip initial crap in VPD LIDs */</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 374 : if (first_start)</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 330 : continue;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 44 : break;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : }</a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 616 : first_start = false;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 616 : rec_sz = *(p++);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 616 : rec_sz |= *(p++) &lt;&lt; 8;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 616 : if (!CHECK_SPACE(p, rec_sz, end)) {</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : prerror(&quot;VPD: Malformed or truncated VPD,&quot;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : &quot; record size doesn't fit\n&quot;);</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : /* Find record name */</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 616 : rec_name = vpd_find_keyword(p, rec_sz, &quot;RT&quot;, &amp;namesz);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 616 : if (rec_name &amp;&amp; strncmp(record, rec_name, namesz) == 0) {</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 257 : if (sz)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 251 : *sz = rec_sz;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 257 : return p;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 359 : p += rec_sz;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 359 : if (*(p++) != 0x78) {</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : prerror(&quot;VPD: Malformed or truncated VPD,&quot;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : &quot; missing final 0x78 in record %.4s\n&quot;,</a>
+<a name="115"><span class="lineNum"> 115 </span> : : rec_name ? rec_name : &quot;????&quot;);</a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> : : }</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 56 : return NULL;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : }</a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : /* Locate a keyword in a record in a VPD blob</a>
+<a name="123"><span class="lineNum"> 123 </span> : : *</a>
+<a name="124"><span class="lineNum"> 124 </span> : : * Note: This works with VPD LIDs. It will scan until it finds</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * the first 0x84, so it will skip all those 0's that the VPD</a>
+<a name="126"><span class="lineNum"> 126 </span> : : * LIDs seem to contain</a>
+<a name="127"><span class="lineNum"> 127 </span> : : */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 251 : const void *vpd_find(const void *vpd, size_t vpd_size,</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : const char *record, const char *keyword,</a>
+<a name="130"><span class="lineNum"> 130 </span> : : uint8_t *sz)</a>
+<a name="131"><span class="lineNum"> 131 </span> : : {</a>
+<a name="132"><span class="lineNum"> 132 </span> : : size_t rec_sz;</a>
+<a name="133"><span class="lineNum"> 133 </span> : : const uint8_t *p;</a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 251 : p = vpd_find_record(vpd, vpd_size, record, &amp;rec_sz);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 251 : if (p)</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 251 : p = vpd_find_keyword(p, rec_sz, keyword, sz);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 251 : return p;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/emerald.png b/coverage-report/emerald.png
new file mode 100644
index 0000000..38ad4f4
--- /dev/null
+++ b/coverage-report/emerald.png
Binary files differ
diff --git a/coverage-report/external/ffspart/ccan/endian/endian.h.func-sort-c.html b/coverage-report/external/ffspart/ccan/endian/endian.h.func-sort-c.html
new file mode 100644
index 0000000..5ca16fb
--- /dev/null
+++ b/coverage-report/external/ffspart/ccan/endian/endian.h.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/ffspart/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="endian.h.func.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnHi">2268</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ccan/endian/endian.h.func.html b/coverage-report/external/ffspart/ccan/endian/endian.h.func.html
new file mode 100644
index 0000000..df54575
--- /dev/null
+++ b/coverage-report/external/ffspart/ccan/endian/endian.h.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/ffspart/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="endian.h.func-sort-c.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnHi">2268</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ccan/endian/endian.h.gcov.html b/coverage-report/external/ffspart/ccan/endian/endian.h.gcov.html
new file mode 100644
index 0000000..5488847
--- /dev/null
+++ b/coverage-report/external/ffspart/ccan/endian/endian.h.gcov.html
@@ -0,0 +1,440 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ccan/endian/endian.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/ffspart/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (source / <a href="endian.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* CC0 (Public domain) - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #ifndef CCAN_ENDIAN_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #define CCAN_ENDIAN_H</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;config.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : /**</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * BSWAP_16 - reverse bytes in a constant uint16_t value.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : *</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * Example:</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * struct mystruct {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * char buf[BSWAP_16(0x1234)];</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define BSWAP_16(val) \</a>
+<a name="19"><span class="lineNum"> 19 </span> : : ((((uint16_t)(val) &amp; 0x00ff) &lt;&lt; 8) \</a>
+<a name="20"><span class="lineNum"> 20 </span> : : | (((uint16_t)(val) &amp; 0xff00) &gt;&gt; 8))</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : /**</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * BSWAP_32 - reverse bytes in a constant uint32_t value.</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="25"><span class="lineNum"> 25 </span> : : *</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="27"><span class="lineNum"> 27 </span> : : *</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Example:</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * struct mystruct {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * char buf[BSWAP_32(0xff000000)];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #define BSWAP_32(val) \</a>
+<a name="34"><span class="lineNum"> 34 </span> : : ((((uint32_t)(val) &amp; 0x000000ff) &lt;&lt; 24) \</a>
+<a name="35"><span class="lineNum"> 35 </span> : : | (((uint32_t)(val) &amp; 0x0000ff00) &lt;&lt; 8) \</a>
+<a name="36"><span class="lineNum"> 36 </span> : : | (((uint32_t)(val) &amp; 0x00ff0000) &gt;&gt; 8) \</a>
+<a name="37"><span class="lineNum"> 37 </span> : : | (((uint32_t)(val) &amp; 0xff000000) &gt;&gt; 24))</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /**</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * BSWAP_64 - reverse bytes in a constant uint64_t value.</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * @val: constantvalue whose bytes to swap.</a>
+<a name="42"><span class="lineNum"> 42 </span> : : *</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * Example:</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * struct mystruct {</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * char buf[BSWAP_64(0xff00000000000000ULL)];</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * };</a>
+<a name="49"><span class="lineNum"> 49 </span> : : */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #define BSWAP_64(val) \</a>
+<a name="51"><span class="lineNum"> 51 </span> : : ((((uint64_t)(val) &amp; 0x00000000000000ffULL) &lt;&lt; 56) \</a>
+<a name="52"><span class="lineNum"> 52 </span> : : | (((uint64_t)(val) &amp; 0x000000000000ff00ULL) &lt;&lt; 40) \</a>
+<a name="53"><span class="lineNum"> 53 </span> : : | (((uint64_t)(val) &amp; 0x0000000000ff0000ULL) &lt;&lt; 24) \</a>
+<a name="54"><span class="lineNum"> 54 </span> : : | (((uint64_t)(val) &amp; 0x00000000ff000000ULL) &lt;&lt; 8) \</a>
+<a name="55"><span class="lineNum"> 55 </span> : : | (((uint64_t)(val) &amp; 0x000000ff00000000ULL) &gt;&gt; 8) \</a>
+<a name="56"><span class="lineNum"> 56 </span> : : | (((uint64_t)(val) &amp; 0x0000ff0000000000ULL) &gt;&gt; 24) \</a>
+<a name="57"><span class="lineNum"> 57 </span> : : | (((uint64_t)(val) &amp; 0x00ff000000000000ULL) &gt;&gt; 40) \</a>
+<a name="58"><span class="lineNum"> 58 </span> : : | (((uint64_t)(val) &amp; 0xff00000000000000ULL) &gt;&gt; 56))</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : #if HAVE_BYTESWAP_H</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #include &lt;byteswap.h&gt;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #else</a>
+<a name="63"><span class="lineNum"> 63 </span> : : /**</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * bswap_16 - reverse bytes in a uint16_t value.</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * @val: value whose bytes to swap.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * Example:</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * // Output contains &quot;1024 is 4 as two bytes reversed&quot;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * printf(&quot;1024 is %u as two bytes reversed\n&quot;, bswap_16(1024));</a>
+<a name="70"><span class="lineNum"> 70 </span> : : */</a>
+<a name="71"><span class="lineNum"> 71 </span> : : static inline uint16_t bswap_16(uint16_t val)</a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> : : return BSWAP_16(val);</a>
+<a name="74"><span class="lineNum"> 74 </span> : : }</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : /**</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * bswap_32 - reverse bytes in a uint32_t value.</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * @val: value whose bytes to swap.</a>
+<a name="79"><span class="lineNum"> 79 </span> : : *</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * Example:</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * // Output contains &quot;1024 is 262144 as four bytes reversed&quot;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * printf(&quot;1024 is %u as four bytes reversed\n&quot;, bswap_32(1024));</a>
+<a name="83"><span class="lineNum"> 83 </span> : : */</a>
+<a name="84"><span class="lineNum"> 84 </span> : : static inline uint32_t bswap_32(uint32_t val)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> : : return BSWAP_32(val);</a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : #endif /* !HAVE_BYTESWAP_H */</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : #if !HAVE_BSWAP_64</a>
+<a name="91"><span class="lineNum"> 91 </span> : : /**</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * bswap_64 - reverse bytes in a uint64_t value.</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * @val: value whose bytes to swap.</a>
+<a name="94"><span class="lineNum"> 94 </span> : : *</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * Example:</a>
+<a name="96"><span class="lineNum"> 96 </span> : : * // Output contains &quot;1024 is 1125899906842624 as eight bytes reversed&quot;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * printf(&quot;1024 is %llu as eight bytes reversed\n&quot;,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : * (unsigned long long)bswap_64(1024));</a>
+<a name="99"><span class="lineNum"> 99 </span> : : */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : static inline uint64_t bswap_64(uint64_t val)</a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : return BSWAP_64(val);</a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : #endif</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : /* Needed for Glibc like endiness check */</a>
+<a name="107"><span class="lineNum"> 107 </span> : : #define __LITTLE_ENDIAN 1234</a>
+<a name="108"><span class="lineNum"> 108 </span> : : #define __BIG_ENDIAN 4321</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Sanity check the defines. We don't handle weird endianness. */</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #if !HAVE_LITTLE_ENDIAN &amp;&amp; !HAVE_BIG_ENDIAN</a>
+<a name="112"><span class="lineNum"> 112 </span> : : #error &quot;Unknown endian&quot;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : #elif HAVE_LITTLE_ENDIAN &amp;&amp; HAVE_BIG_ENDIAN</a>
+<a name="114"><span class="lineNum"> 114 </span> : : #error &quot;Can't compile for both big and little endian.&quot;</a>
+<a name="115"><span class="lineNum"> 115 </span> : : #elif HAVE_LITTLE_ENDIAN</a>
+<a name="116"><span class="lineNum"> 116 </span> : : #define __BYTE_ORDER __LITTLE_ENDIAN</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #elif HAVE_BIG_ENDIAN</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #define __BYTE_ORDER __BIG_ENDIAN</a>
+<a name="119"><span class="lineNum"> 119 </span> : : #endif</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : #ifdef __CHECKER__</a>
+<a name="123"><span class="lineNum"> 123 </span> : : /* sparse needs forcing to remove bitwise attribute from ccan/short_types */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : #define ENDIAN_CAST __attribute__((force))</a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define ENDIAN_TYPE __attribute__((bitwise))</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #else</a>
+<a name="127"><span class="lineNum"> 127 </span> : : #define ENDIAN_CAST</a>
+<a name="128"><span class="lineNum"> 128 </span> : : #define ENDIAN_TYPE</a>
+<a name="129"><span class="lineNum"> 129 </span> : : #endif</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : typedef uint64_t ENDIAN_TYPE leint64_t;</a>
+<a name="132"><span class="lineNum"> 132 </span> : : typedef uint64_t ENDIAN_TYPE beint64_t;</a>
+<a name="133"><span class="lineNum"> 133 </span> : : typedef uint32_t ENDIAN_TYPE leint32_t;</a>
+<a name="134"><span class="lineNum"> 134 </span> : : typedef uint32_t ENDIAN_TYPE beint32_t;</a>
+<a name="135"><span class="lineNum"> 135 </span> : : typedef uint16_t ENDIAN_TYPE leint16_t;</a>
+<a name="136"><span class="lineNum"> 136 </span> : : typedef uint16_t ENDIAN_TYPE beint16_t;</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : #if HAVE_LITTLE_ENDIAN</a>
+<a name="139"><span class="lineNum"> 139 </span> : : /**</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * CPU_TO_LE64 - convert a constant uint64_t value to little-endian</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * @native: constant to convert</a>
+<a name="142"><span class="lineNum"> 142 </span> : : */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)(native))</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /**</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * CPU_TO_LE32 - convert a constant uint32_t value to little-endian</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * @native: constant to convert</a>
+<a name="148"><span class="lineNum"> 148 </span> : : */</a>
+<a name="149"><span class="lineNum"> 149 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)(native))</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /**</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * CPU_TO_LE16 - convert a constant uint16_t value to little-endian</a>
+<a name="153"><span class="lineNum"> 153 </span> : : * @native: constant to convert</a>
+<a name="154"><span class="lineNum"> 154 </span> : : */</a>
+<a name="155"><span class="lineNum"> 155 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)(native))</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /**</a>
+<a name="158"><span class="lineNum"> 158 </span> : : * LE64_TO_CPU - convert a little-endian uint64_t constant</a>
+<a name="159"><span class="lineNum"> 159 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="160"><span class="lineNum"> 160 </span> : : */</a>
+<a name="161"><span class="lineNum"> 161 </span> : : #define LE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : /**</a>
+<a name="164"><span class="lineNum"> 164 </span> : : * LE32_TO_CPU - convert a little-endian uint32_t constant</a>
+<a name="165"><span class="lineNum"> 165 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="166"><span class="lineNum"> 166 </span> : : */</a>
+<a name="167"><span class="lineNum"> 167 </span> : : #define LE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : /**</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * LE16_TO_CPU - convert a little-endian uint16_t constant</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="172"><span class="lineNum"> 172 </span> : : */</a>
+<a name="173"><span class="lineNum"> 173 </span> : : #define LE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> : : #else /* ... HAVE_BIG_ENDIAN */</a>
+<a name="176"><span class="lineNum"> 176 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)BSWAP_64(native))</a>
+<a name="177"><span class="lineNum"> 177 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)BSWAP_32(native))</a>
+<a name="178"><span class="lineNum"> 178 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)BSWAP_16(native))</a>
+<a name="179"><span class="lineNum"> 179 </span> : : #define LE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="180"><span class="lineNum"> 180 </span> : : #define LE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="181"><span class="lineNum"> 181 </span> : : #define LE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="182"><span class="lineNum"> 182 </span> : : #endif /* HAVE_BIG_ENDIAN */</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : #if HAVE_BIG_ENDIAN</a>
+<a name="185"><span class="lineNum"> 185 </span> : : /**</a>
+<a name="186"><span class="lineNum"> 186 </span> : : * CPU_TO_BE64 - convert a constant uint64_t value to big-endian</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * @native: constant to convert</a>
+<a name="188"><span class="lineNum"> 188 </span> : : */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)(native))</a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> : : /**</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * CPU_TO_BE32 - convert a constant uint32_t value to big-endian</a>
+<a name="193"><span class="lineNum"> 193 </span> : : * @native: constant to convert</a>
+<a name="194"><span class="lineNum"> 194 </span> : : */</a>
+<a name="195"><span class="lineNum"> 195 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)(native))</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> : : /**</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * CPU_TO_BE16 - convert a constant uint16_t value to big-endian</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @native: constant to convert</a>
+<a name="200"><span class="lineNum"> 200 </span> : : */</a>
+<a name="201"><span class="lineNum"> 201 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)(native))</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : /**</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * BE64_TO_CPU - convert a big-endian uint64_t constant</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> : : #define BE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> : : /**</a>
+<a name="210"><span class="lineNum"> 210 </span> : : * BE32_TO_CPU - convert a big-endian uint32_t constant</a>
+<a name="211"><span class="lineNum"> 211 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="212"><span class="lineNum"> 212 </span> : : */</a>
+<a name="213"><span class="lineNum"> 213 </span> : : #define BE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> : : /**</a>
+<a name="216"><span class="lineNum"> 216 </span> : : * BE16_TO_CPU - convert a big-endian uint16_t constant</a>
+<a name="217"><span class="lineNum"> 217 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="218"><span class="lineNum"> 218 </span> : : */</a>
+<a name="219"><span class="lineNum"> 219 </span> : : #define BE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : #else /* ... HAVE_LITTLE_ENDIAN */</a>
+<a name="222"><span class="lineNum"> 222 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)BSWAP_64(native))</a>
+<a name="223"><span class="lineNum"> 223 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)BSWAP_32(native))</a>
+<a name="224"><span class="lineNum"> 224 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)BSWAP_16(native))</a>
+<a name="225"><span class="lineNum"> 225 </span> : : #define BE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="226"><span class="lineNum"> 226 </span> : : #define BE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="227"><span class="lineNum"> 227 </span> : : #define BE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="228"><span class="lineNum"> 228 </span> : : #endif /* HAVE_LITTE_ENDIAN */</a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * cpu_to_le64 - convert a uint64_t value to little-endian</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * @native: value to convert</a>
+<a name="234"><span class="lineNum"> 234 </span> : : */</a>
+<a name="235"><span class="lineNum"> 235 </span> : : static inline leint64_t cpu_to_le64(uint64_t native)</a>
+<a name="236"><span class="lineNum"> 236 </span> : : {</a>
+<a name="237"><span class="lineNum"> 237 </span> : : return CPU_TO_LE64(native);</a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /**</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * cpu_to_le32 - convert a uint32_t value to little-endian</a>
+<a name="242"><span class="lineNum"> 242 </span> : : * @native: value to convert</a>
+<a name="243"><span class="lineNum"> 243 </span> : : */</a>
+<a name="244"><span class="lineNum"> 244 </span> : : static inline leint32_t cpu_to_le32(uint32_t native)</a>
+<a name="245"><span class="lineNum"> 245 </span> : : {</a>
+<a name="246"><span class="lineNum"> 246 </span> : : return CPU_TO_LE32(native);</a>
+<a name="247"><span class="lineNum"> 247 </span> : : }</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> : : /**</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * cpu_to_le16 - convert a uint16_t value to little-endian</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * @native: value to convert</a>
+<a name="252"><span class="lineNum"> 252 </span> : : */</a>
+<a name="253"><span class="lineNum"> 253 </span> : : static inline leint16_t cpu_to_le16(uint16_t native)</a>
+<a name="254"><span class="lineNum"> 254 </span> : : {</a>
+<a name="255"><span class="lineNum"> 255 </span> : : return CPU_TO_LE16(native);</a>
+<a name="256"><span class="lineNum"> 256 </span> : : }</a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> : : /**</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * le64_to_cpu - convert a little-endian uint64_t value</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @le_val: little-endian value to convert</a>
+<a name="261"><span class="lineNum"> 261 </span> : : */</a>
+<a name="262"><span class="lineNum"> 262 </span> : : static inline uint64_t le64_to_cpu(leint64_t le_val)</a>
+<a name="263"><span class="lineNum"> 263 </span> : : {</a>
+<a name="264"><span class="lineNum"> 264 </span> : : return LE64_TO_CPU(le_val);</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : /**</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * le32_to_cpu - convert a little-endian uint32_t value</a>
+<a name="269"><span class="lineNum"> 269 </span> : : * @le_val: little-endian value to convert</a>
+<a name="270"><span class="lineNum"> 270 </span> : : */</a>
+<a name="271"><span class="lineNum"> 271 </span> : : static inline uint32_t le32_to_cpu(leint32_t le_val)</a>
+<a name="272"><span class="lineNum"> 272 </span> : : {</a>
+<a name="273"><span class="lineNum"> 273 </span> : : return LE32_TO_CPU(le_val);</a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /**</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * le16_to_cpu - convert a little-endian uint16_t value</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * @le_val: little-endian value to convert</a>
+<a name="279"><span class="lineNum"> 279 </span> : : */</a>
+<a name="280"><span class="lineNum"> 280 </span> : : static inline uint16_t le16_to_cpu(leint16_t le_val)</a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : return LE16_TO_CPU(le_val);</a>
+<a name="283"><span class="lineNum"> 283 </span> : : }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> : : /**</a>
+<a name="286"><span class="lineNum"> 286 </span> : : * cpu_to_be64 - convert a uint64_t value to big endian.</a>
+<a name="287"><span class="lineNum"> 287 </span> : : * @native: value to convert</a>
+<a name="288"><span class="lineNum"> 288 </span> : : */</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineNoCov"> 0 : static inline beint64_t cpu_to_be64(uint64_t native)</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : {</a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : return CPU_TO_BE64(native);</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : }</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : /**</a>
+<a name="295"><span class="lineNum"> 295 </span> : : * cpu_to_be32 - convert a uint32_t value to big endian.</a>
+<a name="296"><span class="lineNum"> 296 </span> : : * @native: value to convert</a>
+<a name="297"><span class="lineNum"> 297 </span> : : */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 40 : static inline beint32_t cpu_to_be32(uint32_t native)</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : {</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 40 : return CPU_TO_BE32(native);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : }</a>
+<a name="302"><span class="lineNum"> 302 </span> : : </a>
+<a name="303"><span class="lineNum"> 303 </span> : : /**</a>
+<a name="304"><span class="lineNum"> 304 </span> : : * cpu_to_be16 - convert a uint16_t value to big endian.</a>
+<a name="305"><span class="lineNum"> 305 </span> : : * @native: value to convert</a>
+<a name="306"><span class="lineNum"> 306 </span> : : */</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 34 : static inline beint16_t cpu_to_be16(uint16_t native)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : {</a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 34 : return CPU_TO_BE16(native);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> : : /**</a>
+<a name="313"><span class="lineNum"> 313 </span> : : * be64_to_cpu - convert a big-endian uint64_t value</a>
+<a name="314"><span class="lineNum"> 314 </span> : : * @be_val: big-endian value to convert</a>
+<a name="315"><span class="lineNum"> 315 </span> : : */</a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 2268 : static inline uint64_t be64_to_cpu(beint64_t be_val)</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 2268 : return BE64_TO_CPU(be_val);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /**</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * be32_to_cpu - convert a big-endian uint32_t value</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * @be_val: big-endian value to convert</a>
+<a name="324"><span class="lineNum"> 324 </span> : : */</a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : static inline uint32_t be32_to_cpu(beint32_t be_val)</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : return BE32_TO_CPU(be_val);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : }</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> : : /**</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * be16_to_cpu - convert a big-endian uint16_t value</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * @be_val: big-endian value to convert</a>
+<a name="333"><span class="lineNum"> 333 </span> : : */</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineNoCov"> 0 : static inline uint16_t be16_to_cpu(beint16_t be_val)</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : {</a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineNoCov"> 0 : return BE16_TO_CPU(be_val);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : }</a>
+<a name="338"><span class="lineNum"> 338 </span> : : </a>
+<a name="339"><span class="lineNum"> 339 </span> : : /* Whichever they include first, they get these definitions. */</a>
+<a name="340"><span class="lineNum"> 340 </span> : : #ifdef CCAN_SHORT_TYPES_H</a>
+<a name="341"><span class="lineNum"> 341 </span> : : /**</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * be64/be32/be16 - 64/32/16 bit big-endian representation.</a>
+<a name="343"><span class="lineNum"> 343 </span> : : */</a>
+<a name="344"><span class="lineNum"> 344 </span> : : typedef beint64_t be64;</a>
+<a name="345"><span class="lineNum"> 345 </span> : : typedef beint32_t be32;</a>
+<a name="346"><span class="lineNum"> 346 </span> : : typedef beint16_t be16;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /**</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * le64/le32/le16 - 64/32/16 bit little-endian representation.</a>
+<a name="350"><span class="lineNum"> 350 </span> : : */</a>
+<a name="351"><span class="lineNum"> 351 </span> : : typedef leint64_t le64;</a>
+<a name="352"><span class="lineNum"> 352 </span> : : typedef leint32_t le32;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : typedef leint16_t le16;</a>
+<a name="354"><span class="lineNum"> 354 </span> : : #endif</a>
+<a name="355"><span class="lineNum"> 355 </span> : : #endif /* CCAN_ENDIAN_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ccan/endian/index-sort-b.html b/coverage-report/external/ffspart/ccan/endian/index-sort-b.html
new file mode 100644
index 0000000..499ab73
--- /dev/null
+++ b/coverage-report/external/ffspart/ccan/endian/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/ffspart/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=50 height=10 alt="50.0%"><img src="../../../../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ccan/endian/index-sort-f.html b/coverage-report/external/ffspart/ccan/endian/index-sort-f.html
new file mode 100644
index 0000000..56a9a07
--- /dev/null
+++ b/coverage-report/external/ffspart/ccan/endian/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/ffspart/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=50 height=10 alt="50.0%"><img src="../../../../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ccan/endian/index-sort-l.html b/coverage-report/external/ffspart/ccan/endian/index-sort-l.html
new file mode 100644
index 0000000..37b5f3e
--- /dev/null
+++ b/coverage-report/external/ffspart/ccan/endian/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/ffspart/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=50 height=10 alt="50.0%"><img src="../../../../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ccan/endian/index.html b/coverage-report/external/ffspart/ccan/endian/index.html
new file mode 100644
index 0000000..013e54f
--- /dev/null
+++ b/coverage-report/external/ffspart/ccan/endian/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/ffspart/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=50 height=10 alt="50.0%"><img src="../../../../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/arch_flash_common.c.func-sort-c.html b/coverage-report/external/ffspart/common/arch_flash_common.c.func-sort-c.html
new file mode 100644
index 0000000..16f88ef
--- /dev/null
+++ b/coverage-report/external/ffspart/common/arch_flash_common.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common/arch_flash_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (<a href="arch_flash_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="arch_flash_common.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#29">arch_flash_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#36">arch_flash_access</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#17">arch_flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#43">arch_flash_set_wrprotect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/arch_flash_common.c.func.html b/coverage-report/external/ffspart/common/arch_flash_common.c.func.html
new file mode 100644
index 0000000..0d6c64a
--- /dev/null
+++ b/coverage-report/external/ffspart/common/arch_flash_common.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common/arch_flash_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (<a href="arch_flash_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="arch_flash_common.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#29">arch_flash_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#36">arch_flash_access</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#17">arch_flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#43">arch_flash_set_wrprotect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/arch_flash_common.c.gcov.html b/coverage-report/external/ffspart/common/arch_flash_common.c.gcov.html
new file mode 100644
index 0000000..2e1cffb
--- /dev/null
+++ b/coverage-report/external/ffspart/common/arch_flash_common.c.gcov.html
@@ -0,0 +1,135 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common/arch_flash_common.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (source / <a href="arch_flash_common.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Default implementations</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2015-2017 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;arch_flash.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : /*</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * This just assumes that an erase from zero to total size is</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * 'correct'.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * An erase from zero to total size is the correct approach for</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * powerpc and x86. ARM has it own function which also includes a call</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * to the flash driver.</a>
+<a name="18"><span class="lineNum"> 18 </span> : : */</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak)) arch_flash_erase_chip(struct blocklevel_device *bl)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : uint64_t total_size;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, &amp;total_size, NULL);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : return rc;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return blocklevel_erase(bl, 0, total_size);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak,const)) arch_flash_4b_mode(struct blocklevel_device *bl, int set_4b)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : {</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : (void)set_4b;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : enum flash_access __attribute__((weak,const)) arch_flash_access(struct blocklevel_device *bl, enum flash_access access)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : (void)access;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : return ACCESS_INVAL;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak,const)) arch_flash_set_wrprotect(struct blocklevel_device *bl, int set)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : (void)set;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/arch_flash_unknown.c.func-sort-c.html b/coverage-report/external/ffspart/common/arch_flash_unknown.c.func-sort-c.html
new file mode 100644
index 0000000..e9d296a
--- /dev/null
+++ b/coverage-report/external/ffspart/common/arch_flash_unknown.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common/arch_flash_unknown.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (<a href="arch_flash_unknown.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="arch_flash_unknown.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#36">arch_flash_close</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#17">arch_flash_init</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/arch_flash_unknown.c.func.html b/coverage-report/external/ffspart/common/arch_flash_unknown.c.func.html
new file mode 100644
index 0000000..42608ff
--- /dev/null
+++ b/coverage-report/external/ffspart/common/arch_flash_unknown.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common/arch_flash_unknown.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (<a href="arch_flash_unknown.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="arch_flash_unknown.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#36">arch_flash_close</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#17">arch_flash_init</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/arch_flash_unknown.c.gcov.html b/coverage-report/external/ffspart/common/arch_flash_unknown.c.gcov.html
new file mode 100644
index 0000000..ab5c4b0
--- /dev/null
+++ b/coverage-report/external/ffspart/common/arch_flash_unknown.c.gcov.html
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common/arch_flash_unknown.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (source / <a href="arch_flash_unknown.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp.</a>
+<a name="3"><span class="lineNum"> 3 </span> : : */</a>
+<a name="4"><span class="lineNum"> 4 </span> : : </a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;limits.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;dirent.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;libflash/file.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;arch_flash.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 6 : int arch_flash_init(struct blocklevel_device **r_bl, const char *file, bool keep_alive)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 6 : int rc;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 6 : struct blocklevel_device *new_bl;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : /* Must have passed through a file to operate on */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 6 : if (!file) {</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Cannot operate without a file\n&quot;);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 6 : rc = file_init_path(file, NULL, keep_alive, &amp;new_bl);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 6 : if (rc)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : return -1;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 6 : *r_bl = new_bl;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 6 : return 0;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 6 : void arch_flash_close(struct blocklevel_device *bl, const char *file)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 6 : (void)file;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 6 : file_exit_close(bl);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 6 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/index-sort-b.html b/coverage-report/external/ffspart/common/index-sort-b.html
new file mode 100644
index 0000000..9d81610
--- /dev/null
+++ b/coverage-report/external/ffspart/common/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/index-sort-f.html b/coverage-report/external/ffspart/common/index-sort-f.html
new file mode 100644
index 0000000..c4b1cb5
--- /dev/null
+++ b/coverage-report/external/ffspart/common/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/index-sort-l.html b/coverage-report/external/ffspart/common/index-sort-l.html
new file mode 100644
index 0000000..56e5561
--- /dev/null
+++ b/coverage-report/external/ffspart/common/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/common/index.html b/coverage-report/external/ffspart/common/index.html
new file mode 100644
index 0000000..f5aa500
--- /dev/null
+++ b/coverage-report/external/ffspart/common/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ffspart.c.func-sort-c.html b/coverage-report/external/ffspart/ffspart.c.func-sort-c.html
new file mode 100644
index 0000000..a7e0771
--- /dev/null
+++ b/coverage-report/external/ffspart/ffspart.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ffspart.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/ffspart</a> - ffspart.c<span style="font-size: 80%;"> (<a href="ffspart.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">134</td>
+ <td class="headerCovTableEntry">296</td>
+ <td class="headerCovTableEntryLo">45.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ffspart.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#65">parse_toc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#349">print_help</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#366">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#114">parse_entry</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#50">read_u32</a></td>
+ <td class="coverFnHi">56</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#57">advance_line</a></td>
+ <td class="coverFnHi">168</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ffspart.c.func.html b/coverage-report/external/ffspart/ffspart.c.func.html
new file mode 100644
index 0000000..61c1bdc
--- /dev/null
+++ b/coverage-report/external/ffspart/ffspart.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ffspart.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/ffspart</a> - ffspart.c<span style="font-size: 80%;"> (<a href="ffspart.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">134</td>
+ <td class="headerCovTableEntry">296</td>
+ <td class="headerCovTableEntryLo">45.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ffspart.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#57">advance_line</a></td>
+ <td class="coverFnHi">168</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#366">main</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#114">parse_entry</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#65">parse_toc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#349">print_help</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ffspart.c.gcov.html#50">read_u32</a></td>
+ <td class="coverFnHi">56</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/ffspart.c.gcov.html b/coverage-report/external/ffspart/ffspart.c.gcov.html
new file mode 100644
index 0000000..f2f17dd
--- /dev/null
+++ b/coverage-report/external/ffspart/ffspart.c.gcov.html
@@ -0,0 +1,633 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/ffspart.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/ffspart</a> - ffspart.c<span style="font-size: 80%;"> (source / <a href="ffspart.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">134</td>
+ <td class="headerCovTableEntry">296</td>
+ <td class="headerCovTableEntryLo">45.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Assemble a FFS Image (no, not that FFS, this FFS)</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;errno.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;getopt.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;limits.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;string.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;sys/mman.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &lt;libflash/libffs.h&gt;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;libflash/ecc.h&gt;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &lt;common/arch_flash.h&gt;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : /*</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * Flags:</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * - E: ECC for this part</a>
+<a name="31"><span class="lineNum"> 31 </span> : : */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /*</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * TODO FIXME</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * Max line theoretical max size:</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * - name: 15 chars = 15</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * - base: 0xffffffff = 10</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * - size: 0xffffffff = 10</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * - flag: E = 1</a>
+<a name="40"><span class="lineNum"> 40 </span> : : *</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * 36 + 3 separators = 39</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * Plus \n 40</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Lets do 50.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #define MAX_LINE (PATH_MAX+255)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define MAX_TOCS 10</a>
+<a name="47"><span class="lineNum"> 47 </span> : : #define SEPARATOR ','</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : /* Full version number (possibly includes gitid). */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : extern const char version[];</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 56 : static int read_u32(const char *input, uint32_t *val)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 56 : char *endptr;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 56 : *val = strtoul(input, &amp;endptr, 0);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 56 : return (*endptr == SEPARATOR) ? 0 : 1;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : }</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 168 : static const char *advance_line(const char *input)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 168 : char *pos = strchr(input, SEPARATOR);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 168 : if (!pos)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : return NULL;</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 168 : return pos + 1;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : static struct ffs_hdr *parse_toc(const char *line, uint32_t block_size,</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : uint32_t block_count)</a>
+<a name="69"><span class="lineNum"> 69 </span> : : {</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : struct ffs_entry_user user;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : struct ffs_hdr *hdr;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : uint32_t tbase;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : if (read_u32(line, &amp;tbase)) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't parse TOC base address\n&quot;);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : line = advance_line(line);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : if (!line) {</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't find TOC flags\n&quot;);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : }</a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : rc = ffs_string_to_entry_user(line, strlen(line), &amp;user);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't parse TOC flags\n&quot;);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : }</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_new(&quot;part&quot;, tbase, 0, &amp;ent);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't make entry for TOC@0x%08x\n&quot;, tbase);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_user_set(ent, &amp;user);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Invalid TOC flag\n&quot;);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(ent);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : }</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : rc = ffs_hdr_new(block_size, block_count, &amp;ent, &amp;hdr);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : hdr = NULL;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't make header for TOC@0x%08x\n&quot;, tbase);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : }</a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(ent);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : return hdr;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : }</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 28 : static int parse_entry(struct blocklevel_device *bl,</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : struct ffs_hdr **tocs, const char *line, bool allow_empty)</a>
+<a name="118"><span class="lineNum"> 118 </span> : : {</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 28 : char name[FFS_PART_NAME_MAX + 2] = { 0 };</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 28 : struct ffs_entry_user user = { 0 };</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 28 : uint32_t pbase, psize, pactual, i;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 28 : struct ffs_entry *new_entry;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 28 : struct stat data_stat;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 28 : const char *filename;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 28 : bool added = false;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 28 : uint8_t *data_ptr, ecc = 0;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 28 : int data_fd, rc;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 28 : char *pos;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 28 : memcpy(name, line, FFS_PART_NAME_MAX + 1);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 28 : pos = strchr(name, SEPARATOR);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* There is discussion to be had as to if we should bail here */</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 28 : if (!pos) {</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;WARNING: Long partition name will get truncated to '%s'\n&quot;,</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : name);</a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : } else {</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 28 : *pos = '\0';</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 28 : line = advance_line(line);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 28 : if (!line || read_u32(line, &amp;pbase)) {</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't parse '%s' partition base address\n&quot;,</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : name);</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : }</a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 28 : line = advance_line(line);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 28 : if (!line || read_u32(line, &amp;psize)) {</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't parse '%s' partition length\n&quot;,</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : name);</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : }</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 28 : line = advance_line(line);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 28 : if (!line || !advance_line(line)) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't find '%s' partition flags\n&quot;,</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : name);</a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 28 : rc = ffs_string_to_entry_user(line, advance_line(line) - 1 - line, &amp;user);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 28 : if (rc) {</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't parse '%s' partition flags\n&quot;,</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : name);</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : }</a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 28 : line = advance_line(line);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : /* Already checked return value */</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 28 : rc = ffs_entry_new(name, pbase, psize, &amp;new_entry);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 28 : if (rc) {</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Invalid entry '%s' 0x%08x for 0x%08x\n&quot;,</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : name, pbase, psize);</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 28 : rc = ffs_entry_user_set(new_entry, &amp;user);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 28 : if (rc) {</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't set '%s' partition flags\n&quot;,</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : name);</a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(new_entry);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : }</a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 28 : if (has_flag(new_entry, FFS_MISCFLAGS_BACKUP)) {</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 1 : rc = ffs_entry_set_act_size(new_entry, 0);</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't set '%s' partition actual size\n&quot;,</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : name);</a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(new_entry);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : }</a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 28 : if (!advance_line(line)) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Missing TOC field for '%s' partition\n&quot;,</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : name);</a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(new_entry);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> : : }</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 28 : while (*line != SEPARATOR) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : int toc = *(line++);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : if (!isdigit(toc)) {</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Bad TOC value %d (%c) for '%s' partition\n&quot;,</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : toc, toc, name);</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(new_entry);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineNoCov"> 0 : toc -= '0';</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : if (!tocs[toc]) {</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;No TOC with ID %d for '%s' partition\n&quot;,</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : toc, name);</a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(new_entry);</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : }</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_add(tocs[toc], new_entry);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't add '%s' partition to TOC %d: %d\n&quot;,</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : name, toc, rc);</a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(new_entry);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : }</a>
+<a name="226"><span class="lineNum"> 226 </span> : : added = true;</a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 28 : if (!added) {</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : /*</a>
+<a name="230"><span class="lineNum"> 230 </span> : : * They didn't specify a TOC in the TOC field, use</a>
+<a name="231"><span class="lineNum"> 231 </span> : : * TOC@0 as the default</a>
+<a name="232"><span class="lineNum"> 232 </span> : : */</a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 28 : rc = ffs_entry_add(tocs[0], new_entry);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 28 : if (rc) {</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't add '%s' partition to default TOC: %d\n&quot;,</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : name, rc);</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(new_entry);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 28 : ffs_entry_put(new_entry);</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : </a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 56 : if (*line != '\0' &amp;&amp; *(line + 1) != '\0') {</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 28 : size_t data_len;</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 28 : filename = line + 1;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> : : /*</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * Support flashing already ecc'd data as this is the case</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * for POWER8 SBE image binary.</a>
+<a name="251"><span class="lineNum"> 251 </span> : : */</a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 28 : if (has_ecc(new_entry) &amp;&amp; !strstr(filename, &quot;.ecc&quot;))</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 20 : blocklevel_ecc_protect(bl, pbase, psize);</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 28 : data_fd = open(filename, O_RDONLY);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 28 : if (data_fd == -1) {</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't open file '%s' for '%s' partition &quot;</span></a>
+<a name="258"><span class="lineNum"> 258 </span> : : &quot;(%m)\n&quot;, filename, name);</a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : }</a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 28 : if (fstat(data_fd, &amp;data_stat) == -1) {</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't stat file '%s' for '%s' partition &quot;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : &quot;(%m)\n&quot;, filename, name);</a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : close(data_fd);</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : }</a>
+<a name="268"><span class="lineNum"> 268 </span> : : </a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 28 : data_ptr = calloc(1, psize);</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 28 : if (!data_ptr) {</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : return -1;</a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 28 : pactual = data_stat.st_size;</span></a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /*</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * There's two char device inputs we care about: /dev/zero and</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * /dev/urandom. Both have a stat.st_size of zero so read in</a>
+<a name="279"><span class="lineNum"> 279 </span> : : * a full partition worth, accounting for ECC overhead.</a>
+<a name="280"><span class="lineNum"> 280 </span> : : */</a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 28 : if (!pactual &amp;&amp; S_ISCHR(data_stat.st_mode)) {</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 28 : pactual = psize;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 28 : if (has_ecc(new_entry)) {</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 20 : pactual = ecc_buffer_size_minus_ecc(pactual);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> : : /* ECC input size needs to be a multiple of 8 */</a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 20 : pactual = pactual &amp; ~0x7;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : }</a>
+<a name="290"><span class="lineNum"> 290 </span> : : }</a>
+<a name="291"><span class="lineNum"> 291 </span> : : /*</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * Sanity check that the file isn't too large for</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * partition</a>
+<a name="294"><span class="lineNum"> 294 </span> : : */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 28 : if (has_ecc(new_entry) &amp;&amp; !strstr(filename, &quot;.ecc&quot;))</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 20 : psize = ecc_buffer_size_minus_ecc(psize);</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 28 : if (pactual &gt; psize) {</span></a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;File '%s' for partition '%s' is too large,&quot;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : &quot; %u &gt; %u\n&quot;,</a>
+<a name="300"><span class="lineNum"> 300 </span> : : filename, name, pactual, psize);</a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : close(data_fd);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 56 : for (data_len = 0; data_len &lt; pactual; data_len += rc) {</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 28 : rc = read(data_fd, &amp;data_ptr[data_len], pactual - data_len);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 28 : if (rc == -1) {</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;error reading from '%s'&quot;, filename);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : }</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 28 : rc = blocklevel_write(bl, pbase, data_ptr, pactual);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 28 : if (rc) {</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't write file '%s' for '%s' partition to PNOR &quot;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : &quot;(%m)\n&quot;, filename, name);</a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> : : }</a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 28 : free(data_ptr);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 28 : close(data_fd);</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : } else {</a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : if (!allow_empty) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Filename missing for partition %s!\n&quot;,</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : name);</a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="327"><span class="lineNum"> 327 </span> : : }</a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : if (has_ecc(new_entry)) {</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineNoCov"> 0 : i = pbase + 8;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : while (i &lt; pbase + psize) {</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_write(bl, i, &amp;ecc, sizeof(ecc));</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;\nError setting ECC byte at 0x%08x\n&quot;,</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : i);</a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : }</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : i += 9;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : }</a>
+<a name="339"><span class="lineNum"> 339 </span> : : }</a>
+<a name="340"><span class="lineNum"> 340 </span> : : </a>
+<a name="341"><span class="lineNum"> 341 </span> : : }</a>
+<a name="342"><span class="lineNum"> 342 </span> : : </a>
+<a name="343"><span class="lineNum"> 343 </span> : : return 0;</a>
+<a name="344"><span class="lineNum"> 344 </span> : : }</a>
+<a name="345"><span class="lineNum"> 345 </span> : : </a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : static void print_version(void)</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : {</a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineNoCov"> 0 : printf(&quot;Open-Power FFS format tool %s\n&quot;, version);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : }</a>
+<a name="350"><span class="lineNum"> 350 </span> : : </a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : static void print_help(const char *pname)</span></a>
+<a name="352"><span class="lineNum"> 352 </span> : : {</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : print_version();</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : printf(&quot;Usage: %s [options] -e -s size -c num -i layout_file -p pnor_file ...\n\n&quot;, pname);</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineNoCov"> 0 : printf(&quot; Options:\n&quot;);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t-e, --allow_empty\n&quot;);</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t\tCreate partition as blank if not specified (sets ECC if flag set)\n\n&quot;);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t-s, --block_size=size\n&quot;);</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t\tSize (in hex with leading 0x) of the blocks on the flash in bytes\n\n&quot;);</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t-c, --block_count=num\n&quot;);</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t\tNumber of blocks on the flash\n\n&quot;);</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t-i, --input=file\n&quot;);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t\tFile containing the required partition data\n\n&quot;);</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t-p, --pnor=file\n&quot;);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : printf(&quot;\t\tOutput file to write data\n\n&quot;);</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 6 : int main(int argc, char *argv[])</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : {</a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 6 : static char line[MAX_LINE];</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : </a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 6 : char *pnor = NULL, *input = NULL;</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 6 : bool toc_created = false, bad_input = false, allow_empty = false;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 6 : uint32_t block_size = 0, block_count = 0;</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 6 : struct ffs_hdr *tocs[MAX_TOCS] = { 0 };</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 6 : struct blocklevel_device *bl = NULL;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 6 : const char *pname = argv[0];</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 30 : int line_number, rc, i;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 30 : FILE *in_file;</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 24 : while(1) {</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 30 : struct option long_opts[] = {</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : {&quot;allow_empty&quot;, no_argument, NULL, 'e'},</a>
+<a name="384"><span class="lineNum"> 384 </span> : : {&quot;block_count&quot;, required_argument, NULL, 'c'},</a>
+<a name="385"><span class="lineNum"> 385 </span> : : {&quot;block_size&quot;, required_argument, NULL, 's'},</a>
+<a name="386"><span class="lineNum"> 386 </span> : : {&quot;debug&quot;, no_argument, NULL, 'g'},</a>
+<a name="387"><span class="lineNum"> 387 </span> : : {&quot;input&quot;, required_argument, NULL, 'i'},</a>
+<a name="388"><span class="lineNum"> 388 </span> : : {&quot;pnor&quot;, required_argument, NULL, 'p'},</a>
+<a name="389"><span class="lineNum"> 389 </span> : : {NULL, 0, 0, 0}</a>
+<a name="390"><span class="lineNum"> 390 </span> : : };</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 30 : int c, oidx = 0;</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : </a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 30 : c = getopt_long(argc, argv, &quot;+:ec:gi:p:s:&quot;, long_opts, &amp;oidx);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 30 : if (c == EOF)</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : break;</a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineCov"> 24 : switch(c) {</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : case 'e':</a>
+<a name="398"><span class="lineNum"> 398 </span> : : allow_empty = true;</a>
+<a name="399"><span class="lineNum"> 399 </span> : : break;</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 6 : case 'c':</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 6 : block_count = strtoul(optarg, NULL, 0);</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : case 'g':</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : libflash_debug = true;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 6 : case 'i':</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineCov"> 6 : free(input);</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 6 : input = strdup(optarg);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 6 : if (!input)</span></a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Out of memory!\n&quot;);</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : break;</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 6 : case 'p':</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 6 : free(pnor);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 6 : pnor = strdup(optarg);</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 6 : if (!pnor)</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Out of memory!\n&quot;);</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : break;</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 6 : case 's':</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineCov"> 6 : block_size = strtoul(optarg, NULL, 0);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : case ':':</span></a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unrecognised option \&quot;%s\&quot; to '%c'\n&quot;,</span></a>
+<a name="423"><span class="lineNum"> 423 </span> : : optarg, optopt);</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : bad_input = true;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : case '?':</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unrecognised option '%c'\n&quot;, optopt);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : bad_input = true;</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : fprintf(stderr , &quot;Encountered unknown error parsing options\n&quot;);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : bad_input = true;</span></a>
+<a name="433"><span class="lineNum"> 433 </span> : : }</a>
+<a name="434"><span class="lineNum"> 434 </span> : : }</a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineCov"> 6 : if (bad_input || !block_size || !block_count || !input || !pnor) {</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : print_help(pname);</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="439"><span class="lineNum"> 439 </span> : : }</a>
+<a name="440"><span class="lineNum"> 440 </span> : : </a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 6 : in_file = fopen(input, &quot;r&quot;);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 6 : if (!in_file) {</span></a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't open your input file %s: %m\n&quot;, input);</span></a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : return 2;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> : : /*</a>
+<a name="448"><span class="lineNum"> 448 </span> : : * TODO: This won't create the file.</a>
+<a name="449"><span class="lineNum"> 449 </span> : : * We should do this</a>
+<a name="450"><span class="lineNum"> 450 </span> : : */</a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineCov"> 6 : rc = arch_flash_init(&amp;bl, pnor, true);</span></a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't initialise architecture flash structures\n&quot;);</span></a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineNoCov"> 0 : fclose(in_file);</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : return 3;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : }</a>
+<a name="457"><span class="lineNum"> 457 </span> : : </a>
+<a name="458"><span class="lineNum"> 458 </span> : : /*</a>
+<a name="459"><span class="lineNum"> 459 </span> : : * 'Erase' the file, make it all 0xFF</a>
+<a name="460"><span class="lineNum"> 460 </span> : : * TODO: Add sparse option and don't do this.</a>
+<a name="461"><span class="lineNum"> 461 </span> : : */</a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 6 : rc = blocklevel_erase(bl, 0, block_size * block_count);</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't erase '%s' pnor file\n&quot;, pnor);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineNoCov"> 0 : fclose(in_file);</span></a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineNoCov"> 0 : return 4;</span></a>
+<a name="467"><span class="lineNum"> 467 </span> : : }</a>
+<a name="468"><span class="lineNum"> 468 </span> : : </a>
+<a name="469"><span class="lineNum"> 469 </span> : : line_number = 0;</a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 34 : while (fgets(line, MAX_LINE, in_file) != NULL) {</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 28 : line_number++;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : </a>
+<a name="473"><span class="lineNum"> 473 </span> : : /* Inline comments in input file */</a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 28 : if (line[0] == '#')</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> : : </a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 28 : if (line[strlen(line) - 1] == '\n')</span></a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 28 : line[strlen(line) - 1] = '\0';</span></a>
+<a name="479"><span class="lineNum"> 479 </span> : : </a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineCov"> 28 : if (line[0] == '@') {</span></a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineNoCov"> 0 : int toc_num = line[1];</span></a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineNoCov"> 0 : rc = 5;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> : : </a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : if (!isdigit(toc_num)) {</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Invalid TOC ID %d (%c)\n&quot;,</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : toc_num, toc_num);</a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineNoCov"> 0 : goto parse_out;</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : }</a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : toc_num -= '0';</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : if (line[2] != SEPARATOR) {</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;TOC ID too long\n&quot;);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : goto parse_out;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> : : }</a>
+<a name="496"><span class="lineNum"> 496 </span> : : </a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : if (tocs[toc_num]) {</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Duplicate TOC ID %d\n&quot;, toc_num);</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : goto parse_out;</span></a>
+<a name="500"><span class="lineNum"> 500 </span> : : }</a>
+<a name="501"><span class="lineNum"> 501 </span> : : </a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : tocs[toc_num] = parse_toc(&amp;line[3], block_size, block_count);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : if (!tocs[toc_num])</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : goto parse_out;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : toc_created = true;</a>
+<a name="506"><span class="lineNum"> 506 </span> : : } else {</a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 28 : if (!toc_created) {</span></a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 6 : fprintf(stderr, &quot;WARNING: Attempting to parse a partition line without any TOCs created.\n&quot;);</span></a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 6 : fprintf(stderr, &quot; Generating a default TOC at zero\n&quot;);</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 6 : rc = ffs_hdr_new(block_size, block_count, NULL, &amp;tocs[0]);</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="512"><span class="lineNum"> 512 </span> :<span class="lineNoCov"> 0 : rc = 7;</span></a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't generate a default TOC at zero\n&quot;);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : goto parse_out;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : }</a>
+<a name="516"><span class="lineNum"> 516 </span> : : toc_created = true;</a>
+<a name="517"><span class="lineNum"> 517 </span> : : }</a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineCov"> 28 : rc = parse_entry(bl, tocs, line, allow_empty);</span></a>
+<a name="519"><span class="lineNum"> 519 </span> :<span class="lineCov"> 28 : if (rc) {</span></a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : rc = 6;</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : goto parse_out;</span></a>
+<a name="522"><span class="lineNum"> 522 </span> : : }</a>
+<a name="523"><span class="lineNum"> 523 </span> : : }</a>
+<a name="524"><span class="lineNum"> 524 </span> : : }</a>
+<a name="525"><span class="lineNum"> 525 </span> : : </a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineCov"> 66 : for(i = 0; i &lt; MAX_TOCS; i++) {</span></a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 60 : if (tocs[i]) {</span></a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 6 : rc = ffs_hdr_finalise(bl, tocs[i]);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : rc = 7;</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Failed to write out TOC values\n&quot;);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="533"><span class="lineNum"> 533 </span> : : }</a>
+<a name="534"><span class="lineNum"> 534 </span> : : }</a>
+<a name="535"><span class="lineNum"> 535 </span> : : }</a>
+<a name="536"><span class="lineNum"> 536 </span> : : </a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineCov"> 6 : parse_out:</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineCov"> 6 : if (rc == 5 || rc == 6)</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Failed to parse input file '%s' at line %d\n&quot;,</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : input, line_number);</a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineCov"> 6 : arch_flash_close(bl, pnor);</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineCov"> 6 : fclose(in_file);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 72 : for(i = 0; i &lt; MAX_TOCS; i++)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> :<span class="lineCov"> 60 : ffs_hdr_free(tocs[i]);</span></a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 6 : free(input);</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineCov"> 6 : free(pnor);</span></a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineCov"> 6 : return rc;</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/index-sort-b.html b/coverage-report/external/ffspart/index-sort-b.html
new file mode 100644
index 0000000..7615ab4
--- /dev/null
+++ b/coverage-report/external/ffspart/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/ffspart</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">134</td>
+ <td class="headerCovTableEntry">296</td>
+ <td class="headerCovTableEntryLo">45.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ffspart.c.gcov.html">ffspart.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=45 height=10 alt="45.3%"><img src="../../snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/index-sort-f.html b/coverage-report/external/ffspart/index-sort-f.html
new file mode 100644
index 0000000..e1a2a61
--- /dev/null
+++ b/coverage-report/external/ffspart/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/ffspart</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">134</td>
+ <td class="headerCovTableEntry">296</td>
+ <td class="headerCovTableEntryLo">45.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ffspart.c.gcov.html">ffspart.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=45 height=10 alt="45.3%"><img src="../../snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/index-sort-l.html b/coverage-report/external/ffspart/index-sort-l.html
new file mode 100644
index 0000000..349d423
--- /dev/null
+++ b/coverage-report/external/ffspart/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/ffspart</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">134</td>
+ <td class="headerCovTableEntry">296</td>
+ <td class="headerCovTableEntryLo">45.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ffspart.c.gcov.html">ffspart.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=45 height=10 alt="45.3%"><img src="../../snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/index.html b/coverage-report/external/ffspart/index.html
new file mode 100644
index 0000000..84015c9
--- /dev/null
+++ b/coverage-report/external/ffspart/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/ffspart</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">134</td>
+ <td class="headerCovTableEntry">296</td>
+ <td class="headerCovTableEntryLo">45.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ffspart.c.gcov.html">ffspart.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=45 height=10 alt="45.3%"><img src="../../snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/blocklevel.c.func-sort-c.html b/coverage-report/external/ffspart/libflash/blocklevel.c.func-sort-c.html
new file mode 100644
index 0000000..b949cf9
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/blocklevel.c.func-sort-c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">98</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">25.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="blocklevel.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/blocklevel.c.func.html b/coverage-report/external/ffspart/libflash/blocklevel.c.func.html
new file mode 100644
index 0000000..b93fcb0
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/blocklevel.c.func.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">98</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">25.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="blocklevel.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/blocklevel.c.gcov.html b/coverage-report/external/ffspart/libflash/blocklevel.c.gcov.html
new file mode 100644
index 0000000..1a74e87
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/blocklevel.c.gcov.html
@@ -0,0 +1,826 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/blocklevel.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (source / <a href="blocklevel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">98</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">25.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;errno.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;libflash/errors.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define PROT_REALLOC_NUM 25</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* This function returns tristate values.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * 1 - The region is ECC protected</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * 0 - The region is not ECC protected</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * -1 - Partially protected</a>
+<a name="24"><span class="lineNum"> 24 </span> : : */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 34 : static int ecc_protected(struct blocklevel_device *bl, uint64_t pos, uint64_t len, uint64_t *start)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : {</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 34 : int i;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Length of 0 is nonsensical so add 1 */</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 34 : if (len == 0)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : len = 1;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 92 : for (i = 0; i &lt; bl-&gt;ecc_prot.n_prot; i++) {</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* Fits entirely within the range */</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 78 : if (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 58 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt;= pos + len) {</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 20 : if (start)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 20 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 20 : return 1;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /*</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Even if ranges are merged we can't currently guarantee two</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * contiguous regions are sanely ECC protected so a partial fit</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * is no good.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 58 : if ((bl-&gt;ecc_prot.prot[i].start &gt;= pos &amp;&amp; bl-&gt;ecc_prot.prot[i].start &lt; pos + len) ||</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 38 : (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 38 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt; pos)) {</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : if (start)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : return 0;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 20 : static uint64_t with_ecc_pos(uint64_t ecc_start, uint64_t pos)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 20 : return pos + ((pos - ecc_start) / (BYTES_PER_ECC));</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 46 : static int reacquire(struct blocklevel_device *bl)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 46 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;reacquire)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : return bl-&gt;reacquire(bl);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : return 0;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 46 : static int release(struct blocklevel_device *bl)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 46 : int rc = 0;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 46 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;release) {</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* This is the error return path a lot, preserve errno */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : int err = errno;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;release(bl);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 46 : return rc;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : int blocklevel_raw_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : if (!bl || !bl-&gt;read || !buf) {</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : return rc;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, pos, buf, len);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : int blocklevel_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : int rc, ecc_protection;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : struct ecc64 *buffer;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : uint64_t ecc_pos, ecc_start, ecc_diff, ecc_len;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : if (!bl || !buf) {</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : }</a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="119"><span class="lineNum"> 119 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineNoCov"> 0 : if (!ecc_protection)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineNoCov"> 0 : return blocklevel_raw_read(bl, pos, buf, len);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /*</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * The region we're reading to has both ecc protection and not.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="127"><span class="lineNum"> 127 </span> : : */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : if (ecc_protection == -1) {</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="142"><span class="lineNum"> 142 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : buffer = malloc(ecc_len);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : if (!buffer) {</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, ecc_len);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> : : /*</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * Could optimise and simply call memcpy_from_ecc() if ecc_diff</a>
+<a name="156"><span class="lineNum"> 156 </span> : : * == 0 but _unaligned checks and bascially does that for us</a>
+<a name="157"><span class="lineNum"> 157 </span> : : */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : if (memcpy_from_ecc_unaligned(buf, buffer, len, ecc_diff)) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : free(buffer);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 34 : int blocklevel_raw_write(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : const void *buf, uint64_t len)</a>
+<a name="170"><span class="lineNum"> 170 </span> : : {</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 34 : int rc;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 34 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 34 : if (!bl || !bl-&gt;write || !buf) {</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 34 : rc = reacquire(bl);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 34 : if (rc)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : return rc;</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 34 : rc = bl-&gt;write(bl, pos, buf, len);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 34 : release(bl);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 34 : return rc;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : }</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 34 : int blocklevel_write(struct blocklevel_device *bl, uint64_t pos, const void *buf,</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : uint64_t len)</a>
+<a name="192"><span class="lineNum"> 192 </span> : : {</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 34 : int rc, ecc_protection;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 34 : struct ecc64 *buffer;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 34 : uint64_t ecc_len;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 34 : uint64_t ecc_start, ecc_pos, ecc_diff;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 34 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 34 : if (!bl || !buf) {</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : }</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 34 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 34 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="208"><span class="lineNum"> 208 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 34 : if (!ecc_protection)</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 14 : return blocklevel_raw_write(bl, pos, buf, len);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /*</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * The region we're writing to has both ecc protection and not.</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="216"><span class="lineNum"> 216 </span> : : */</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 20 : if (ecc_protection == -1) {</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : }</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 20 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 20 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 20 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 20 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 20 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="231"><span class="lineNum"> 231 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 20 : buffer = malloc(ecc_len);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 20 : if (!buffer) {</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 20 : if (ecc_diff) {</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : uint64_t start_chunk = ecc_diff;</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : uint64_t end_chunk = BYTES_PER_ECC - ecc_diff;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : uint64_t end_len = ecc_len - end_chunk;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /*</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * Read the start bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * to calculate the first ecc byte</a>
+<a name="248"><span class="lineNum"> 248 </span> : : */</a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, start_chunk);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> : : /*</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * Read the end bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * to calculate the last ecc byte</a>
+<a name="259"><span class="lineNum"> 259 </span> : : */</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos + end_len, ((char *)buffer) + end_len,</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : end_chunk);</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : if (memcpy_to_ecc_unaligned(buffer, buf, len, ecc_diff)) {</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : } else {</a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 20 : if (memcpy_to_ecc(buffer, buf, len)) {</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : }</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 20 : rc = blocklevel_raw_write(bl, pos, buffer, ecc_len);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : </a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 20 : out:</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 20 : free(buffer);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 20 : return rc;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 12 : int blocklevel_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : {</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 12 : int rc;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 12 : if (!bl || !bl-&gt;erase) {</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 12 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /* Programmer may be making a horrible mistake without knowing it */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 12 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_erase: pos (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : pos, bl-&gt;erase_mask + 1);</a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : }</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 12 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_erase: len (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : len, bl-&gt;erase_mask + 1);</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : }</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 12 : rc = reacquire(bl);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 12 : if (rc)</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : return rc;</a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 12 : rc = bl-&gt;erase(bl, pos, len);</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 12 : release(bl);</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 12 : return rc;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : int blocklevel_get_info(struct blocklevel_device *bl, const char **name, uint64_t *total_size,</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : uint32_t *erase_granule)</a>
+<a name="323"><span class="lineNum"> 323 </span> : : {</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineNoCov"> 0 : if (!bl || !bl-&gt;get_info) {</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : }</a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : return rc;</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;get_info(bl, name, total_size, erase_granule);</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : </a>
+<a name="337"><span class="lineNum"> 337 </span> : : /* Check the validity of what we are being told */</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : if (erase_granule &amp;&amp; *erase_granule != bl-&gt;erase_mask + 1)</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_get_info: WARNING: erase_granule (0x%08x) and erase_mask&quot;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : &quot; (0x%08x) don't match\n&quot;, *erase_granule, bl-&gt;erase_mask + 1);</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : }</a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+<a name="347"><span class="lineNum"> 347 </span> : : /*</a>
+<a name="348"><span class="lineNum"> 348 </span> : : * Compare flash and memory to determine if:</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * a) Erase must happen before write</a>
+<a name="350"><span class="lineNum"> 350 </span> : : * b) Flash and memory are identical</a>
+<a name="351"><span class="lineNum"> 351 </span> : : * c) Flash can simply be written to</a>
+<a name="352"><span class="lineNum"> 352 </span> : : *</a>
+<a name="353"><span class="lineNum"> 353 </span> : : * returns -1 for a</a>
+<a name="354"><span class="lineNum"> 354 </span> : : * returns 0 for b</a>
+<a name="355"><span class="lineNum"> 355 </span> : : * returns 1 for c</a>
+<a name="356"><span class="lineNum"> 356 </span> : : */</a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : static int blocklevel_flashcmp(const void *flash_buf, const void *mem_buf, uint64_t len)</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : {</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : uint64_t i;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : int same = true;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : const uint8_t *f_buf, *m_buf;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : f_buf = flash_buf;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : m_buf = mem_buf;</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : if (m_buf[i] &amp; ~f_buf[i])</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : return -1;</a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : if (same &amp;&amp; (m_buf[i] != f_buf[i]))</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : same = false;</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : }</a>
+<a name="372"><span class="lineNum"> 372 </span> : : </a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : return same ? 0 : 1;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : }</a>
+<a name="375"><span class="lineNum"> 375 </span> : : </a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : int blocklevel_smart_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : {</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : uint64_t block_size;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : void *erase_buf;</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> : : </a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineNoCov"> 0 : if (!bl) {</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> : : /* Nothing smart needs to be done, pos and len are aligned */</a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : if ((pos &amp; bl-&gt;erase_mask) == 0 &amp;&amp; (len &amp; bl-&gt;erase_mask) == 0) {</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: Skipping smarts everything is aligned 0x%&quot; PRIx64 &quot; 0x%&quot; PRIx64</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : &quot;to 0x%08x\n&quot;, __func__, pos, len, bl-&gt;erase_mask);</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : return blocklevel_erase(bl, pos, len);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : }</a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : block_size = bl-&gt;erase_mask + 1;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : erase_buf = malloc(block_size);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : if (!erase_buf) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : }</a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : }</a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : /*</a>
+<a name="410"><span class="lineNum"> 410 </span> : : * base_pos and base_len are the values in the first erase</a>
+<a name="411"><span class="lineNum"> 411 </span> : : * block that we need to preserve: the region up to pos.</a>
+<a name="412"><span class="lineNum"> 412 </span> : : */</a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : uint64_t base_pos = pos &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : uint64_t base_len = pos - base_pos;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : __func__, base_pos, base_pos + base_len);</a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> : : /*</a>
+<a name="420"><span class="lineNum"> 420 </span> : : * Read the entire block in case this is the ONLY block we're</a>
+<a name="421"><span class="lineNum"> 421 </span> : : * modifying, we may need the end chunk of it later</a>
+<a name="422"><span class="lineNum"> 422 </span> : : */</a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, base_pos, erase_buf, block_size);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, base_pos, block_size);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, base_pos, erase_buf, base_len);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /*</a>
+<a name="436"><span class="lineNum"> 436 </span> : : * The requested erase fits entirely into this erase block and</a>
+<a name="437"><span class="lineNum"> 437 </span> : : * so we need to write back the chunk at the end of the block</a>
+<a name="438"><span class="lineNum"> 438 </span> : : */</a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : if (base_pos + base_len + len &lt; base_pos + block_size) {</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, pos + len, erase_buf + base_len + len,</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : block_size - base_len - len);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: Early exit, everything was in one erase block\n&quot;,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : __func__);</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : pos += block_size - base_len;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : len -= block_size - base_len;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* Now we should be aligned, best to double check */</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s:pos 0x%&quot; PRIx64 &quot; isn't erase_mask 0x%08x aligned\n&quot;,</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : __func__, pos, bl-&gt;erase_mask);</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : }</a>
+<a name="458"><span class="lineNum"> 458 </span> : : </a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : if (len &amp; ~(bl-&gt;erase_mask)) {</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, pos, len &amp; ~(bl-&gt;erase_mask));</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : </a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : pos += len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineNoCov"> 0 : len -= len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : }</a>
+<a name="467"><span class="lineNum"> 467 </span> : : </a>
+<a name="468"><span class="lineNum"> 468 </span> : : /* Length should be less than a block now */</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : if (len &gt; block_size) {</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: len 0x%&quot; PRIx64 &quot; is still exceeds block_size 0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : __func__, len, block_size);</a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : }</a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : /*</a>
+<a name="478"><span class="lineNum"> 478 </span> : : * top_pos is the first byte that must be preserved and</a>
+<a name="479"><span class="lineNum"> 479 </span> : : * top_len is the length from top_pos to the end of the erase</a>
+<a name="480"><span class="lineNum"> 480 </span> : : * block: the region that must be preserved</a>
+<a name="481"><span class="lineNum"> 481 </span> : : */</a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineNoCov"> 0 : uint64_t top_pos = pos + len;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineNoCov"> 0 : uint64_t top_len = block_size - len;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : __func__, top_pos, top_pos + top_len);</a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, pos, block_size);</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> : : </a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="499"><span class="lineNum"> 499 </span> : : }</a>
+<a name="500"><span class="lineNum"> 500 </span> : : </a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : int blocklevel_smart_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len)</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : {</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineNoCov"> 0 : void *ecc_buf = NULL;</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineNoCov"> 0 : uint64_t ecc_start;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : int ecc_protection;</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : void *erase_buf = NULL;</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : uint32_t erase_size;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : </a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : const void *write_buf;</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : uint64_t write_len;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineNoCov"> 0 : uint64_t write_pos;</span></a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : int rc = 0;</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : if (!buf || !bl) {</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : </a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : if (!(bl-&gt;flags &amp; WRITE_NEED_ERASE)) {</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: backend doesn't need erase\n&quot;, __func__);</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : return blocklevel_write(bl, pos, buf, len);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, NULL, &amp;erase_size);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="536"><span class="lineNum"> 536 </span> : : return rc;</a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (ecc_protection == -1) {</span></a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : }</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : if (ecc_protection) {</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : uint64_t ecc_pos, ecc_align, ecc_diff, ecc_len;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : </a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region has ECC\n&quot;, __func__);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : ecc_pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : ecc_align = ecc_buffer_align(ecc_start, ecc_pos);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : ecc_diff = ecc_pos - ecc_align;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : ecc_buf = malloc(ecc_len);</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : if (!ecc_buf) {</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> : : }</a>
+<a name="560"><span class="lineNum"> 560 </span> : : </a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : if (ecc_diff) {</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, ecc_align, ecc_buf, ecc_diff);</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : }</a>
+<a name="569"><span class="lineNum"> 569 </span> : : </a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc_unaligned(ecc_buf, buf, len, ecc_diff);</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ECC_INVALID;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : }</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> : : write_buf = ecc_buf;</a>
+<a name="578"><span class="lineNum"> 578 </span> : : write_len = ecc_len;</a>
+<a name="579"><span class="lineNum"> 579 </span> : : write_pos = ecc_pos;</a>
+<a name="580"><span class="lineNum"> 580 </span> : : } else {</a>
+<a name="581"><span class="lineNum"> 581 </span> : : write_buf = buf;</a>
+<a name="582"><span class="lineNum"> 582 </span> : : write_len = len;</a>
+<a name="583"><span class="lineNum"> 583 </span> : : write_pos = pos;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : }</a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : erase_buf = malloc(erase_size);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : if (!erase_buf) {</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : }</a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : </a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineNoCov"> 0 : while (write_len &gt; 0) {</span></a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : uint32_t erase_block = write_pos &amp; ~(erase_size - 1);</span></a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineNoCov"> 0 : uint32_t block_offset = write_pos &amp; (erase_size - 1);</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : uint32_t chunk_size = erase_size &gt; write_len ?</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : write_len : erase_size;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : int cmp;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : </a>
+<a name="604"><span class="lineNum"> 604 </span> : : /* Write crosses an erase boundary, shrink the write to the boundary */</a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : if (erase_size &lt; block_offset + chunk_size) {</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : chunk_size = erase_size - block_offset;</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : }</a>
+<a name="608"><span class="lineNum"> 608 </span> : : </a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : cmp = blocklevel_flashcmp(erase_buf + block_offset, write_buf,</span></a>
+<a name="614"><span class="lineNum"> 614 </span> : : chunk_size);</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region 0x%08x..0x%08x &quot;, __func__,</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : erase_block, erase_size);</a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : if (cmp != 0) {</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;needs &quot;);</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : if (cmp == -1) {</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;erase and &quot;);</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : bl-&gt;erase(bl, erase_block, erase_size);</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : }</a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;write\n&quot;);</span></a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : memcpy(erase_buf + block_offset, write_buf, chunk_size);</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : } else {</a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;clean\n&quot;);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : write_len -= chunk_size;</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : write_pos += chunk_size;</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : write_buf += chunk_size;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : }</a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : out_free:</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="643"><span class="lineNum"> 643 </span> : : }</a>
+<a name="644"><span class="lineNum"> 644 </span> : : </a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 20 : static bool insert_bl_prot_range(struct blocklevel_range *ranges, struct bl_prot_range range)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : {</a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 20 : int i;</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineCov"> 20 : uint32_t pos, len;</span></a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineCov"> 20 : struct bl_prot_range *prot = ranges-&gt;prot;</span></a>
+<a name="650"><span class="lineNum"> 650 </span> : : </a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 20 : pos = range.start;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 20 : len = range.len;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 20 : if (len == 0)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : return true;</a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* Check for overflow */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineCov"> 20 : if (pos + len &lt; len)</span></a>
+<a name="659"><span class="lineNum"> 659 </span> : : return false;</a>
+<a name="660"><span class="lineNum"> 660 </span> : : </a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 50 : for (i = 0; i &lt; ranges-&gt;n_prot &amp;&amp; len &gt; 0; i++) {</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 30 : if (prot[i].start &lt;= pos &amp;&amp; prot[i].start + prot[i].len &gt;= pos + len) {</span></a>
+<a name="663"><span class="lineNum"> 663 </span> : : len = 0;</a>
+<a name="664"><span class="lineNum"> 664 </span> : : break; /* Might as well, the next two conditions can't be true */</a>
+<a name="665"><span class="lineNum"> 665 </span> : : }</a>
+<a name="666"><span class="lineNum"> 666 </span> : : </a>
+<a name="667"><span class="lineNum"> 667 </span> : : /* Can easily extend this down just by adjusting start */</a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 30 : if (pos &lt;= prot[i].start &amp;&amp; pos + len &gt;= prot[i].start) {</span></a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: extending start down\n&quot;, __func__);</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : prot[i].len += prot[i].start - pos;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : prot[i].start = pos;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : pos += prot[i].len;</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : if (prot[i].len &gt;= len)</span></a>
+<a name="674"><span class="lineNum"> 674 </span> : : len = 0;</a>
+<a name="675"><span class="lineNum"> 675 </span> : : else</a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineNoCov"> 0 : len -= prot[i].len;</span></a>
+<a name="677"><span class="lineNum"> 677 </span> : : }</a>
+<a name="678"><span class="lineNum"> 678 </span> : : </a>
+<a name="679"><span class="lineNum"> 679 </span> : : /*</a>
+<a name="680"><span class="lineNum"> 680 </span> : : * Jump over this range but the new range might be so big that</a>
+<a name="681"><span class="lineNum"> 681 </span> : : * theres a chunk after</a>
+<a name="682"><span class="lineNum"> 682 </span> : : */</a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineCov"> 30 : if (pos &gt;= prot[i].start &amp;&amp; pos &lt; prot[i].start + prot[i].len) {</span></a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: fits within current range &quot;, __func__);</span></a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : if (prot[i].start + prot[i].len - pos &gt; len) {</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;but there is some extra at the end\n&quot;);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : len -= prot[i].start + prot[i].len - pos;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : pos = prot[i].start + prot[i].len;</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : } else {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;\n&quot;);</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : len = 0;</a>
+<a name="692"><span class="lineNum"> 692 </span> : : }</a>
+<a name="693"><span class="lineNum"> 693 </span> : : }</a>
+<a name="694"><span class="lineNum"> 694 </span> : : /*</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * This condition will be true if the range is smaller than</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * the current range, therefore it should go here!</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineCov"> 30 : if (pos &lt; prot[i].start &amp;&amp; pos + len &lt;= prot[i].start)</span></a>
+<a name="699"><span class="lineNum"> 699 </span> : : break;</a>
+<a name="700"><span class="lineNum"> 700 </span> : : }</a>
+<a name="701"><span class="lineNum"> 701 </span> : : </a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineCov"> 20 : if (len) {</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 20 : int insert_pos = i;</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineCov"> 20 : struct bl_prot_range *new_ranges = ranges-&gt;prot;</span></a>
+<a name="705"><span class="lineNum"> 705 </span> : : </a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 20 : FL_DBG(&quot;%s: adding 0x%08x..0x%08x\n&quot;, __func__, pos, pos + len);</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 20 : if (ranges-&gt;n_prot == ranges-&gt;total_prot) {</span></a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineCov"> 5 : new_ranges = realloc(ranges-&gt;prot,</span></a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 5 : sizeof(range) * ((ranges-&gt;n_prot) + PROT_REALLOC_NUM));</span></a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineCov"> 5 : if (!new_ranges)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : return false;</a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 5 : ranges-&gt;total_prot += PROT_REALLOC_NUM;</span></a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineCov"> 20 : if (insert_pos != ranges-&gt;n_prot)</span></a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : for (i = ranges-&gt;n_prot; i &gt; insert_pos; i--)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;new_ranges[i], &amp;new_ranges[i - 1], sizeof(range));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 20 : range.start = pos;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 20 : range.len = len;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 20 : memcpy(&amp;new_ranges[insert_pos], &amp;range, sizeof(range));</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 20 : ranges-&gt;prot = new_ranges;</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 20 : ranges-&gt;n_prot++;</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 20 : prot = new_ranges;</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : }</a>
+<a name="725"><span class="lineNum"> 725 </span> : : </a>
+<a name="726"><span class="lineNum"> 726 </span> : : return true;</a>
+<a name="727"><span class="lineNum"> 727 </span> : : }</a>
+<a name="728"><span class="lineNum"> 728 </span> : : </a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineCov"> 20 : int blocklevel_ecc_protect(struct blocklevel_device *bl, uint32_t start, uint32_t len)</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : {</a>
+<a name="731"><span class="lineNum"> 731 </span> : : /*</a>
+<a name="732"><span class="lineNum"> 732 </span> : : * Could implement this at hardware level by having an accessor to the</a>
+<a name="733"><span class="lineNum"> 733 </span> : : * backend in struct blocklevel_device and as a result do nothing at</a>
+<a name="734"><span class="lineNum"> 734 </span> : : * this level (although probably not for ecc!)</a>
+<a name="735"><span class="lineNum"> 735 </span> : : */</a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineCov"> 20 : struct bl_prot_range range = { .start = start, .len = len };</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : </a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineCov"> 20 : if (len &lt; BYTES_PER_ECC)</span></a>
+<a name="739"><span class="lineNum"> 739 </span> : : return -1;</a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 20 : return !insert_bl_prot_range(&amp;bl-&gt;ecc_prot, range);</span></a>
+<a name="741"><span class="lineNum"> 741 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/ecc.c.func-sort-c.html b/coverage-report/external/ffspart/libflash/ecc.c.func-sort-c.html
new file mode 100644
index 0000000..85554f6
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/ecc.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">14.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/ecc.c.func.html b/coverage-report/external/ffspart/libflash/ecc.c.func.html
new file mode 100644
index 0000000..c93cdf6
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/ecc.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">14.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/ecc.c.gcov.html b/coverage-report/external/ffspart/libflash/ecc.c.gcov.html
new file mode 100644
index 0000000..5211852
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/ecc.c.gcov.html
@@ -0,0 +1,534 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/ecc.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - ecc.c<span style="font-size: 80%;"> (source / <a href="ecc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">14.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : /* Bit field identifiers for syndrome calculations. */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : enum eccbitfields</a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : GD = 0xff, //&lt; Good, ECC matches.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : UE = 0xfe, //&lt; Uncorrectable.</a>
+<a name="22"><span class="lineNum"> 22 </span> : : E0 = 71, //&lt; Error in ECC bit 0</a>
+<a name="23"><span class="lineNum"> 23 </span> : : E1 = 70, //&lt; Error in ECC bit 1</a>
+<a name="24"><span class="lineNum"> 24 </span> : : E2 = 69, //&lt; Error in ECC bit 2</a>
+<a name="25"><span class="lineNum"> 25 </span> : : E3 = 68, //&lt; Error in ECC bit 3</a>
+<a name="26"><span class="lineNum"> 26 </span> : : E4 = 67, //&lt; Error in ECC bit 4</a>
+<a name="27"><span class="lineNum"> 27 </span> : : E5 = 66, //&lt; Error in ECC bit 5</a>
+<a name="28"><span class="lineNum"> 28 </span> : : E6 = 65, //&lt; Error in ECC bit 6</a>
+<a name="29"><span class="lineNum"> 29 </span> : : E7 = 64 //&lt; Error in ECC bit 7</a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* 0-63 Correctable bit in byte */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /*</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * Matrix used for ECC calculation.</a>
+<a name="35"><span class="lineNum"> 35 </span> : : *</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * Each row of this is the set of data word bits that are used for</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * the calculation of the corresponding ECC bit. The parity of the</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * bitset is the value of the ECC bit.</a>
+<a name="39"><span class="lineNum"> 39 </span> : : *</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * ie. ECC[n] = eccMatrix[n] &amp; data</a>
+<a name="41"><span class="lineNum"> 41 </span> : : *</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * Note: To make the math easier (and less shifts in resulting code),</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * row0 = ECC7. HW numbering is MSB, order here is LSB.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * These values come from the HW design of the ECC algorithm.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : static uint64_t eccmatrix[] = {</a>
+<a name="48"><span class="lineNum"> 48 </span> : : 0x0000e8423c0f99ffull,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : 0x00e8423c0f99ff00ull,</a>
+<a name="50"><span class="lineNum"> 50 </span> : : 0xe8423c0f99ff0000ull,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : 0x423c0f99ff0000e8ull,</a>
+<a name="52"><span class="lineNum"> 52 </span> : : 0x3c0f99ff0000e842ull,</a>
+<a name="53"><span class="lineNum"> 53 </span> : : 0x0f99ff0000e8423cull,</a>
+<a name="54"><span class="lineNum"> 54 </span> : : 0x99ff0000e8423c0full,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : 0xff0000e8423c0f99ull</a>
+<a name="56"><span class="lineNum"> 56 </span> : : };</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : /**</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * Syndrome calculation matrix.</a>
+<a name="60"><span class="lineNum"> 60 </span> : : *</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * Maps syndrome to flipped bit.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : *</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * To perform ECC correction, this matrix is a look-up of the bit</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * that is bad based on the binary difference of the good and bad</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * ECC. This difference is called the &quot;syndrome&quot;.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * When a particular bit is on in the data, it cause a column from</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * eccMatrix being XOR'd into the ECC field. This column is the</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * &quot;effect&quot; of each bit. If a bit is flipped in the data then its</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * &quot;effect&quot; is missing from the ECC. You can calculate ECC on unknown</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * quality data and compare the ECC field between the calculated</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * value and the stored value. If the difference is zero, then the</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * data is clean. If the difference is non-zero, you look up the</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * difference in the syndrome table to identify the &quot;effect&quot; that</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * is missing, which is the bit that is flipped.</a>
+<a name="76"><span class="lineNum"> 76 </span> : : *</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * Notice that ECC bit flips are recorded by a single &quot;effect&quot;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * bit (ie. 0x1, 0x2, 0x4, 0x8 ...) and double bit flips are identified</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * by the UE status in the table.</a>
+<a name="80"><span class="lineNum"> 80 </span> : : *</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * Bits are in MSB order.</a>
+<a name="82"><span class="lineNum"> 82 </span> : : */</a>
+<a name="83"><span class="lineNum"> 83 </span> : : static enum eccbitfields syndromematrix[] = {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : GD, E7, E6, UE, E5, UE, UE, 47, E4, UE, UE, 37, UE, 35, 39, UE,</a>
+<a name="85"><span class="lineNum"> 85 </span> : : E3, UE, UE, 48, UE, 30, 29, UE, UE, 57, 27, UE, 31, UE, UE, UE,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : E2, UE, UE, 17, UE, 18, 40, UE, UE, 58, 22, UE, 21, UE, UE, UE,</a>
+<a name="87"><span class="lineNum"> 87 </span> : : UE, 16, 49, UE, 19, UE, UE, UE, 23, UE, UE, UE, UE, 20, UE, UE,</a>
+<a name="88"><span class="lineNum"> 88 </span> : : E1, UE, UE, 51, UE, 46, 9, UE, UE, 34, 10, UE, 32, UE, UE, 36,</a>
+<a name="89"><span class="lineNum"> 89 </span> : : UE, 62, 50, UE, 14, UE, UE, UE, 13, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : UE, 61, 8, UE, 41, UE, UE, UE, 11, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : 15, UE, UE, UE, UE, UE, UE, UE, UE, UE, 12, UE, UE, UE, UE, UE,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : E0, UE, UE, 55, UE, 45, 43, UE, UE, 56, 38, UE, 1, UE, UE, UE,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : UE, 25, 26, UE, 2, UE, UE, UE, 24, UE, UE, UE, UE, UE, 28, UE,</a>
+<a name="94"><span class="lineNum"> 94 </span> : : UE, 59, 54, UE, 42, UE, UE, 44, 6, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="95"><span class="lineNum"> 95 </span> : : 5, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : UE, 63, 53, UE, 0, UE, UE, UE, 33, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : 3, UE, UE, 52, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : 7, UE, UE, UE, UE, UE, UE, UE, UE, 60, UE, UE, UE, UE, UE, UE,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : UE, UE, UE, UE, 4, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : };</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /**</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Create the ECC field corresponding to a 8-byte data field</a>
+<a name="104"><span class="lineNum"> 104 </span> : : *</a>
+<a name="105"><span class="lineNum"> 105 </span> : : * @data: The 8 byte data to generate ECC for.</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * @return: The 1 byte ECC corresponding to the data.</a>
+<a name="107"><span class="lineNum"> 107 </span> : : */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 2268 : static uint8_t eccgenerate(uint64_t data)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 2268 : int i;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 2268 : uint8_t result = 0;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 20412 : for (i = 0; i &lt; 8; i++)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 18144 : result |= __builtin_parityll(eccmatrix[i] &amp; data) &lt;&lt; i;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 2268 : return result;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : /**</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * Verify the data and ECC match or indicate how they are wrong.</a>
+<a name="121"><span class="lineNum"> 121 </span> : : *</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * @data: The data to check ECC on.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * @ecc: The [supposed] ECC for the data.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : *</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * @return: eccBitfield or 0-64.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : *</a>
+<a name="127"><span class="lineNum"> 127 </span> : : * @retval GD - Indicates the data is good (matches ECC).</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * @retval UE - Indicates the data is uncorrectable.</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * @retval all others - Indication of which bit is incorrect.</a>
+<a name="130"><span class="lineNum"> 130 </span> : : */</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : static enum eccbitfields eccverify(uint64_t data, uint8_t ecc)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : {</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : return syndromematrix[eccgenerate(data) ^ ecc];</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /* IBM bit ordering */</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : static inline uint64_t eccflipbit(uint64_t data, uint8_t bit)</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : {</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : if (bit &gt; 63)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : return data;</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : return data ^ (1ul &lt;&lt; (63 - bit));</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : static int eccbyte(beint64_t *dst, struct ecc64 *src)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : {</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : uint8_t ecc, badbit;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : uint64_t data;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : data = be64_to_cpu(src-&gt;data);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : ecc = src-&gt;ecc;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : badbit = eccverify(data, ecc);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : if (badbit == UE) {</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;ECC: uncorrectable error: %016llx %02x\n&quot;, (unsigned long long int)data, ecc);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : return badbit;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : }</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : if (badbit &lt;= UE)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : FL_INF(&quot;ECC: correctable error: %i\n&quot;, badbit);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : if (badbit &lt; 64)</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : *dst = cpu_to_be64(eccflipbit(data, badbit));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : else</a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : *dst = cpu_to_be64(data);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : return 0;</a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : static beint64_t *inc_beint64_by(const void *p, uint64_t i)</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : {</a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return (beint64_t *)(((char *)p) + i);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : static uint64_t *inc_uint64_by(const void *p, uint64_t i)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : {</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : return (uint64_t *)(((char *)p) + i);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : static struct ecc64 *inc_ecc64_by(struct ecc64 *p, uint64_t i)</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : {</a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : return (struct ecc64 *)(((char *)p) + i);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : }</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : static uint64_t whole_ecc_bytes(uint64_t i)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : {</a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : return i &amp; ~(BYTES_PER_ECC - 1);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : static uint64_t whole_ecc_structs(uint64_t i)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : {</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return whole_ecc_bytes(i) &gt;&gt; 3;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : /**</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * Correct it along the way and check for errors.</a>
+<a name="196"><span class="lineNum"> 196 </span> : : *</a>
+<a name="197"><span class="lineNum"> 197 </span> : : * @dst: destination buffer without ECC</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * @src: source buffer with ECC</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="200"><span class="lineNum"> 200 </span> : : * Must be 8 byte aligned.</a>
+<a name="201"><span class="lineNum"> 201 </span> : : *</a>
+<a name="202"><span class="lineNum"> 202 </span> : : * @return: Success or error</a>
+<a name="203"><span class="lineNum"> 203 </span> : : *</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * @retval: 0 - success</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @retfal: other - fail</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len)</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : uint32_t i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : if (len &amp; 0x7) {</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* TODO: we could probably handle this */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;ECC data length must be 8 byte aligned length:%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : len);</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : len &gt;&gt;= 3;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : rc = eccbyte(dst, src + i);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : dst++;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> : : return 0;</a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * Correct it along the way and check for errors.</a>
+<a name="234"><span class="lineNum"> 234 </span> : : *</a>
+<a name="235"><span class="lineNum"> 235 </span> : : * Unlike memcmp_from_ecc() which requires that the first byte into</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * dst be the first byte in src (which must also be aligned to a</a>
+<a name="237"><span class="lineNum"> 237 </span> : : * struct ecc64 struct boundary) this function can cope with the first</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * byte in dst not being the first byte in src.</a>
+<a name="239"><span class="lineNum"> 239 </span> : : *</a>
+<a name="240"><span class="lineNum"> 240 </span> : : * Note: src MUST still be aligned to a struct ecc64 otherwise ECC</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * calculations are impossible.</a>
+<a name="242"><span class="lineNum"> 242 </span> : : *</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * The alignment parameter species the number of bytes present at the</a>
+<a name="244"><span class="lineNum"> 244 </span> : : * start of src that should be skipped and not written to dst. Once</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * again, these bytes must be in src otherwise the ECC cannot be</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * checked.</a>
+<a name="247"><span class="lineNum"> 247 </span> : : *</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * len also doesn't have any value limitation for this function. Of</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * course src must contain an exact multiple of struct ecc64 otherwise</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * ECC calculation cannot be performed but this function won't copy</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * the entirety of the last src data word if len is not mutiple of 8</a>
+<a name="252"><span class="lineNum"> 252 </span> : : *</a>
+<a name="253"><span class="lineNum"> 253 </span> : : * @dst: destination buffer without ECC</a>
+<a name="254"><span class="lineNum"> 254 </span> : : * @src: source buffer with ECC</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * @alignment: number of leading bytes in src which shouldn't be</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * copied to dst</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * @return: Success or error</a>
+<a name="259"><span class="lineNum"> 259 </span> : : *</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @retval: 0 - success</a>
+<a name="261"><span class="lineNum"> 261 </span> : : * @retfal: other - fail</a>
+<a name="262"><span class="lineNum"> 262 </span> : : */</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src,</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="265"><span class="lineNum"> 265 </span> : : {</a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : char data[BYTES_PER_ECC];</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : uint8_t bytes_wanted;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : if (alignment &gt; 8)</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : return -1;</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /*</a>
+<a name="276"><span class="lineNum"> 276 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * required - otherwise jump straight to memcpy_from_ecc()</a>
+<a name="278"><span class="lineNum"> 278 </span> : : */</a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : if (alignment) {</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : return rc;</a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : memcpy(dst, &amp;data[alignment], bytes_wanted);</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : src = inc_ecc64_by(src, sizeof(struct ecc64));</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : dst = inc_beint64_by(dst, bytes_wanted);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : len -= bytes_wanted;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : }</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : rc = memcpy_from_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : return rc;</a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> : : /*</a>
+<a name="297"><span class="lineNum"> 297 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * here, (dst and src are different types)</a>
+<a name="299"><span class="lineNum"> 299 </span> : : */</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : dst += whole_ecc_structs(len);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : src += whole_ecc_structs(len);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : len -= whole_ecc_bytes(len);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : if (len) {</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineNoCov"> 0 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : return rc;</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : memcpy(dst, data, len);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : }</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> : : return 0;</a>
+<a name="314"><span class="lineNum"> 314 </span> : : }</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> : : /**</a>
+<a name="317"><span class="lineNum"> 317 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="318"><span class="lineNum"> 318 </span> : : *</a>
+<a name="319"><span class="lineNum"> 319 </span> : : * @dst: destination buffer with ECC</a>
+<a name="320"><span class="lineNum"> 320 </span> : : * @src: source buffer without ECC</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * Must be 8 byte aligned.</a>
+<a name="324"><span class="lineNum"> 324 </span> : : *</a>
+<a name="325"><span class="lineNum"> 325 </span> : : * @return: success or failure</a>
+<a name="326"><span class="lineNum"> 326 </span> : : *</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * @retval: 0 - success</a>
+<a name="328"><span class="lineNum"> 328 </span> : : * @retfal: other - fail</a>
+<a name="329"><span class="lineNum"> 329 </span> : : */</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 20 : int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : {</a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 20 : struct ecc64 ecc_word;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 20 : uint64_t i;</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 20 : if (len &amp; 0x7) {</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : /* TODO: we could probably handle this */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;Data to add ECC bytes to must be 8 byte aligned length: %&quot;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : PRIx64 &quot;\n&quot;, len);</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 20 : len &gt;&gt;= 3;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 2288 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 2268 : ecc_word.ecc = eccgenerate(be64_to_cpu(*(src + i)));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 2268 : ecc_word.data = *(src + i);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : </a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 2268 : *(dst + i) = ecc_word;</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : }</a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : return 0;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : }</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> : : /**</a>
+<a name="356"><span class="lineNum"> 356 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="357"><span class="lineNum"> 357 </span> : : *</a>
+<a name="358"><span class="lineNum"> 358 </span> : : * Unlike memcmp_to_ecc() which requires that the first byte in src be</a>
+<a name="359"><span class="lineNum"> 359 </span> : : * the first byte of a struct ecc64 structure this function does not</a>
+<a name="360"><span class="lineNum"> 360 </span> : : * have this requirement.</a>
+<a name="361"><span class="lineNum"> 361 </span> : : *</a>
+<a name="362"><span class="lineNum"> 362 </span> : : * Like memcpy_to_ecc_unaligned() the alignment parameter specfies the</a>
+<a name="363"><span class="lineNum"> 363 </span> : : * number of bytes in the first src word that are missing and would be</a>
+<a name="364"><span class="lineNum"> 364 </span> : : * required to form a struct ecc64 structure.</a>
+<a name="365"><span class="lineNum"> 365 </span> : : *</a>
+<a name="366"><span class="lineNum"> 366 </span> : : * It must be noted here that extra work IN THE CALLER must be done</a>
+<a name="367"><span class="lineNum"> 367 </span> : : * if your data is unaligned. In order to peform ECC calculations</a>
+<a name="368"><span class="lineNum"> 368 </span> : : * whatever portions of the ecc words are missing in src must be in</a>
+<a name="369"><span class="lineNum"> 369 </span> : : * dst.</a>
+<a name="370"><span class="lineNum"> 370 </span> : : *</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * For example, if there is an alignment value of 1 then this means</a>
+<a name="372"><span class="lineNum"> 372 </span> : : * there is 1 byte (of the total of 8 bytes) missing in src which is</a>
+<a name="373"><span class="lineNum"> 373 </span> : : * needed to calculate the first ECC byte. Therefore the first byte of</a>
+<a name="374"><span class="lineNum"> 374 </span> : : * dst MUST CONTAIN IT!</a>
+<a name="375"><span class="lineNum"> 375 </span> : : *</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * The same problem exists for the end of the buffer where src may not</a>
+<a name="377"><span class="lineNum"> 377 </span> : : * end exactly aligned, if this is the case dst must contain the</a>
+<a name="378"><span class="lineNum"> 378 </span> : : * required bytes to calculate the last ECC byte - they should be in</a>
+<a name="379"><span class="lineNum"> 379 </span> : : * dst where they would normally be found if src did contain those</a>
+<a name="380"><span class="lineNum"> 380 </span> : : * bytes.</a>
+<a name="381"><span class="lineNum"> 381 </span> : : *</a>
+<a name="382"><span class="lineNum"> 382 </span> : : * @dst: destination buffer with ECC</a>
+<a name="383"><span class="lineNum"> 383 </span> : : * @src: source buffer without ECC</a>
+<a name="384"><span class="lineNum"> 384 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="385"><span class="lineNum"> 385 </span> : : * @alignment: The number of bytes 'missing' from the start of src to</a>
+<a name="386"><span class="lineNum"> 386 </span> : : * be struct ecc64 aligned</a>
+<a name="387"><span class="lineNum"> 387 </span> : : *</a>
+<a name="388"><span class="lineNum"> 388 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="389"><span class="lineNum"> 389 </span> : : * Must be 8 byte aligned.</a>
+<a name="390"><span class="lineNum"> 390 </span> : : *</a>
+<a name="391"><span class="lineNum"> 391 </span> : : * @return: success or failure</a>
+<a name="392"><span class="lineNum"> 392 </span> : : *</a>
+<a name="393"><span class="lineNum"> 393 </span> : : * @retval: 0 - success</a>
+<a name="394"><span class="lineNum"> 394 </span> : : * @retfal: other - fail</a>
+<a name="395"><span class="lineNum"> 395 </span> : : */</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src,</span></a>
+<a name="398"><span class="lineNum"> 398 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="399"><span class="lineNum"> 399 </span> : : {</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : struct ecc64 ecc_word;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : uint8_t bytes_wanted;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> : : /*</a>
+<a name="407"><span class="lineNum"> 407 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="408"><span class="lineNum"> 408 </span> : : * required - otherwise jump straight to memcpy_to_ecc()</a>
+<a name="409"><span class="lineNum"> 409 </span> : : */</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : if (alignment) {</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : ecc_word.data = dst-&gt;data;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : memcpy(inc_uint64_by(&amp;ecc_word.data, alignment), src, bytes_wanted);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : memcpy(dst, inc_ecc64_by(&amp;ecc_word, alignment),</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : sizeof(struct ecc64) - alignment);</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : dst = inc_ecc64_by(dst, sizeof(struct ecc64) - alignment);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : src = inc_beint64_by(src, bytes_wanted);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : len -= bytes_wanted;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : return rc;</a>
+<a name="427"><span class="lineNum"> 427 </span> : : </a>
+<a name="428"><span class="lineNum"> 428 </span> : : /*</a>
+<a name="429"><span class="lineNum"> 429 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="430"><span class="lineNum"> 430 </span> : : * here, (dst and src are different types)</a>
+<a name="431"><span class="lineNum"> 431 </span> : : */</a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : dst += whole_ecc_structs(len);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : src += whole_ecc_structs(len);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineNoCov"> 0 : len -= whole_ecc_bytes(len);</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : if (len) {</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - len;</span></a>
+<a name="439"><span class="lineNum"> 439 </span> : : </a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : ecc_word.data = *src;</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : memcpy(inc_uint64_by(&amp;ecc_word.data, len), inc_ecc64_by(dst, len),</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : bytes_wanted);</a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineNoCov"> 0 : *dst = ecc_word;</span></a>
+<a name="446"><span class="lineNum"> 446 </span> : : }</a>
+<a name="447"><span class="lineNum"> 447 </span> : : </a>
+<a name="448"><span class="lineNum"> 448 </span> : : return 0;</a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/ecc.h.func-sort-c.html b/coverage-report/external/ffspart/libflash/ecc.h.func-sort-c.html
new file mode 100644
index 0000000..1bfa87b
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/ecc.h.func-sort-c.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.h.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/ecc.h.func.html b/coverage-report/external/ffspart/libflash/ecc.h.func.html
new file mode 100644
index 0000000..64bb02d
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/ecc.h.func.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.h.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/ecc.h.gcov.html b/coverage-report/external/ffspart/libflash/ecc.h.gcov.html
new file mode 100644
index 0000000..ec444d4
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/ecc.h.gcov.html
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/ecc.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - ecc.h<span style="font-size: 80%;"> (source / <a href="ecc.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #ifndef __ECC_H</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #define __ECC_H</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct ecc64 {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : beint64_t data;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : uint8_t ecc;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : } __attribute__((__packed__));</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : extern int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len);</a>
+<a name="20"><span class="lineNum"> 20 </span> : : extern int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src, uint64_t len,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint8_t alignment);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : extern int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src, uint64_t len,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : uint8_t alignment);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /*</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Calculate the size of a buffer if ECC is added</a>
+<a name="29"><span class="lineNum"> 29 </span> : : *</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * We add 1 byte of ecc for every 8 bytes of data. So we need to round up to 8</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * bytes length and then add 1/8</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #ifndef ALIGN_UP</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define ALIGN_UP(_v, _a) (((_v) + (_a) - 1) &amp; ~((_a) - 1))</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #endif</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define BYTES_PER_ECC 8</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 20 : static inline uint64_t ecc_size(uint64_t len)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 20 : return ALIGN_UP(len, BYTES_PER_ECC) &gt;&gt; 3;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 20 : static inline uint64_t ecc_buffer_size(uint64_t len)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 20 : return ALIGN_UP(len, BYTES_PER_ECC) + ecc_size(len);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : static inline int ecc_buffer_size_check(uint64_t len)</a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> : : return len % (BYTES_PER_ECC + 1);</a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 40 : static inline uint64_t ecc_buffer_size_minus_ecc(uint64_t len)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 40 : return len * BYTES_PER_ECC / (BYTES_PER_ECC + 1);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : }</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 20 : static inline uint64_t ecc_buffer_align(uint64_t start, uint64_t pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 20 : return pos - ((pos - start) % (BYTES_PER_ECC + 1));</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : }</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : #endif</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/file.c.func-sort-c.html b/coverage-report/external/ffspart/libflash/file.c.func-sort-c.html
new file mode 100644
index 0000000..ff2312a
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/file.c.func-sort-c.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">71</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">38.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="file.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/file.c.func.html b/coverage-report/external/ffspart/libflash/file.c.func.html
new file mode 100644
index 0000000..21dfdd0
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/file.c.func.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">71</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">38.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="file.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/file.c.gcov.html b/coverage-report/external/ffspart/libflash/file.c.gcov.html
new file mode 100644
index 0000000..ee2cbf5
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/file.c.gcov.html
@@ -0,0 +1,471 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/file.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - file.c<span style="font-size: 80%;"> (source / <a href="file.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">71</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">38.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define _GNU_SOURCE</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;errno.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/ioctl.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;limits.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;mtd/mtd-abi.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;libflash/file.h&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct file_data {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : int fd;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : char *name;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : char *path;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct blocklevel_device bl;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : };</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : static int file_release(struct blocklevel_device *bl)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : close(file_data-&gt;fd);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = -1;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : static int file_reacquire(struct blocklevel_device *bl)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : int fd;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : fd = open(file_data-&gt;path, O_RDWR);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : if (fd == -1)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = fd;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : static int file_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : int rc, count = 0;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : rc = lseek(file_data-&gt;fd, pos, SEEK_SET);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : /* errno should remain set */</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : if (rc != pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : while (count &lt; len) {</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineNoCov"> 0 : rc = read(file_data-&gt;fd, buf, len - count);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* errno should remain set */</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : if (rc == -1 || rc == 0)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : buf += rc;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : count += rc;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : return 0;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 58 : static int file_write(struct blocklevel_device *bl, uint64_t dst, const void *src,</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : uint64_t len)</a>
+<a name="77"><span class="lineNum"> 77 </span> : : {</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 58 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 58 : int rc, count = 0;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 58 : rc = lseek(file_data-&gt;fd, dst, SEEK_SET);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* errno should remain set */</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 58 : if (rc != dst)</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 116 : while (count &lt; len) {</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 58 : rc = write(file_data-&gt;fd, src, len - count);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* errno should remain set */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 58 : if (rc == -1)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 58 : src += rc;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 58 : count += rc;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : }</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : return 0;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /*</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * Due to to the fact these interfaces are ultimately supposed to deal with</a>
+<a name="101"><span class="lineNum"> 101 </span> : : * flash, an erase function must be implemented even when the flash images</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * are backed by regular files.</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Also, erasing flash leaves all the bits set to 1. This may be expected</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * by higher level functions so this function should also emulate that</a>
+<a name="105"><span class="lineNum"> 105 </span> : : */</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 12 : static int file_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 12 : static char buf[4096];</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 12 : int i = 0;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 12 : int rc;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 12 : memset(buf, ~0, sizeof(buf));</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 36 : while (len - i &gt; 0) {</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 24 : rc = file_write(bl, dst + i, buf, len - i &gt; sizeof(buf) ? sizeof(buf) : len - i);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 24 : if (rc)</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 24 : i += (len - i &gt; sizeof(buf)) ? sizeof(buf) : len - i;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : return 0;</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : static int mtd_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : {</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : int err;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: dst: 0x%&quot; PRIx64 &quot;, len: 0x%&quot; PRIx64 &quot;\n&quot;, __func__, dst, len);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : /*</a>
+<a name="132"><span class="lineNum"> 132 </span> : : * Some kernels that pflash supports do not know about the 64bit</a>
+<a name="133"><span class="lineNum"> 133 </span> : : * version of the ioctl() therefore we'll just use the 32bit (which</a>
+<a name="134"><span class="lineNum"> 134 </span> : : * should always be supported...) unless we MUST use the 64bit and</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * then lets just hope the kernel knows how to deal with it. If it</a>
+<a name="136"><span class="lineNum"> 136 </span> : : * is unsupported the ioctl() will fail and we'll report that -</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * there is no other option.</a>
+<a name="138"><span class="lineNum"> 138 </span> : : *</a>
+<a name="139"><span class="lineNum"> 139 </span> : : * Furthermore, even very recent MTD layers and drivers aren't</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * particularly good at not blocking in the kernel. This creates</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * unexpected behaviour in userspace tools using these functions.</a>
+<a name="142"><span class="lineNum"> 142 </span> : : * In the absence of significant work inside the kernel, we'll just</a>
+<a name="143"><span class="lineNum"> 143 </span> : : * split stuff up here for convenience.</a>
+<a name="144"><span class="lineNum"> 144 </span> : : * We can assume everything is aligned here.</a>
+<a name="145"><span class="lineNum"> 145 </span> : : */</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : while (len) {</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : if (dst &gt; UINT_MAX || len &gt; UINT_MAX) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : struct erase_info_user64 erase_info = {</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : .start = dst,</a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : };</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE64, &amp;erase_info) == -1) {</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : if (err == 25) /* Kernel doesn't do 64bit MTD erase ioctl() */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Attempted a 64bit erase on a kernel which doesn't support it\n&quot;);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : } else {</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : struct erase_info_user erase_info = {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : .start = dst,</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : };</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE, &amp;erase_info) == -1) {</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : dst += file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : len -= file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : }</a>
+<a name="176"><span class="lineNum"> 176 </span> : : return 0;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : static int get_info_name(struct file_data *file_data, char **name)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : {</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : char *path, *lpath;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : int len;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : struct stat st;</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : if (asprintf(&amp;path, &quot;/proc/self/fd/%d&quot;, file_data-&gt;fd) == -1)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : if (lstat(path, &amp;st)) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : lpath = malloc(st.st_size + 1);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : if (!lpath) {</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : }</a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : len = readlink(path, lpath, st.st_size +1);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : if (len == -1) {</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : free(lpath);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : lpath[len] = '\0';</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : *name = lpath;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : static int mtd_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : struct mtd_info_user mtd_info;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : rc = ioctl(file_data-&gt;fd, MEMGETINFO, &amp;mtd_info);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : if (rc == -1)</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : *total_size = mtd_info.size;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : *erase_granule = mtd_info.erasesize;</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : if (name) {</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : return rc;</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : *name = file_data-&gt;name;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : }</a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : return 0;</a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : static int file_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="243"><span class="lineNum"> 243 </span> : : {</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : struct stat st;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : if (fstat(file_data-&gt;fd, &amp;st))</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : *total_size = st.st_size;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : *erase_granule = 1;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : if (name) {</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : return rc;</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : *name = file_data-&gt;name;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : return 0;</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 6 : int file_init(int fd, struct blocklevel_device **bl)</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : {</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 6 : struct file_data *file_data;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 6 : struct stat sbuf;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 6 : if (!bl)</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 6 : *bl = NULL;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 6 : file_data = calloc(1, sizeof(struct file_data));</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 6 : if (!file_data)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 6 : file_data-&gt;fd = fd;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.reacquire = &amp;file_reacquire;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.release = &amp;file_release;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.read = &amp;file_read;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.write = &amp;file_write;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.erase = &amp;file_erase;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.get_info = &amp;file_get_info;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.erase_mask = 0;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> : : /*</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * If the blocklevel_device is only inited with file_init() then keep</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * alive is assumed, as fd will change otherwise and this may break</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * callers assumptions.</a>
+<a name="294"><span class="lineNum"> 294 </span> : : */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.keep_alive = 1;</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /*</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * Unfortunately not all file descriptors are created equal...</a>
+<a name="299"><span class="lineNum"> 299 </span> : : * Here we check to see if the file descriptor is to an MTD device, in</a>
+<a name="300"><span class="lineNum"> 300 </span> : : * which case we have to erase and get the size of it differently.</a>
+<a name="301"><span class="lineNum"> 301 </span> : : */</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 6 : if (fstat(file_data-&gt;fd, &amp;sbuf) == -1)</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : /* Won't be able to handle other than MTD devices for now */</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 6 : if (S_ISCHR(sbuf.st_mode)) {</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase = &amp;mtd_erase;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.get_info = &amp;mtd_get_info;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : mtd_get_info(&amp;file_data-&gt;bl, NULL, NULL, &amp;(file_data-&gt;bl.erase_mask));</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase_mask--;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 6 : } else if (!S_ISREG(sbuf.st_mode)) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : /* If not a char device or a regular file something went wrong */</a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : }</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 6 : *bl = &amp;(file_data-&gt;bl);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 6 : return 0;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : free(file_data);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : }</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 6 : int file_init_path(const char *path, int *r_fd, bool keep_alive,</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : struct blocklevel_device **bl)</a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 6 : int fd, rc;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 6 : char *path_ptr = NULL;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 6 : struct file_data *file_data;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 6 : if (!path || !bl)</span></a>
+<a name="332"><span class="lineNum"> 332 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 6 : fd = open(path, O_RDWR);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 6 : if (fd == -1)</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : /*</a>
+<a name="339"><span class="lineNum"> 339 </span> : : * strdup() first so don't have to deal with malloc failure after</a>
+<a name="340"><span class="lineNum"> 340 </span> : : * file_init()</a>
+<a name="341"><span class="lineNum"> 341 </span> : : */</a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 6 : path_ptr = strdup(path);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 6 : if (!path_ptr) {</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : }</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 6 : rc = file_init(fd, bl);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 6 : if (rc)</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 6 : file_data = container_of(*bl, struct file_data, bl);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 6 : file_data-&gt;bl.keep_alive = keep_alive;</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 6 : file_data-&gt;path = path_ptr;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 6 : if (r_fd)</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : *r_fd = fd;</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : </a>
+<a name="359"><span class="lineNum"> 359 </span> : : return rc;</a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : free(path_ptr);</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : close(fd);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : }</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 6 : void file_exit(struct blocklevel_device *bl)</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : {</a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 6 : struct file_data *file_data;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 6 : if (bl) {</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 6 : free(bl-&gt;ecc_prot.prot);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 6 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 6 : free(file_data-&gt;name);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 6 : free(file_data-&gt;path);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 6 : free(file_data);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> : : }</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 6 : }</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : </a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 6 : void file_exit_close(struct blocklevel_device *bl)</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : {</a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 6 : struct file_data *file_data;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 6 : if (bl) {</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 6 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 6 : close(file_data-&gt;fd);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 6 : file_exit(bl);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 6 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/index-sort-b.html b/coverage-report/external/ffspart/libflash/index-sort-b.html
new file mode 100644
index 0000000..2a3b234
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/index-sort-b.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">385</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">25.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">35.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=39 height=10 alt="38.6%"><img src="../../../snow.png" width=61 height=10 alt="38.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">38.6&nbsp;%</td>
+ <td class="coverNumLo">71 / 184</td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=14 height=10 alt="14.2%"><img src="../../../snow.png" width=86 height=10 alt="14.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.2&nbsp;%</td>
+ <td class="coverNumLo">15 / 106</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=26 height=10 alt="25.7%"><img src="../../../snow.png" width=74 height=10 alt="25.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.7&nbsp;%</td>
+ <td class="coverNumLo">98 / 382</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=45 height=10 alt="44.8%"><img src="../../../snow.png" width=55 height=10 alt="44.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">44.8&nbsp;%</td>
+ <td class="coverNumLo">193 / 431</td>
+ <td class="coverPerLo">53.6&nbsp;%</td>
+ <td class="coverNumLo">15 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/index-sort-f.html b/coverage-report/external/ffspart/libflash/index-sort-f.html
new file mode 100644
index 0000000..c7c2df9
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/index-sort-f.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">385</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">25.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">35.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=14 height=10 alt="14.2%"><img src="../../../snow.png" width=86 height=10 alt="14.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.2&nbsp;%</td>
+ <td class="coverNumLo">15 / 106</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=39 height=10 alt="38.6%"><img src="../../../snow.png" width=61 height=10 alt="38.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">38.6&nbsp;%</td>
+ <td class="coverNumLo">71 / 184</td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=45 height=10 alt="44.8%"><img src="../../../snow.png" width=55 height=10 alt="44.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">44.8&nbsp;%</td>
+ <td class="coverNumLo">193 / 431</td>
+ <td class="coverPerLo">53.6&nbsp;%</td>
+ <td class="coverNumLo">15 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=26 height=10 alt="25.7%"><img src="../../../snow.png" width=74 height=10 alt="25.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.7&nbsp;%</td>
+ <td class="coverNumLo">98 / 382</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/index-sort-l.html b/coverage-report/external/ffspart/libflash/index-sort-l.html
new file mode 100644
index 0000000..5e2db54
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/index-sort-l.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">385</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">25.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">35.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=14 height=10 alt="14.2%"><img src="../../../snow.png" width=86 height=10 alt="14.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.2&nbsp;%</td>
+ <td class="coverNumLo">15 / 106</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=26 height=10 alt="25.7%"><img src="../../../snow.png" width=74 height=10 alt="25.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.7&nbsp;%</td>
+ <td class="coverNumLo">98 / 382</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=39 height=10 alt="38.6%"><img src="../../../snow.png" width=61 height=10 alt="38.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">38.6&nbsp;%</td>
+ <td class="coverNumLo">71 / 184</td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=45 height=10 alt="44.8%"><img src="../../../snow.png" width=55 height=10 alt="44.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">44.8&nbsp;%</td>
+ <td class="coverNumLo">193 / 431</td>
+ <td class="coverPerLo">53.6&nbsp;%</td>
+ <td class="coverNumLo">15 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/index.html b/coverage-report/external/ffspart/libflash/index.html
new file mode 100644
index 0000000..1ccf329
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/index.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/ffspart/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">385</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">25.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">30</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">35.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=26 height=10 alt="25.7%"><img src="../../../snow.png" width=74 height=10 alt="25.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.7&nbsp;%</td>
+ <td class="coverNumLo">98 / 382</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=14 height=10 alt="14.2%"><img src="../../../snow.png" width=86 height=10 alt="14.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.2&nbsp;%</td>
+ <td class="coverNumLo">15 / 106</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=39 height=10 alt="38.6%"><img src="../../../snow.png" width=61 height=10 alt="38.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">38.6&nbsp;%</td>
+ <td class="coverNumLo">71 / 184</td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=45 height=10 alt="44.8%"><img src="../../../snow.png" width=55 height=10 alt="44.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">44.8&nbsp;%</td>
+ <td class="coverNumLo">193 / 431</td>
+ <td class="coverPerLo">53.6&nbsp;%</td>
+ <td class="coverNumLo">15 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/libffs.c.func-sort-c.html b/coverage-report/external/ffspart/libflash/libffs.c.func-sort-c.html
new file mode 100644
index 0000000..9e8471b
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/libffs.c.func-sort-c.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">193</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">44.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">53.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libffs.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnHi">60</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnHi">60</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnHi">62</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnHi">84</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/libffs.c.func.html b/coverage-report/external/ffspart/libflash/libffs.c.func.html
new file mode 100644
index 0000000..2ba4201
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/libffs.c.func.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">193</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">44.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">53.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libffs.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnHi">60</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnHi">62</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnHi">60</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnHi">84</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/libffs.c.gcov.html b/coverage-report/external/ffspart/libflash/libffs.c.gcov.html
new file mode 100644
index 0000000..8909a72
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/libffs.c.gcov.html
@@ -0,0 +1,927 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/libffs.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - libffs.c<span style="font-size: 80%;"> (source / <a href="libffs.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">193</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">44.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">53.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;limits.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #ifndef __SKIBOOT__</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #endif</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;ffs.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define __unused __attribute__((unused))</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define HDR_ENTRIES_NUM 30</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct ffs_handle {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : struct ffs_hdr hdr; /* Converted header */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint32_t toc_offset;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : uint32_t max_size;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : /* The converted header knows how big this is */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct __ffs_hdr *cache;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct blocklevel_device *bl;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : };</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : static uint32_t ffs_checksum(void* data, size_t size)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : {</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : uint32_t i, csum = 0;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : for (i = csum = 0; i &lt; (size/4); i++)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 1160 : csum ^= ((uint32_t *)data)[i];</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 40 : return csum;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : /* Helper functions for typesafety and size safety */</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 6 : static uint32_t ffs_hdr_checksum(struct __ffs_hdr *hdr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 78 : return ffs_checksum(hdr, sizeof(struct __ffs_hdr));</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 34 : static uint32_t ffs_entry_checksum(struct __ffs_entry *ent)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1122 : return ffs_checksum(ent, sizeof(struct __ffs_entry));</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 18 : static size_t ffs_hdr_raw_size(int num_entries)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : {</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 18 : return sizeof(struct __ffs_hdr) + num_entries * sizeof(struct __ffs_entry);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 6 : static int ffs_num_entries(struct ffs_hdr *hdr)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 6 : if (hdr-&gt;count == 0)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s returned zero!\n&quot;, __func__);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 6 : return hdr-&gt;count;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : static int ffs_check_convert_header(struct ffs_hdr *dst, struct __ffs_hdr *src)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(src-&gt;magic) != FFS_MAGIC)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : return FFS_ERR_BAD_MAGIC;</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : dst-&gt;version = be32_to_cpu(src-&gt;version);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : if (dst-&gt;version != FFS_VERSION_1)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FFS_ERR_BAD_VERSION;</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : if (ffs_hdr_checksum(src) != 0)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(src-&gt;entry_size) != sizeof(struct __ffs_entry))</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : if ((be32_to_cpu(src-&gt;entry_size) * be32_to_cpu(src-&gt;entry_count)) &gt;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : (be32_to_cpu(src-&gt;block_size) * be32_to_cpu(src-&gt;size)))</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : dst-&gt;block_size = be32_to_cpu(src-&gt;block_size);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : dst-&gt;size = be32_to_cpu(src-&gt;size) * dst-&gt;block_size;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : dst-&gt;block_count = be32_to_cpu(src-&gt;block_count);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : dst-&gt;entries_size = be32_to_cpu(src-&gt;entry_count);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : }</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 34 : static int ffs_entry_user_to_flash(struct ffs_hdr *hdr __unused,</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : struct __ffs_entry_user *dst, struct ffs_entry_user *src)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 34 : memset(dst, 0, sizeof(struct __ffs_entry_user));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 34 : dst-&gt;datainteg = cpu_to_be16(src-&gt;datainteg);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 34 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 34 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 34 : return 0;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : static int ffs_entry_user_to_cpu(struct ffs_hdr *hdr __unused,</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : struct ffs_entry_user *dst, struct __ffs_entry_user *src)</a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : memset(dst, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : dst-&gt;datainteg = be16_to_cpu(src-&gt;datainteg);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 34 : static int ffs_entry_to_flash(struct ffs_hdr *hdr,</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : struct __ffs_entry *dst, struct ffs_entry *src)</a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 34 : int rc, index;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 34 : if (!hdr || !dst || !src)</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : return -1;</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 116 : for (index = 0; index &lt; hdr-&gt;count &amp;&amp; hdr-&gt;entries[index] != src; index++);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 34 : if (index == hdr-&gt;count)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 34 : index++; /* On flash indexes start at 1 */</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : /*</a>
+<a name="119"><span class="lineNum"> 119 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * dst-&gt;checksum must be zero before calling ffs_entry_checksum()</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * appears the reserved fields are always zero.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : */</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 34 : memset(dst, 0, sizeof(*dst));</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 34 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 34 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 34 : dst-&gt;base = cpu_to_be32(src-&gt;base / hdr-&gt;block_size);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 34 : dst-&gt;size = cpu_to_be32(src-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 34 : dst-&gt;pid = cpu_to_be32(src-&gt;pid);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 34 : dst-&gt;id = cpu_to_be32(index);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 34 : dst-&gt;type = cpu_to_be32(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 34 : dst-&gt;flags = cpu_to_be32(src-&gt;flags);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 34 : dst-&gt;actual = cpu_to_be32(src-&gt;actual);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 34 : rc = ffs_entry_user_to_flash(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 34 : dst-&gt;checksum = ffs_entry_checksum(dst);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 34 : return rc;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineNoCov"> 0 : static int ffs_entry_to_cpu(struct ffs_hdr *hdr,</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : struct ffs_entry *dst, struct __ffs_entry *src)</a>
+<a name="143"><span class="lineNum"> 143 </span> : : {</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : if (ffs_entry_checksum(src) != 0)</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : dst-&gt;base = be32_to_cpu(src-&gt;base) * hdr-&gt;block_size;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : dst-&gt;size = be32_to_cpu(src-&gt;size) * hdr-&gt;block_size;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : dst-&gt;actual = be32_to_cpu(src-&gt;actual);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : dst-&gt;pid = be32_to_cpu(src-&gt;pid);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : dst-&gt;type = be32_to_cpu(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : dst-&gt;flags = be32_to_cpu(src-&gt;flags);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_user_to_cpu(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : char *ffs_entry_user_to_string(struct ffs_entry_user *user)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : {</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : char *ret;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : if (!user)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : return NULL;</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : ret = strdup(&quot;----------&quot;);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : return NULL;</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : if (user-&gt;datainteg &amp; FFS_ENRY_INTEG_ECC)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : ret[0] = 'E';</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512V)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : ret[1] = 'L';</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512EC)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : ret[2] = 'I';</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_PRESERVED)</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : ret[3] = 'P';</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_READONLY)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : ret[4] = 'R';</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_BACKUP)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : ret[5] = 'B';</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_REPROVISION)</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : ret[6] = 'F';</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_GOLDEN)</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : ret[7] = 'G';</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_CLEARECC)</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : ret[8] = 'C';</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_VOLATILE)</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : ret[9] = 'V';</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : return ret;</a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 28 : int ffs_string_to_entry_user(const char *flags, int nflags,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : struct ffs_entry_user *user)</a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 28 : int i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 28 : if (!user || !flags)</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 28 : memset(user, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 76 : for (i = 0; i &lt; nflags; i++) {</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 48 : switch (flags[i]) {</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 20 : case 'E':</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 20 : user-&gt;datainteg |= FFS_ENRY_INTEG_ECC;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 20 : break;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 1 : case 'L':</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : user-&gt;vercheck |= FFS_VERCHECK_SHA512V;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : case 'I':</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : user-&gt;vercheck |= FFS_VERCHECK_SHA512EC;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1 : case 'P':</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 1 : user-&gt;miscflags |= FFS_MISCFLAGS_PRESERVED;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 1 : case 'R':</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 1 : user-&gt;miscflags |= FFS_MISCFLAGS_READONLY;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : case 'B':</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 1 : user-&gt;miscflags |= FFS_MISCFLAGS_BACKUP;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 16 : case 'F':</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 16 : user-&gt;miscflags |= FFS_MISCFLAGS_REPROVISION;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 16 : break;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : case 'G':</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_GOLDEN;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 2 : case 'C':</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 2 : user-&gt;miscflags |= FFS_MISCFLAGS_CLEARECC;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 6 : case 'V':</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 6 : user-&gt;miscflags |= FFS_MISCFLAGS_VOLATILE;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Unknown flag '%c'\n&quot;, flags[i]);</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : }</a>
+<a name="251"><span class="lineNum"> 251 </span> : : }</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> : : return 0;</a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 28 : bool has_flag(struct ffs_entry *ent, uint16_t flag)</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 28 : return ((ent-&gt;user.miscflags &amp; flag) != 0);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : }</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : static struct ffs_entry *__ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : {</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : if (index &gt;= ffs-&gt;hdr.count)</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : return NULL;</a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : return ffs-&gt;hdr.entries[index];</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ret = __ffs_entry_get(ffs, index);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : if (ret)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : ret-&gt;ref++;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : return ret;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 62 : struct ffs_entry *ffs_entry_put(struct ffs_entry *ent)</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : {</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 62 : if (!ent)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return NULL;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 62 : ent-&gt;ref--;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 62 : if (ent-&gt;ref == 0) {</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 34 : free(ent);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 34 : ent = NULL;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> : : return ent;</a>
+<a name="288"><span class="lineNum"> 288 </span> : : }</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 84 : bool has_ecc(struct ffs_entry *ent)</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : {</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 84 : return ((ent-&gt;user.datainteg &amp; FFS_ENRY_INTEG_ECC) != 0);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : struct ffs_handle **ffs, bool mark_ecc)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : struct __ffs_hdr blank_hdr;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : struct __ffs_hdr raw_hdr;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : struct ffs_handle *f;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : uint64_t total_size;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : int rc, i;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : if (!ffs || !bl)</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineNoCov"> 0 : *ffs = NULL;</span></a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, &amp;total_size, NULL);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d retrieving flash info\n&quot;, rc);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : }</a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : if (total_size &gt; UINT_MAX)</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : if ((offset + max_size) &lt; offset)</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : if ((max_size &gt; total_size))</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Read flash header */</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, offset, &amp;raw_hdr, sizeof(raw_hdr));</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash header\n&quot;, rc);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /*</a>
+<a name="329"><span class="lineNum"> 329 </span> : : * Flash controllers can get deconfigured or otherwise upset, when this</a>
+<a name="330"><span class="lineNum"> 330 </span> : : * happens they return all 0xFF bytes.</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * An __ffs_hdr consisting of all 0xFF cannot be valid and it would be</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * nice to drop a hint to the user to help with debugging. This will</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * help quickly differentiate between flash corruption and standard</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * type 'reading from the wrong place' errors vs controller errors or</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * reading erased data.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : memset(&amp;blank_hdr, UINT_MAX, sizeof(struct __ffs_hdr));</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : if (memcmp(&amp;blank_hdr, &amp;raw_hdr, sizeof(struct __ffs_hdr)) == 0) {</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Reading the flash has returned all 0xFF.\n&quot;);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Are you reading erased flash?\n&quot;);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Is something else using the flash controller?\n&quot;);</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_BAD_READ;</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : }</a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> : : /* Allocate ffs_handle structure and start populating */</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : f = calloc(1, sizeof(*f));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : if (!f)</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : f-&gt;toc_offset = offset;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : f-&gt;max_size = max_size;</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : f-&gt;bl = bl;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : </a>
+<a name="354"><span class="lineNum"> 354 </span> : : /* Convert and check flash header */</a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineNoCov"> 0 : rc = ffs_check_convert_header(&amp;f-&gt;hdr, &amp;raw_hdr);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : FL_INF(&quot;FFS: Flash header not found. Code: %d\n&quot;, rc);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> : : }</a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Check header is sane */</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : if ((f-&gt;hdr.block_count * f-&gt;hdr.block_size) &gt; max_size) {</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Flash header exceeds max flash size\n&quot;);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : }</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : f-&gt;hdr.entries = calloc(f-&gt;hdr.entries_size, sizeof(struct ffs_entry *));</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> : : /*</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * Grab the entire partition header</a>
+<a name="372"><span class="lineNum"> 372 </span> : : */</a>
+<a name="373"><span class="lineNum"> 373 </span> : : /* Check for overflow or a silly size */</a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : if (!f-&gt;hdr.size || f-&gt;hdr.size % f-&gt;hdr.block_size != 0) {</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Cache size overflow (0x%x * 0x%x)\n&quot;,</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : f-&gt;hdr.block_size, f-&gt;hdr.size);</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : }</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Partition map size: 0x%x\n&quot;, f-&gt;hdr.size);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> : : /* Allocate cache */</a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : f-&gt;cache = malloc(f-&gt;hdr.size);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineNoCov"> 0 : if (!f-&gt;cache) {</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> : : /* Read the cached map */</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, offset, f-&gt;cache, f-&gt;hdr.size);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash partition map\n&quot;, rc);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; f-&gt;hdr.entries_size; i++) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent = calloc(1, sizeof(struct ffs_entry));</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : if (!ent) {</span></a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : }</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : f-&gt;hdr.entries[f-&gt;hdr.count++] = ent;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : ent-&gt;ref = 1;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_to_cpu(&amp;f-&gt;hdr, ent, &amp;f-&gt;cache-&gt;entries[i]);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Failed checksum for partition %s\n&quot;,</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : f-&gt;cache-&gt;entries[i].name);</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : }</a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : if (mark_ecc &amp;&amp; has_ecc(ent)) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_ecc_protect(bl, ent-&gt;base, ent-&gt;size);</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;Failed to blocklevel_ecc_protect(0x%08x, 0x%08x)\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : ent-&gt;base, ent-&gt;size);</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : }</a>
+<a name="420"><span class="lineNum"> 420 </span> : : }</a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : if (rc == 0)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : *ffs = f;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : else</a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : ffs_close(f);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : return rc;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : }</a>
+<a name="431"><span class="lineNum"> 431 </span> : : </a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 60 : static void __hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> : : {</a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 60 : int i;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineCov"> 60 : if (!hdr)</span></a>
+<a name="437"><span class="lineNum"> 437 </span> : : return;</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 40 : for (i = 0; i &lt; hdr-&gt;count; i++)</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 34 : ffs_entry_put(hdr-&gt;entries[i]);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 6 : free(hdr-&gt;entries);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : }</a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 60 : void ffs_hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 60 : __hdr_free(hdr);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 60 : free(hdr);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 60 : }</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineNoCov"> 0 : void ffs_close(struct ffs_handle *ffs)</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : {</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : __hdr_free(&amp;ffs-&gt;hdr);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> : : </a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineNoCov"> 0 : if (ffs-&gt;cache)</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : free(ffs-&gt;cache);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : </a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineNoCov"> 0 : free(ffs);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="459"><span class="lineNum"> 459 </span> : : </a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : int ffs_lookup_part(struct ffs_handle *ffs, const char *name,</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : uint32_t *part_idx)</a>
+<a name="462"><span class="lineNum"> 462 </span> : : {</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineNoCov"> 0 : struct ffs_entry **ents = ffs-&gt;hdr.entries;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineNoCov"> 0 : for (i = 0;</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : i &lt; ffs-&gt;hdr.count &amp;&amp;</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineNoCov"> 0 : strncmp(name, ents[i]-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : i++);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : if (i == ffs-&gt;hdr.count)</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineNoCov"> 0 : if (part_idx)</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : *part_idx = i;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> : : return 0;</a>
+<a name="477"><span class="lineNum"> 477 </span> : : }</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : int ffs_part_info(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : char **name, uint32_t *start,</a>
+<a name="481"><span class="lineNum"> 481 </span> : : uint32_t *total_size, uint32_t *act_size, bool *ecc)</a>
+<a name="482"><span class="lineNum"> 482 </span> : : {</a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : char *n;</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineNoCov"> 0 : if (!ent)</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : if (start)</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : *start = ent-&gt;base;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : *total_size = ent-&gt;size;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : if (act_size)</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : *act_size = ent-&gt;actual;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : if (ecc)</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : *ecc = has_ecc(ent);</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : if (name) {</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : n = calloc(1, FFS_PART_NAME_MAX + 1);</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : if (!n)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : memcpy(n, ent-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : *name = n;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : return 0;</a>
+<a name="507"><span class="lineNum"> 507 </span> : : }</a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> : : /*</a>
+<a name="510"><span class="lineNum"> 510 </span> : : * There are quite a few ways one might consider two ffs_handles to be the</a>
+<a name="511"><span class="lineNum"> 511 </span> : : * same. For the purposes of this function we are trying to detect a fairly</a>
+<a name="512"><span class="lineNum"> 512 </span> : : * specific scenario:</a>
+<a name="513"><span class="lineNum"> 513 </span> : : * Consecutive calls to ffs_next_side() may succeed but have gone circular.</a>
+<a name="514"><span class="lineNum"> 514 </span> : : * It is possible that the OTHER_SIDE partition in one TOC actually points</a>
+<a name="515"><span class="lineNum"> 515 </span> : : * back to the TOC to first ffs_handle.</a>
+<a name="516"><span class="lineNum"> 516 </span> : : * This function compares for this case, therefore the requirements are</a>
+<a name="517"><span class="lineNum"> 517 </span> : : * simple, the underlying blocklevel_devices must be the same along with</a>
+<a name="518"><span class="lineNum"> 518 </span> : : * the toc_offset and the max_size.</a>
+<a name="519"><span class="lineNum"> 519 </span> : : */</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : bool ffs_equal(struct ffs_handle *one, struct ffs_handle *two)</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : {</a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : return (!one &amp;&amp; !two) || (one &amp;&amp; two &amp;&amp; one-&gt;bl == two-&gt;bl</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : &amp;&amp; one-&gt;toc_offset == two-&gt;toc_offset</a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : &amp;&amp; one-&gt;max_size == two-&gt;max_size);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : int ffs_next_side(struct ffs_handle *ffs, struct ffs_handle **new_ffs,</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : bool mark_ecc)</a>
+<a name="529"><span class="lineNum"> 529 </span> : : {</a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : uint32_t index, offset, max_size;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : </a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : if (!ffs || !new_ffs)</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : </a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : *new_ffs = NULL;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : rc = ffs_lookup_part(ffs, &quot;OTHER_SIDE&quot;, &amp;index);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : return rc;</a>
+<a name="541"><span class="lineNum"> 541 </span> : : </a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : rc = ffs_part_info(ffs, index, NULL, &amp;offset, &amp;max_size, NULL, NULL);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : return rc;</a>
+<a name="545"><span class="lineNum"> 545 </span> : : </a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : return ffs_init(offset, max_size, ffs-&gt;bl, new_ffs, mark_ecc);</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : }</a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 28 : int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : {</a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineCov"> 28 : const char *smallest_name;</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineCov"> 28 : uint32_t smallest_base, toc_base;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineCov"> 28 : int i;</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineCov"> 28 : FL_DBG(&quot;LIBFFS: Adding '%s' at 0x%08x..0x%08x\n&quot;,</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : entry-&gt;name, entry-&gt;base, entry-&gt;base + entry-&gt;size);</a>
+<a name="557"><span class="lineNum"> 557 </span> : : </a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 28 : if (hdr-&gt;count == 0) {</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFFS: Adding an entry to an empty header\n&quot;);</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : }</a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineCov"> 28 : if (entry-&gt;base + entry-&gt;size &gt; hdr-&gt;block_size * hdr-&gt;block_count)</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="564"><span class="lineNum"> 564 </span> : : </a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineCov"> 28 : smallest_base = entry-&gt;base;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 28 : smallest_name = entry-&gt;name;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineCov"> 28 : toc_base = 0;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : /*</a>
+<a name="569"><span class="lineNum"> 569 </span> : : * TODO: This may have assumed entries was sorted</a>
+<a name="570"><span class="lineNum"> 570 </span> : : */</a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineCov"> 110 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineCov"> 82 : struct ffs_entry *ent = hdr-&gt;entries[i];</span></a>
+<a name="573"><span class="lineNum"> 573 </span> : : </a>
+<a name="574"><span class="lineNum"> 574 </span> : : /* Don't allow same names to differ only by case */</a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineCov"> 82 : if (strncasecmp(entry-&gt;name, ent-&gt;name, FFS_PART_NAME_MAX) == 0)</span></a>
+<a name="576"><span class="lineNum"> 576 </span> : : return FFS_ERR_BAD_PART_NAME;</a>
+<a name="577"><span class="lineNum"> 577 </span> : : </a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineCov"> 82 : if (entry-&gt;base &gt;= ent-&gt;base &amp;&amp; entry-&gt;base &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="579"><span class="lineNum"> 579 </span> : : return FFS_ERR_BAD_PART_BASE;</a>
+<a name="580"><span class="lineNum"> 580 </span> : : </a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineCov"> 82 : if (entry-&gt;base + entry-&gt;size &gt; ent-&gt;base &amp;&amp;</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineCov"> 82 : entry-&gt;base + entry-&gt;size &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="583"><span class="lineNum"> 583 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineCov"> 82 : if (entry-&gt;actual &gt; entry-&gt;size)</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="587"><span class="lineNum"> 587 </span> : : </a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineCov"> 82 : if (entry-&gt;pid != FFS_PID_TOPLEVEL)</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : return FFS_ERR_BAD_PART_PID;</a>
+<a name="590"><span class="lineNum"> 590 </span> : : </a>
+<a name="591"><span class="lineNum"> 591 </span> : : /* First partition is the partition table */</a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 82 : if (i == 0) {</span></a>
+<a name="593"><span class="lineNum"> 593 </span> : : toc_base = ent-&gt;base;</a>
+<a name="594"><span class="lineNum"> 594 </span> : : } else {</a>
+<a name="595"><span class="lineNum"> 595 </span> : : /*</a>
+<a name="596"><span class="lineNum"> 596 </span> : : * We're looking for the partition directly</a>
+<a name="597"><span class="lineNum"> 597 </span> : : * after the toc to make sure we don't</a>
+<a name="598"><span class="lineNum"> 598 </span> : : * overflow onto it.</a>
+<a name="599"><span class="lineNum"> 599 </span> : : */</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineCov"> 54 : if (ent-&gt;base &lt; smallest_base &amp;&amp; ent-&gt;base &gt; toc_base) {</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 22 : smallest_base = ent-&gt;base;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 22 : smallest_name = ent-&gt;name;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : }</a>
+<a name="604"><span class="lineNum"> 604 </span> : : }</a>
+<a name="605"><span class="lineNum"> 605 </span> : : }</a>
+<a name="606"><span class="lineNum"> 606 </span> : : /* If the smallest base is before the TOC, don't worry */</a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineCov"> 28 : if (smallest_base &gt; toc_base &amp;&amp; (hdr-&gt;count + 1) * sizeof(struct __ffs_entry) +</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineCov"> 28 : sizeof(struct __ffs_hdr) + toc_base &gt; smallest_base) {</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Adding partition '%s' would cause partition '%s' at &quot;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : &quot;0x%08x to overlap with the header\n&quot;, entry-&gt;name, smallest_name,</a>
+<a name="611"><span class="lineNum"> 611 </span> : : smallest_base);</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_BAD_PART_BASE;</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : }</a>
+<a name="614"><span class="lineNum"> 614 </span> : : </a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 28 : if (hdr-&gt;count == hdr-&gt;entries_size) {</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : struct ffs_entry **old = hdr-&gt;entries;</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = realloc(hdr-&gt;entries,</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : (HDR_ENTRIES_NUM + hdr-&gt;entries_size) * sizeof(struct ffs_entry *));</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : if (!hdr-&gt;entries) {</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = old;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="623"><span class="lineNum"> 623 </span> : : }</a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries_size += HDR_ENTRIES_NUM;</span></a>
+<a name="625"><span class="lineNum"> 625 </span> : : }</a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineCov"> 28 : entry-&gt;ref++;</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 28 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 28 : return 0;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 6 : int ffs_hdr_finalise(struct blocklevel_device *bl, struct ffs_hdr *hdr)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : {</a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 6 : int num_entries, i, rc = 0;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineCov"> 6 : struct __ffs_hdr *real_hdr;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineCov"> 6 : num_entries = ffs_num_entries(hdr);</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /* A TOC shouldn't have zero partitions */</a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineCov"> 6 : if (num_entries == 0)</span></a>
+<a name="641"><span class="lineNum"> 641 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="642"><span class="lineNum"> 642 </span> : : </a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 6 : real_hdr = malloc(ffs_hdr_raw_size(num_entries));</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineCov"> 6 : if (!real_hdr)</span></a>
+<a name="645"><span class="lineNum"> 645 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="646"><span class="lineNum"> 646 </span> : : </a>
+<a name="647"><span class="lineNum"> 647 </span> : : /*</a>
+<a name="648"><span class="lineNum"> 648 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="649"><span class="lineNum"> 649 </span> : : * real_hdr-&gt;checksum must be zero before calling ffs_hdr_checksum()</a>
+<a name="650"><span class="lineNum"> 650 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="651"><span class="lineNum"> 651 </span> : : * appears the reserved fields are always zero.</a>
+<a name="652"><span class="lineNum"> 652 </span> : : */</a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineCov"> 6 : memset(real_hdr, 0, sizeof(*real_hdr));</span></a>
+<a name="654"><span class="lineNum"> 654 </span> : : </a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineCov"> 6 : hdr-&gt;part-&gt;size = ffs_hdr_raw_size(num_entries) + hdr-&gt;block_size;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : /*</a>
+<a name="657"><span class="lineNum"> 657 </span> : : * So actual is in bytes. ffs_entry_to_flash() don't do the</a>
+<a name="658"><span class="lineNum"> 658 </span> : : * block_size division that we're relying on</a>
+<a name="659"><span class="lineNum"> 659 </span> : : */</a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineCov"> 6 : hdr-&gt;part-&gt;actual = (hdr-&gt;part-&gt;size / hdr-&gt;block_size) * hdr-&gt;block_size;</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 6 : real_hdr-&gt;magic = cpu_to_be32(FFS_MAGIC);</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 6 : real_hdr-&gt;version = cpu_to_be32(hdr-&gt;version);</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 6 : real_hdr-&gt;size = cpu_to_be32(hdr-&gt;part-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineCov"> 6 : real_hdr-&gt;entry_size = cpu_to_be32(sizeof(struct __ffs_entry));</span></a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineCov"> 6 : real_hdr-&gt;entry_count = cpu_to_be32(num_entries);</span></a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineCov"> 6 : real_hdr-&gt;block_size = cpu_to_be32(hdr-&gt;block_size);</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineCov"> 6 : real_hdr-&gt;block_count = cpu_to_be32(hdr-&gt;block_count);</span></a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 6 : real_hdr-&gt;checksum = ffs_hdr_checksum(real_hdr);</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : </a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineCov"> 40 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineCov"> 34 : rc = ffs_entry_to_flash(hdr, real_hdr-&gt;entries + i, hdr-&gt;entries[i]);</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineCov"> 34 : if (rc) {</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't format all entries for new TOC\n&quot;);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : }</a>
+<a name="676"><span class="lineNum"> 676 </span> : : }</a>
+<a name="677"><span class="lineNum"> 677 </span> : : </a>
+<a name="678"><span class="lineNum"> 678 </span> : : /* Don't really care if this fails */</a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineCov"> 6 : blocklevel_erase(bl, hdr-&gt;part-&gt;base, hdr-&gt;size);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineCov"> 6 : rc = blocklevel_write(bl, hdr-&gt;part-&gt;base, real_hdr,</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : ffs_hdr_raw_size(num_entries));</a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 6 : if (rc)</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="684"><span class="lineNum"> 684 </span> : : </a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineCov"> 6 : out:</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineCov"> 6 : free(real_hdr);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 6 : return rc;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> : : }</a>
+<a name="689"><span class="lineNum"> 689 </span> : : </a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineCov"> 28 : int ffs_entry_user_set(struct ffs_entry *ent, struct ffs_entry_user *user)</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : {</a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineCov"> 28 : if (!ent || !user)</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : return -1;</a>
+<a name="694"><span class="lineNum"> 694 </span> : : </a>
+<a name="695"><span class="lineNum"> 695 </span> : : /*</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * Don't allow the user to specify anything we dont't know about.</a>
+<a name="697"><span class="lineNum"> 697 </span> : : * Rationale: This is the library providing access to the FFS structures.</a>
+<a name="698"><span class="lineNum"> 698 </span> : : * If the consumer of the library knows more about FFS structures then</a>
+<a name="699"><span class="lineNum"> 699 </span> : : * questions need to be asked.</a>
+<a name="700"><span class="lineNum"> 700 </span> : : * The other possibility is that they've unknowningly supplied invalid</a>
+<a name="701"><span class="lineNum"> 701 </span> : : * flags, we should tell them.</a>
+<a name="702"><span class="lineNum"> 702 </span> : : */</a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 28 : if (user-&gt;chip)</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : return -1;</a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineCov"> 28 : if (user-&gt;compresstype)</span></a>
+<a name="706"><span class="lineNum"> 706 </span> : : return -1;</a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineCov"> 28 : if (user-&gt;datainteg &amp; ~(FFS_ENRY_INTEG_ECC))</span></a>
+<a name="708"><span class="lineNum"> 708 </span> : : return -1;</a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineCov"> 28 : if (user-&gt;vercheck &amp; ~(FFS_VERCHECK_SHA512V | FFS_VERCHECK_SHA512EC))</span></a>
+<a name="710"><span class="lineNum"> 710 </span> : : return -1;</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineCov"> 28 : if (user-&gt;miscflags &amp; ~(FFS_MISCFLAGS_PRESERVED | FFS_MISCFLAGS_BACKUP |</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : FFS_MISCFLAGS_READONLY | FFS_MISCFLAGS_REPROVISION |</a>
+<a name="713"><span class="lineNum"> 713 </span> : : FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_GOLDEN |</a>
+<a name="714"><span class="lineNum"> 714 </span> : : FFS_MISCFLAGS_CLEARECC))</a>
+<a name="715"><span class="lineNum"> 715 </span> : : return -1;</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 28 : memcpy(&amp;ent-&gt;user, user, sizeof(*user));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 28 : return 0;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> : : }</a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineNoCov"> 0 : struct ffs_entry_user ffs_entry_user_get(struct ffs_entry *ent)</span></a>
+<a name="722"><span class="lineNum"> 722 </span> : : {</a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : struct ffs_entry_user user = { 0 };</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : </a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineNoCov"> 0 : if (ent)</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;user, &amp;ent-&gt;user, sizeof(user));</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : </a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : return user;</span></a>
+<a name="729"><span class="lineNum"> 729 </span> : : }</a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineCov"> 34 : int ffs_entry_new(const char *name, uint32_t base, uint32_t size, struct ffs_entry **r)</span></a>
+<a name="732"><span class="lineNum"> 732 </span> : : {</a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineCov"> 34 : struct ffs_entry *ret;</span></a>
+<a name="734"><span class="lineNum"> 734 </span> : : </a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineCov"> 34 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineCov"> 34 : if (!ret)</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="738"><span class="lineNum"> 738 </span> : : </a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineCov"> 34 : strncpy(ret-&gt;name, name, FFS_PART_NAME_MAX);</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 34 : ret-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 34 : ret-&gt;base = base;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineCov"> 34 : ret-&gt;size = size;</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineCov"> 34 : ret-&gt;actual = size;</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineCov"> 34 : ret-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineCov"> 34 : ret-&gt;type = FFS_TYPE_DATA;</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineCov"> 34 : ret-&gt;ref = 1;</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineCov"> 34 : *r = ret;</span></a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineCov"> 34 : return 0;</span></a>
+<a name="750"><span class="lineNum"> 750 </span> : : }</a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineCov"> 1 : int ffs_entry_set_act_size(struct ffs_entry *ent, uint32_t actual_size)</span></a>
+<a name="753"><span class="lineNum"> 753 </span> : : {</a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineCov"> 1 : if (!ent)</span></a>
+<a name="755"><span class="lineNum"> 755 </span> : : return -1;</a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineCov"> 1 : if (actual_size &gt; ent-&gt;size)</span></a>
+<a name="758"><span class="lineNum"> 758 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="759"><span class="lineNum"> 759 </span> : : </a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineCov"> 1 : ent-&gt;actual = actual_size;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : </a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : </a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineCov"> 6 : int ffs_hdr_new(uint32_t block_size, uint32_t block_count,</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : struct ffs_entry **e, struct ffs_hdr **r)</a>
+<a name="767"><span class="lineNum"> 767 </span> : : {</a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineCov"> 6 : struct ffs_hdr *ret;</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineCov"> 6 : struct ffs_entry *part_table;</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineCov"> 6 : int rc;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : </a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineCov"> 6 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineCov"> 6 : if (!ret)</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="775"><span class="lineNum"> 775 </span> : : </a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineCov"> 6 : ret-&gt;version = FFS_VERSION_1;</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 6 : ret-&gt;block_size = block_size;</span></a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineCov"> 6 : ret-&gt;block_count = block_count;</span></a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineCov"> 6 : ret-&gt;entries = calloc(HDR_ENTRIES_NUM, sizeof(struct ffs_entry *));</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 6 : ret-&gt;entries_size = HDR_ENTRIES_NUM;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 6 : if (!e || !(*e)) {</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : /* Don't know how big it will be, ffs_hdr_finalise() will fix */</a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 6 : rc = ffs_entry_new(&quot;part&quot;, 0, 0, &amp;part_table);</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : free(ret);</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="788"><span class="lineNum"> 788 </span> : : }</a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 6 : if (e)</span></a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineNoCov"> 0 : *e = part_table;</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : } else {</a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : part_table = *e;</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : }</a>
+<a name="794"><span class="lineNum"> 794 </span> : : </a>
+<a name="795"><span class="lineNum"> 795 </span> : : /* If the user still holds a ref to e, then inc the refcount */</a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineCov"> 6 : if (e)</span></a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineNoCov"> 0 : part_table-&gt;ref++;</span></a>
+<a name="798"><span class="lineNum"> 798 </span> : : </a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineCov"> 6 : ret-&gt;part = part_table;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineCov"> 6 : part_table-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineCov"> 6 : part_table-&gt;type = FFS_TYPE_PARTITION;</span></a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineCov"> 6 : part_table-&gt;flags = FFS_FLAGS_PROTECTED;</span></a>
+<a name="804"><span class="lineNum"> 804 </span> : : </a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineCov"> 6 : ret-&gt;entries[0] = part_table;</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineCov"> 6 : ret-&gt;count = 1;</span></a>
+<a name="807"><span class="lineNum"> 807 </span> : : </a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineCov"> 6 : *r = ret;</span></a>
+<a name="809"><span class="lineNum"> 809 </span> : : </a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineCov"> 6 : return 0;</span></a>
+<a name="811"><span class="lineNum"> 811 </span> : : }</a>
+<a name="812"><span class="lineNum"> 812 </span> : : </a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineNoCov"> 0 : int ffs_update_act_size(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="814"><span class="lineNum"> 814 </span> : : uint32_t act_size)</a>
+<a name="815"><span class="lineNum"> 815 </span> : : {</a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent;</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineNoCov"> 0 : struct __ffs_entry raw_ent;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineNoCov"> 0 : uint32_t offset;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="820"><span class="lineNum"> 820 </span> : : </a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineNoCov"> 0 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : if (!ent) {</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Entry not found\n&quot;);</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_PART_NOT_FOUND;</span></a>
+<a name="825"><span class="lineNum"> 825 </span> : : }</a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : offset = ffs-&gt;toc_offset + ffs_hdr_raw_size(part_idx);</span></a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: part index %d at offset 0x%08x\n&quot;,</span></a>
+<a name="828"><span class="lineNum"> 828 </span> : : part_idx, offset);</a>
+<a name="829"><span class="lineNum"> 829 </span> : : </a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : if (ent-&gt;actual == act_size) {</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: ent-&gt;actual alrady matches: 0x%08x==0x%08x\n&quot;,</span></a>
+<a name="832"><span class="lineNum"> 832 </span> : : act_size, ent-&gt;actual);</a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> : : }</a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineNoCov"> 0 : ent-&gt;actual = act_size;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_to_flash(&amp;ffs-&gt;hdr, &amp;raw_ent, ent);</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : return rc;</a>
+<a name="840"><span class="lineNum"> 840 </span> : : </a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineNoCov"> 0 : return blocklevel_smart_write(ffs-&gt;bl, offset, &amp;raw_ent, sizeof(struct __ffs_entry));</span></a>
+<a name="842"><span class="lineNum"> 842 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/libflash.c.func-sort-c.html b/coverage-report/external/ffspart/libflash/libflash.c.func-sort-c.html
new file mode 100644
index 0000000..857d557
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/libflash.c.func-sort-c.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libflash.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/libflash.c.func.html b/coverage-report/external/ffspart/libflash/libflash.c.func.html
new file mode 100644
index 0000000..537d9eb
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/libflash.c.func.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libflash.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/ffspart/libflash/libflash.c.gcov.html b/coverage-report/external/ffspart/libflash/libflash.c.gcov.html
new file mode 100644
index 0000000..9b50260
--- /dev/null
+++ b/coverage-report/external/ffspart/libflash/libflash.c.gcov.html
@@ -0,0 +1,949 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/ffspart/libflash/libflash.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/ffspart/libflash</a> - libflash.c<span style="font-size: 80%;"> (source / <a href="libflash.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;string.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;libflash-priv.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : static const struct flash_info flash_info[] = {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : { 0xc22018, 0x01000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL12835F&quot;},</a>
+<a name="16"><span class="lineNum"> 16 </span> : : { 0xc22019, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL25635F&quot;},</a>
+<a name="17"><span class="lineNum"> 17 </span> : : { 0xc2201a, 0x04000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL51235F&quot;},</a>
+<a name="18"><span class="lineNum"> 18 </span> : : { 0xc2201b, 0x08000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MX66L1G45G&quot;},</a>
+<a name="19"><span class="lineNum"> 19 </span> : : { 0xef4018, 0x01000000, FL_ERASE_ALL, &quot;Winbond W25Q128BV&quot; },</a>
+<a name="20"><span class="lineNum"> 20 </span> : : { 0xef4019, 0x02000000, FL_ERASE_ALL | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="21"><span class="lineNum"> 21 </span> : : FL_ERASE_BULK,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : &quot;Winbond W25Q256BV&quot;},</a>
+<a name="23"><span class="lineNum"> 23 </span> : : { 0x20ba20, 0x04000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="24"><span class="lineNum"> 24 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : &quot;Micron N25Qx512Ax&quot; },</a>
+<a name="26"><span class="lineNum"> 26 </span> : : { 0x20ba19, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="27"><span class="lineNum"> 27 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="28"><span class="lineNum"> 28 </span> : : &quot;Micron N25Q256Ax&quot; },</a>
+<a name="29"><span class="lineNum"> 29 </span> : : { 0x1940ef, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="30"><span class="lineNum"> 30 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="31"><span class="lineNum"> 31 </span> : : &quot;Micron N25Qx256Ax&quot; },</a>
+<a name="32"><span class="lineNum"> 32 </span> : : { 0x4d5444, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;File Abstraction&quot;},</a>
+<a name="33"><span class="lineNum"> 33 </span> : : { 0x55aa55, 0x00100000, FL_ERASE_ALL | FL_CAN_4B, &quot;TEST_FLASH&quot; },</a>
+<a name="34"><span class="lineNum"> 34 </span> : : { 0xaa55aa, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;EMULATED_FLASH&quot;},</a>
+<a name="35"><span class="lineNum"> 35 </span> : : };</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct flash_chip {</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct spi_flash_ctrl *ctrl; /* Controller */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct flash_info info; /* Flash info */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t tsize; /* Corrected flash size */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint32_t min_erase_mask; /* Minimum erase size */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : bool mode_4b; /* Flash currently in 4b mode */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct flash_req *cur_req; /* Current request */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : void *smart_buf; /* Buffer for smart writes */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct blocklevel_device bl;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : };</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : #ifndef __SKIBOOT__</a>
+<a name="49"><span class="lineNum"> 49 </span> : : bool libflash_debug;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #endif</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : int fl_read_stat(struct spi_flash_ctrl *ct, uint8_t *stat)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_rd(ct, CMD_RDSR, false, 0, stat, 1);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : static void fl_micron_status(struct spi_flash_ctrl *ct)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : uint8_t flst;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /*</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * After a success status on a write or erase, we</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * need to do that command or some chip variants will</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * lock</a>
+<a name="65"><span class="lineNum"> 65 </span> : : */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : ct-&gt;cmd_rd(ct, CMD_MIC_RDFLST, false, 0, &amp;flst, 1);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /* Synchronous write completion, probably need a yield hook */</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : int fl_sync_wait_idle(struct spi_flash_ctrl *ct)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /* XXX Add timeout */</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : for (;;) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : if (!(stat &amp; STAT_WIP)) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;finfo-&gt;flags &amp; FL_MICRON_BUGS)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : fl_micron_status(ct);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : /* return FLASH_ERR_WIP_TIMEOUT; */</a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* Exported for internal use */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : int fl_wren(struct spi_flash_ctrl *ct)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : int i, rc;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* Some flashes need it to be hammered */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 1000; i++) {</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_WREN, false, 0, NULL, 0);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: WREN has WIP status set !\n&quot;);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : }</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WEN)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : return 0;</a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : return FLASH_ERR_WREN_TIMEOUT;</a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : static int flash_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* XXX Add sanity/bound checking */</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /*</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * If the controller supports read and either we are in 3b mode</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * high level read.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;read)</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : return ct-&gt;read(ct, pos, buf, len);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_rd)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_rd(ct, CMD_READ, true, pos, buf, len);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : #define COPY_BUFFER_LENGTH 4096</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /*</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * This provides a wrapper around flash_read on ECCed data</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * len is length of data without ECC attached</a>
+<a name="139"><span class="lineNum"> 139 </span> : : */</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : int flash_read_corrected(struct blocklevel_device *bl, uint32_t pos, void *buf,</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : uint32_t len, bool ecc)</a>
+<a name="142"><span class="lineNum"> 142 </span> : : {</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : uint32_t copylen;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return flash_read(bl, pos, buf, len);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /* Copy the buffer in chunks */</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* What's left to copy? */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : /* Read ECCed data from flash */</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, pos, bufecc, ecc_buffer_size(copylen));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* Extract data from ECCed data */</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : ret = memcpy_from_ecc(buf, bufecc, copylen);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> : : /* Update for next copy */</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : len -= copylen;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : pos += ecc_buffer_size(copylen);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> : : rc = 0;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : static void fl_get_best_erase(struct flash_chip *c, uint32_t dst, uint32_t size,</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : uint32_t *chunk, uint8_t *cmd)</a>
+<a name="187"><span class="lineNum"> 187 </span> : : {</a>
+<a name="188"><span class="lineNum"> 188 </span> : : /* Smaller than 32k, use 4k */</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : if ((dst &amp; 0x7fff) || (size &lt; 0x8000)) {</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : *chunk = 0x1000;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_SE;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : /* Smaller than 64k and 32k is supported, use it */</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : if ((c-&gt;info.flags &amp; FL_ERASE_32K) &amp;&amp;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : ((dst &amp; 0xffff) || (size &lt; 0x10000))) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : }</a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* If 64K is not supported, use whatever smaller size is */</a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : if (!(c-&gt;info.flags &amp; FL_ERASE_64K)) {</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_32K) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : } else {</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : *chunk = 0x1000;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_SE;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* Allright, let's go for 64K */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : *chunk = 0x10000;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : static int flash_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t size)</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : {</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : uint8_t cmd;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> : : /* Some sanity checking */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /* Check boundaries fit erase blocks */</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : if ((dst | size) &amp; c-&gt;min_erase_mask)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : return FLASH_ERR_ERASE_BOUNDARY;</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Erasing 0x%&quot; PRIx64&quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : dst, dst + size);</a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> : : /* Use controller erase if supported */</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;erase)</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, dst, size);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /* Allright, loop as long as there's something to erase */</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : while(size) {</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* How big can we make it based on alignent &amp; size */</a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : fl_get_best_erase(c, dst, size, &amp;chunk, &amp;cmd);</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /* Poke write enable */</a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> : : /* Send erase command */</a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, cmd, true, dst, NULL, 0);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /* Wait for write complete */</a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> : : return 0;</a>
+<a name="264"><span class="lineNum"> 264 </span> : : }</a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : int flash_erase_chip(struct flash_chip *c)</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : {</a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : /* XXX TODO: Fallback to using normal erases */</a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : if (!(c-&gt;info.flags &amp; (FL_ERASE_CHIP|FL_ERASE_BULK)))</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : return FLASH_ERR_CHIP_ER_NOT_SUPPORTED;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Erasing chip...\n&quot;);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* Use controller erase if supported */</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;erase)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, 0, 0xffffffff);</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_CHIP)</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_CE, false, 0, NULL, 0);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : else</a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_MIC_BULK_ERASE, false, 0, NULL, 0);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : return rc;</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> : : /* Wait for write complete */</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return fl_sync_wait_idle(ct);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : static int fl_wpage(struct flash_chip *c, uint32_t dst, const void *src,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : uint32_t size)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : </a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : if (size &lt; 1 || size &gt; 0x100)</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : return FLASH_ERR_BAD_PAGE_SIZE;</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_PP, true, dst, src, size);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : return rc;</a>
+<a name="310"><span class="lineNum"> 310 </span> : : </a>
+<a name="311"><span class="lineNum"> 311 </span> : : /* Wait for write complete */</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : return fl_sync_wait_idle(ct);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : }</a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : static int flash_write(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : uint32_t size, bool verify)</a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : uint32_t todo = size;</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : uint32_t d = dst;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : const void *s = src;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : uint8_t vbuf[0x100];</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : int rc; </span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> : : /* Some sanity checking */</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Writing to 0x%08x..0%08x...\n&quot;, dst, dst + size);</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> : : /*</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * If the controller supports write and either we are in 3b mode</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * high level write.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;write) {</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;write(ct, dst, src, size);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : return rc;</a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : goto writing_done;</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : }</a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /* Iterate for each page to write */</a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineNoCov"> 0 : while(todo) {</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : /* Handle misaligned start */</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : chunk = 0x100 - (d &amp; 0xff);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : if (chunk &gt; todo)</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : chunk = todo;</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : rc = fl_wpage(c, d, s, chunk);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : d += chunk;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : s += chunk;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : todo -= chunk;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : }</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : writing_done:</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : if (!verify)</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : return 0;</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> : : /* Verify */</a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Verifying...\n&quot;);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> : : </a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineNoCov"> 0 : while(size) {</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : chunk = sizeof(vbuf);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : if (chunk &gt; size)</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : chunk = size;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, dst, vbuf, chunk);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : if (memcmp(vbuf, src, chunk)) {</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Miscompare at 0x%08x\n&quot;, dst);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_VERIFY_FAILURE;</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : }</a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : src += chunk;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="386"><span class="lineNum"> 386 </span> : : }</a>
+<a name="387"><span class="lineNum"> 387 </span> : : return 0;</a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : int flash_write_corrected(struct blocklevel_device *bl, uint32_t pos, const void *buf,</span></a>
+<a name="391"><span class="lineNum"> 391 </span> : : uint32_t len, bool verify, bool ecc)</a>
+<a name="392"><span class="lineNum"> 392 </span> : : {</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : uint32_t copylen, copylen_minus_ecc;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return flash_write(bl, pos, buf, len, verify);</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> : : /* Copy the buffer in chunks */</a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="404"><span class="lineNum"> 404 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* What's left to copy? */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineNoCov"> 0 : copylen_minus_ecc = ecc_buffer_size_minus_ecc(copylen);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : /* Add the ecc byte to the data */</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : ret = memcpy_to_ecc(bufecc, buf, copylen_minus_ecc);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : }</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> : : /* Write ECCed data to the flash */</a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, pos, bufecc, copylen, verify);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> : : /* Update for next copy */</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : len -= copylen_minus_ecc;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen_minus_ecc;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : pos += copylen;</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : }</a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : rc = 0;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : }</a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> : : enum sm_comp_res {</a>
+<a name="437"><span class="lineNum"> 437 </span> : : sm_no_change,</a>
+<a name="438"><span class="lineNum"> 438 </span> : : sm_need_write,</a>
+<a name="439"><span class="lineNum"> 439 </span> : : sm_need_erase,</a>
+<a name="440"><span class="lineNum"> 440 </span> : : };</a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : static enum sm_comp_res flash_smart_comp(struct flash_chip *c,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : const void *src,</a>
+<a name="444"><span class="lineNum"> 444 </span> : : uint32_t offset, uint32_t size)</a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : uint8_t *b = c-&gt;smart_buf + offset;</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : const uint8_t *s = src;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : bool is_same = true;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : uint32_t i;</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* SRC DEST NEED_ERASE</a>
+<a name="452"><span class="lineNum"> 452 </span> : : * 0 1 0</a>
+<a name="453"><span class="lineNum"> 453 </span> : : * 1 1 0</a>
+<a name="454"><span class="lineNum"> 454 </span> : : * 0 0 0</a>
+<a name="455"><span class="lineNum"> 455 </span> : : * 1 0 1</a>
+<a name="456"><span class="lineNum"> 456 </span> : : */</a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; size; i++) {</span></a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* Any bit need to be set, need erase */</a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : if (s[i] &amp; ~b[i])</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : return sm_need_erase;</a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : if (is_same &amp;&amp; (b[i] != s[i]))</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : is_same = false;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : }</a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : return is_same ? sm_no_change : sm_need_write;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : }</a>
+<a name="466"><span class="lineNum"> 466 </span> : : </a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : static int flash_smart_write(struct blocklevel_device *bl, uint64_t dst, const void *src, uint64_t size)</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : {</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : uint32_t er_size = c-&gt;min_erase_mask + 1;</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : uint32_t end = dst + size;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> : : /* Some sanity checking */</a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : if (end &lt;= dst || !size || end &gt; c-&gt;tsize) {</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Smart write param error\n&quot;);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="478"><span class="lineNum"> 478 </span> : : }</a>
+<a name="479"><span class="lineNum"> 479 </span> : : </a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Smart writing to 0x%&quot; PRIx64 &quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="481"><span class="lineNum"> 481 </span> : : dst, dst + size);</a>
+<a name="482"><span class="lineNum"> 482 </span> : : </a>
+<a name="483"><span class="lineNum"> 483 </span> : : /* As long as we have something to write ... */</a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : while(dst &lt; end) {</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : uint32_t page, off, chunk;</span></a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : enum sm_comp_res sr;</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> : : /* Figure out which erase page we are in and read it */</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : page = dst &amp; ~c-&gt;min_erase_mask;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : off = dst &amp; c-&gt;min_erase_mask;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: reading page 0x%08x..0x%08x...\n&quot;,</span></a>
+<a name="492"><span class="lineNum"> 492 </span> : : page, page + er_size);</a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, page, c-&gt;smart_buf, er_size);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...error %d!\n&quot;, rc);</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> : : }</a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> : : /* Locate the chunk of data we are working on */</a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : chunk = er_size - off;</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : if (size &lt; chunk)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : chunk = size;</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> : : /* Compare against what we are writing and ff */</a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : sr = flash_smart_comp(c, src, off, chunk);</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : switch(sr) {</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : case sm_no_change:</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : /* Identical, skip it */</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...same !\n&quot;);</span></a>
+<a name="510"><span class="lineNum"> 510 </span> : : break;</a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : case sm_need_write:</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : /* Just needs writing over */</a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...need write !\n&quot;);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, dst, src, chunk, true);</span></a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Write error %d !\n&quot;, rc);</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : }</a>
+<a name="519"><span class="lineNum"> 519 </span> : : break;</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : case sm_need_erase:</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...need erase !\n&quot;);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : rc = flash_erase(bl, page, er_size);</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: erase error %d !\n&quot;, rc);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="526"><span class="lineNum"> 526 </span> : : }</a>
+<a name="527"><span class="lineNum"> 527 </span> : : /* Then update the portion of the buffer and write the block */</a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : memcpy(c-&gt;smart_buf + off, src, chunk);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, page, c-&gt;smart_buf, er_size, true);</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: write error %d !\n&quot;, rc);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="533"><span class="lineNum"> 533 </span> : : }</a>
+<a name="534"><span class="lineNum"> 534 </span> : : break;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : }</a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineNoCov"> 0 : src += chunk;</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : }</a>
+<a name="540"><span class="lineNum"> 540 </span> : : return 0;</a>
+<a name="541"><span class="lineNum"> 541 </span> : : }</a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : int flash_smart_write_corrected(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : uint32_t size, bool ecc)</a>
+<a name="545"><span class="lineNum"> 545 </span> : : {</a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : struct ecc64 *buf;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : return flash_smart_write(bl, dst, src, size);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : buf = malloc(ecc_buffer_size(size));</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : if (!buf)</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="555"><span class="lineNum"> 555 </span> : : </a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc(buf, src, size);</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : }</a>
+<a name="561"><span class="lineNum"> 561 </span> : : </a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : rc = flash_smart_write(bl, dst, buf, ecc_buffer_size(size));</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : </a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : free(buf);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : </a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineNoCov"> 0 : static int fl_chip_id(struct spi_flash_ctrl *ct, uint8_t *id_buf,</span></a>
+<a name="570"><span class="lineNum"> 570 </span> : : uint32_t *id_size)</a>
+<a name="571"><span class="lineNum"> 571 </span> : : {</a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : </a>
+<a name="575"><span class="lineNum"> 575 </span> : : /* Check initial status */</a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="578"><span class="lineNum"> 578 </span> : : return rc;</a>
+<a name="579"><span class="lineNum"> 579 </span> : : </a>
+<a name="580"><span class="lineNum"> 580 </span> : : /* If stuck writing, wait for idle */</a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash in writing state ! Waiting...\n&quot;);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="585"><span class="lineNum"> 585 </span> : : return rc;</a>
+<a name="586"><span class="lineNum"> 586 </span> : : } else</a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Init status: %02x\n&quot;, stat);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : </a>
+<a name="589"><span class="lineNum"> 589 </span> : : /* Fallback to get ID manually */</a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_rd(ct, CMD_RDID, false, 0, id_buf, 3);</span></a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="592"><span class="lineNum"> 592 </span> : : return rc;</a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : *id_size = 3;</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : </a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : }</a>
+<a name="597"><span class="lineNum"> 597 </span> : : </a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : static int flash_identify(struct flash_chip *c)</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : {</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : const struct flash_info *info = NULL;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : uint32_t iid, id_size;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : #define MAX_ID_SIZE 16</a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineNoCov"> 0 : uint8_t id[MAX_ID_SIZE];</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : int rc, i;</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;chip_id) {</span></a>
+<a name="608"><span class="lineNum"> 608 </span> : : /* High level controller interface */</a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : id_size = MAX_ID_SIZE;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;chip_id(ct, id, &amp;id_size);</span></a>
+<a name="611"><span class="lineNum"> 611 </span> : : } else</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : rc = fl_chip_id(ct, id, &amp;id_size);</span></a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="614"><span class="lineNum"> 614 </span> : : return rc;</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : if (id_size &lt; 3)</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : return FLASH_ERR_CHIP_UNKNOWN;</a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> : : /* Convert to a dword for lookup */</a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : iid = id[0];</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : iid = (iid &lt;&lt; 8) | id[1];</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : iid = (iid &lt;&lt; 8) | id[2];</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash ID: %02x.%02x.%02x (%06x)\n&quot;,</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : id[0], id[1], id[2], iid);</a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> : : /* Lookup in flash_info */</a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; ARRAY_SIZE(flash_info); i++) {</span></a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineNoCov"> 0 : info = &amp;flash_info[i];</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : if (info-&gt;id == iid)</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : break; </a>
+<a name="631"><span class="lineNum"> 631 </span> : : }</a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : if (!info || info-&gt;id != iid)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : return FLASH_ERR_CHIP_UNKNOWN;</a>
+<a name="634"><span class="lineNum"> 634 </span> : : </a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : c-&gt;info = *info;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineNoCov"> 0 : c-&gt;tsize = info-&gt;size;</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : ct-&gt;finfo = &amp;c-&gt;info;</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /*</a>
+<a name="640"><span class="lineNum"> 640 </span> : : * Let controller know about our settings and possibly</a>
+<a name="641"><span class="lineNum"> 641 </span> : : * override them</a>
+<a name="642"><span class="lineNum"> 642 </span> : : */</a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;setup) {</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;setup(ct, &amp;c-&gt;tsize);</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : return rc;</a>
+<a name="647"><span class="lineNum"> 647 </span> : : }</a>
+<a name="648"><span class="lineNum"> 648 </span> : : </a>
+<a name="649"><span class="lineNum"> 649 </span> : : /* Calculate min erase granularity */</a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_4K)</span></a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0xfff;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_32K)</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0x7fff;</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_64K)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0xffff;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : else {</a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* No erase size ? oops ... */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: No erase sizes !\n&quot;);</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CTRL_CONFIG_MISMATCH;</span></a>
+<a name="660"><span class="lineNum"> 660 </span> : : }</a>
+<a name="661"><span class="lineNum"> 661 </span> : : </a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Found chip %s size %dM erase granule: %dK\n&quot;,</span></a>
+<a name="663"><span class="lineNum"> 663 </span> : : c-&gt;info.name, c-&gt;tsize &gt;&gt; 20, (c-&gt;min_erase_mask + 1) &gt;&gt; 10);</a>
+<a name="664"><span class="lineNum"> 664 </span> : : </a>
+<a name="665"><span class="lineNum"> 665 </span> : : return 0;</a>
+<a name="666"><span class="lineNum"> 666 </span> : : }</a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : static int flash_set_4b(struct flash_chip *c, bool enable)</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : {</a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> : : </a>
+<a name="673"><span class="lineNum"> 673 </span> : : /* Don't have low level interface, assume all is well */</a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : return 0;</a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> : : /* Some flash chips want this */</a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Error %d enabling write for set_4b\n&quot;, rc);</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : /* Ignore the error &amp; move on (could be wrprotect chip) */</a>
+<a name="682"><span class="lineNum"> 682 </span> : : }</a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> : : /* Ignore error in case chip is write protected */</a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_wr(ct, enable ? CMD_EN4B : CMD_EX4B, false, 0, NULL, 0);</span></a>
+<a name="686"><span class="lineNum"> 686 </span> : : }</a>
+<a name="687"><span class="lineNum"> 687 </span> : : </a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : int flash_force_4b_mode(struct flash_chip *c, bool enable_4b)</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineNoCov"> 0 : int rc = FLASH_ERR_4B_NOT_SUPPORTED;</span></a>
+<a name="692"><span class="lineNum"> 692 </span> : : </a>
+<a name="693"><span class="lineNum"> 693 </span> : : /*</a>
+<a name="694"><span class="lineNum"> 694 </span> : : * We only allow force 4b if both controller and flash do 4b</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * as this is mainly used if a 3rd party tries to directly</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * access a direct mapped read region</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : if (enable_4b &amp;&amp; !((c-&gt;info.flags &amp; FL_CAN_4B) &amp;&amp; ct-&gt;set_4b))</span></a>
+<a name="699"><span class="lineNum"> 699 </span> : : return rc;</a>
+<a name="700"><span class="lineNum"> 700 </span> : : </a>
+<a name="701"><span class="lineNum"> 701 </span> : : /* Only send to flash directly on controllers that implement</a>
+<a name="702"><span class="lineNum"> 702 </span> : : * the low level callbacks</a>
+<a name="703"><span class="lineNum"> 703 </span> : : */</a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, enable_4b);</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : return rc;</a>
+<a name="708"><span class="lineNum"> 708 </span> : : }</a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> : : /* Then inform the controller */</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, enable_4b);</span></a>
+<a name="713"><span class="lineNum"> 713 </span> : : return rc;</a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> : : </a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : static int flash_configure(struct flash_chip *c)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> : : {</a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> : : /* Crop flash size if necessary */</a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineNoCov"> 0 : if (c-&gt;tsize &gt; 0x01000000 &amp;&amp; !(c-&gt;info.flags &amp; FL_CAN_4B)) {</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash chip cropped to 16M, no 4b mode\n&quot;);</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : c-&gt;tsize = 0x01000000;</span></a>
+<a name="725"><span class="lineNum"> 725 </span> : : }</a>
+<a name="726"><span class="lineNum"> 726 </span> : : </a>
+<a name="727"><span class="lineNum"> 727 </span> : : /* If flash chip &gt; 16M, enable 4b mode */</a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : if (c-&gt;tsize &gt; 0x01000000) {</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash &gt;16MB, enabling 4B mode...\n&quot;);</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> : : /* Set flash to 4b mode if we can */</a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, true);</span></a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set flash 4b mode\n&quot;);</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : }</a>
+<a name="738"><span class="lineNum"> 738 </span> : : }</a>
+<a name="739"><span class="lineNum"> 739 </span> : : </a>
+<a name="740"><span class="lineNum"> 740 </span> : : </a>
+<a name="741"><span class="lineNum"> 741 </span> : : /* Set controller to 4b mode if supported */</a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b) {</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Enabling controller 4B mode...\n&quot;);</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, true);</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set controller 4b mode\n&quot;);</span></a>
+<a name="747"><span class="lineNum"> 747 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="748"><span class="lineNum"> 748 </span> : : }</a>
+<a name="749"><span class="lineNum"> 749 </span> : : }</a>
+<a name="750"><span class="lineNum"> 750 </span> : : } else {</a>
+<a name="751"><span class="lineNum"> 751 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash &lt;=16MB, disabling 4B mode...\n&quot;);</span></a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> : : /*</a>
+<a name="754"><span class="lineNum"> 754 </span> : : * If flash chip supports 4b mode, make sure we disable</a>
+<a name="755"><span class="lineNum"> 755 </span> : : * it in case it was left over by the previous user</a>
+<a name="756"><span class="lineNum"> 756 </span> : : */</a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_CAN_4B) {</span></a>
+<a name="758"><span class="lineNum"> 758 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, false);</span></a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : &quot; clear flash 4b mode\n&quot;);</a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : }</a>
+<a name="765"><span class="lineNum"> 765 </span> : : /* Set controller to 3b mode if mode switch is supported */</a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b) {</span></a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Disabling controller 4B mode...\n&quot;);</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, false);</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : &quot; clear controller 4b mode\n&quot;);</a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="773"><span class="lineNum"> 773 </span> : : }</a>
+<a name="774"><span class="lineNum"> 774 </span> : : }</a>
+<a name="775"><span class="lineNum"> 775 </span> : : }</a>
+<a name="776"><span class="lineNum"> 776 </span> : : return 0;</a>
+<a name="777"><span class="lineNum"> 777 </span> : : }</a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : static int flash_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="780"><span class="lineNum"> 780 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="781"><span class="lineNum"> 781 </span> : : {</a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> :<span class="lineNoCov"> 0 : if (name)</span></a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineNoCov"> 0 : *name = c-&gt;info.name;</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : *total_size = c-&gt;tsize;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineNoCov"> 0 : *erase_granule = c-&gt;min_erase_mask + 1;</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : }</a>
+<a name="791"><span class="lineNum"> 791 </span> : : </a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : int flash_init(struct spi_flash_ctrl *ctrl, struct blocklevel_device **bl,</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : struct flash_chip **flash_chip)</a>
+<a name="794"><span class="lineNum"> 794 </span> : : {</a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c;</span></a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="797"><span class="lineNum"> 797 </span> : : </a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineNoCov"> 0 : if (!bl)</span></a>
+<a name="799"><span class="lineNum"> 799 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : *bl = NULL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> : : </a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineNoCov"> 0 : c = malloc(sizeof(struct flash_chip));</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineNoCov"> 0 : if (!c)</span></a>
+<a name="805"><span class="lineNum"> 805 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : memset(c, 0, sizeof(*c));</span></a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineNoCov"> 0 : c-&gt;ctrl = ctrl;</span></a>
+<a name="808"><span class="lineNum"> 808 </span> : : </a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineNoCov"> 0 : rc = flash_identify(c);</span></a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash identification failed\n&quot;);</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : }</a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineNoCov"> 0 : c-&gt;smart_buf = malloc(c-&gt;min_erase_mask + 1);</span></a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineNoCov"> 0 : if (!c-&gt;smart_buf) {</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to allocate smart buffer !\n&quot;);</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : }</a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineNoCov"> 0 : rc = flash_configure(c);</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash configuration failed\n&quot;);</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : bail:</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="825"><span class="lineNum"> 825 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="827"><span class="lineNum"> 827 </span> : : }</a>
+<a name="828"><span class="lineNum"> 828 </span> : : </a>
+<a name="829"><span class="lineNum"> 829 </span> : : /* The flash backend doesn't support reiniting it */</a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.keep_alive = true;</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.reacquire = NULL;</span></a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.release = NULL;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.read = &amp;flash_read;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.write = &amp;flash_smart_write;</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.erase = &amp;flash_erase;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.get_info = &amp;flash_get_info;</span></a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.erase_mask = c-&gt;min_erase_mask;</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : </a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineNoCov"> 0 : *bl = &amp;(c-&gt;bl);</span></a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineNoCov"> 0 : if (flash_chip)</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineNoCov"> 0 : *flash_chip = c;</span></a>
+<a name="843"><span class="lineNum"> 843 </span> : : </a>
+<a name="844"><span class="lineNum"> 844 </span> : : return 0;</a>
+<a name="845"><span class="lineNum"> 845 </span> : : }</a>
+<a name="846"><span class="lineNum"> 846 </span> : : </a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineNoCov"> 0 : void flash_exit(struct blocklevel_device *bl)</span></a>
+<a name="848"><span class="lineNum"> 848 </span> : : {</a>
+<a name="849"><span class="lineNum"> 849 </span> : : /* XXX Make sure we are idle etc... */</a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineNoCov"> 0 : if (bl) {</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineNoCov"> 0 : free(c-&gt;smart_buf);</span></a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="854"><span class="lineNum"> 854 </span> : : }</a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="856"><span class="lineNum"> 856 </span> : : </a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : void flash_exit_close(struct blocklevel_device *bl, void (*close)(struct spi_flash_ctrl *ctrl))</span></a>
+<a name="858"><span class="lineNum"> 858 </span> : : {</a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineNoCov"> 0 : if (bl) {</span></a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : close(c-&gt;ctrl);</span></a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : }</a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/endian/endian.h.func-sort-c.html b/coverage-report/external/gard/ccan/endian/endian.h.func-sort-c.html
new file mode 100644
index 0000000..2757ead
--- /dev/null
+++ b/coverage-report/external/gard/ccan/endian/endian.h.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/gard/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="endian.h.func.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnHi">450</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnHi">5055</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/endian/endian.h.func.html b/coverage-report/external/gard/ccan/endian/endian.h.func.html
new file mode 100644
index 0000000..9020f81
--- /dev/null
+++ b/coverage-report/external/gard/ccan/endian/endian.h.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/gard/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="endian.h.func-sort-c.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnHi">5055</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnHi">450</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/endian/endian.h.gcov.html b/coverage-report/external/gard/ccan/endian/endian.h.gcov.html
new file mode 100644
index 0000000..d92dc6a
--- /dev/null
+++ b/coverage-report/external/gard/ccan/endian/endian.h.gcov.html
@@ -0,0 +1,440 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/endian/endian.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/gard/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (source / <a href="endian.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* CC0 (Public domain) - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #ifndef CCAN_ENDIAN_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #define CCAN_ENDIAN_H</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;config.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : /**</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * BSWAP_16 - reverse bytes in a constant uint16_t value.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : *</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * Example:</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * struct mystruct {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * char buf[BSWAP_16(0x1234)];</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define BSWAP_16(val) \</a>
+<a name="19"><span class="lineNum"> 19 </span> : : ((((uint16_t)(val) &amp; 0x00ff) &lt;&lt; 8) \</a>
+<a name="20"><span class="lineNum"> 20 </span> : : | (((uint16_t)(val) &amp; 0xff00) &gt;&gt; 8))</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : /**</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * BSWAP_32 - reverse bytes in a constant uint32_t value.</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="25"><span class="lineNum"> 25 </span> : : *</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="27"><span class="lineNum"> 27 </span> : : *</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Example:</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * struct mystruct {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * char buf[BSWAP_32(0xff000000)];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #define BSWAP_32(val) \</a>
+<a name="34"><span class="lineNum"> 34 </span> : : ((((uint32_t)(val) &amp; 0x000000ff) &lt;&lt; 24) \</a>
+<a name="35"><span class="lineNum"> 35 </span> : : | (((uint32_t)(val) &amp; 0x0000ff00) &lt;&lt; 8) \</a>
+<a name="36"><span class="lineNum"> 36 </span> : : | (((uint32_t)(val) &amp; 0x00ff0000) &gt;&gt; 8) \</a>
+<a name="37"><span class="lineNum"> 37 </span> : : | (((uint32_t)(val) &amp; 0xff000000) &gt;&gt; 24))</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /**</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * BSWAP_64 - reverse bytes in a constant uint64_t value.</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * @val: constantvalue whose bytes to swap.</a>
+<a name="42"><span class="lineNum"> 42 </span> : : *</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * Example:</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * struct mystruct {</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * char buf[BSWAP_64(0xff00000000000000ULL)];</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * };</a>
+<a name="49"><span class="lineNum"> 49 </span> : : */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #define BSWAP_64(val) \</a>
+<a name="51"><span class="lineNum"> 51 </span> : : ((((uint64_t)(val) &amp; 0x00000000000000ffULL) &lt;&lt; 56) \</a>
+<a name="52"><span class="lineNum"> 52 </span> : : | (((uint64_t)(val) &amp; 0x000000000000ff00ULL) &lt;&lt; 40) \</a>
+<a name="53"><span class="lineNum"> 53 </span> : : | (((uint64_t)(val) &amp; 0x0000000000ff0000ULL) &lt;&lt; 24) \</a>
+<a name="54"><span class="lineNum"> 54 </span> : : | (((uint64_t)(val) &amp; 0x00000000ff000000ULL) &lt;&lt; 8) \</a>
+<a name="55"><span class="lineNum"> 55 </span> : : | (((uint64_t)(val) &amp; 0x000000ff00000000ULL) &gt;&gt; 8) \</a>
+<a name="56"><span class="lineNum"> 56 </span> : : | (((uint64_t)(val) &amp; 0x0000ff0000000000ULL) &gt;&gt; 24) \</a>
+<a name="57"><span class="lineNum"> 57 </span> : : | (((uint64_t)(val) &amp; 0x00ff000000000000ULL) &gt;&gt; 40) \</a>
+<a name="58"><span class="lineNum"> 58 </span> : : | (((uint64_t)(val) &amp; 0xff00000000000000ULL) &gt;&gt; 56))</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : #if HAVE_BYTESWAP_H</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #include &lt;byteswap.h&gt;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #else</a>
+<a name="63"><span class="lineNum"> 63 </span> : : /**</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * bswap_16 - reverse bytes in a uint16_t value.</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * @val: value whose bytes to swap.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * Example:</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * // Output contains &quot;1024 is 4 as two bytes reversed&quot;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * printf(&quot;1024 is %u as two bytes reversed\n&quot;, bswap_16(1024));</a>
+<a name="70"><span class="lineNum"> 70 </span> : : */</a>
+<a name="71"><span class="lineNum"> 71 </span> : : static inline uint16_t bswap_16(uint16_t val)</a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> : : return BSWAP_16(val);</a>
+<a name="74"><span class="lineNum"> 74 </span> : : }</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : /**</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * bswap_32 - reverse bytes in a uint32_t value.</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * @val: value whose bytes to swap.</a>
+<a name="79"><span class="lineNum"> 79 </span> : : *</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * Example:</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * // Output contains &quot;1024 is 262144 as four bytes reversed&quot;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * printf(&quot;1024 is %u as four bytes reversed\n&quot;, bswap_32(1024));</a>
+<a name="83"><span class="lineNum"> 83 </span> : : */</a>
+<a name="84"><span class="lineNum"> 84 </span> : : static inline uint32_t bswap_32(uint32_t val)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> : : return BSWAP_32(val);</a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : #endif /* !HAVE_BYTESWAP_H */</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : #if !HAVE_BSWAP_64</a>
+<a name="91"><span class="lineNum"> 91 </span> : : /**</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * bswap_64 - reverse bytes in a uint64_t value.</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * @val: value whose bytes to swap.</a>
+<a name="94"><span class="lineNum"> 94 </span> : : *</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * Example:</a>
+<a name="96"><span class="lineNum"> 96 </span> : : * // Output contains &quot;1024 is 1125899906842624 as eight bytes reversed&quot;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * printf(&quot;1024 is %llu as eight bytes reversed\n&quot;,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : * (unsigned long long)bswap_64(1024));</a>
+<a name="99"><span class="lineNum"> 99 </span> : : */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : static inline uint64_t bswap_64(uint64_t val)</a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : return BSWAP_64(val);</a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : #endif</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : /* Needed for Glibc like endiness check */</a>
+<a name="107"><span class="lineNum"> 107 </span> : : #define __LITTLE_ENDIAN 1234</a>
+<a name="108"><span class="lineNum"> 108 </span> : : #define __BIG_ENDIAN 4321</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Sanity check the defines. We don't handle weird endianness. */</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #if !HAVE_LITTLE_ENDIAN &amp;&amp; !HAVE_BIG_ENDIAN</a>
+<a name="112"><span class="lineNum"> 112 </span> : : #error &quot;Unknown endian&quot;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : #elif HAVE_LITTLE_ENDIAN &amp;&amp; HAVE_BIG_ENDIAN</a>
+<a name="114"><span class="lineNum"> 114 </span> : : #error &quot;Can't compile for both big and little endian.&quot;</a>
+<a name="115"><span class="lineNum"> 115 </span> : : #elif HAVE_LITTLE_ENDIAN</a>
+<a name="116"><span class="lineNum"> 116 </span> : : #define __BYTE_ORDER __LITTLE_ENDIAN</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #elif HAVE_BIG_ENDIAN</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #define __BYTE_ORDER __BIG_ENDIAN</a>
+<a name="119"><span class="lineNum"> 119 </span> : : #endif</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : #ifdef __CHECKER__</a>
+<a name="123"><span class="lineNum"> 123 </span> : : /* sparse needs forcing to remove bitwise attribute from ccan/short_types */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : #define ENDIAN_CAST __attribute__((force))</a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define ENDIAN_TYPE __attribute__((bitwise))</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #else</a>
+<a name="127"><span class="lineNum"> 127 </span> : : #define ENDIAN_CAST</a>
+<a name="128"><span class="lineNum"> 128 </span> : : #define ENDIAN_TYPE</a>
+<a name="129"><span class="lineNum"> 129 </span> : : #endif</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : typedef uint64_t ENDIAN_TYPE leint64_t;</a>
+<a name="132"><span class="lineNum"> 132 </span> : : typedef uint64_t ENDIAN_TYPE beint64_t;</a>
+<a name="133"><span class="lineNum"> 133 </span> : : typedef uint32_t ENDIAN_TYPE leint32_t;</a>
+<a name="134"><span class="lineNum"> 134 </span> : : typedef uint32_t ENDIAN_TYPE beint32_t;</a>
+<a name="135"><span class="lineNum"> 135 </span> : : typedef uint16_t ENDIAN_TYPE leint16_t;</a>
+<a name="136"><span class="lineNum"> 136 </span> : : typedef uint16_t ENDIAN_TYPE beint16_t;</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : #if HAVE_LITTLE_ENDIAN</a>
+<a name="139"><span class="lineNum"> 139 </span> : : /**</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * CPU_TO_LE64 - convert a constant uint64_t value to little-endian</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * @native: constant to convert</a>
+<a name="142"><span class="lineNum"> 142 </span> : : */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)(native))</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /**</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * CPU_TO_LE32 - convert a constant uint32_t value to little-endian</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * @native: constant to convert</a>
+<a name="148"><span class="lineNum"> 148 </span> : : */</a>
+<a name="149"><span class="lineNum"> 149 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)(native))</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /**</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * CPU_TO_LE16 - convert a constant uint16_t value to little-endian</a>
+<a name="153"><span class="lineNum"> 153 </span> : : * @native: constant to convert</a>
+<a name="154"><span class="lineNum"> 154 </span> : : */</a>
+<a name="155"><span class="lineNum"> 155 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)(native))</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /**</a>
+<a name="158"><span class="lineNum"> 158 </span> : : * LE64_TO_CPU - convert a little-endian uint64_t constant</a>
+<a name="159"><span class="lineNum"> 159 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="160"><span class="lineNum"> 160 </span> : : */</a>
+<a name="161"><span class="lineNum"> 161 </span> : : #define LE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : /**</a>
+<a name="164"><span class="lineNum"> 164 </span> : : * LE32_TO_CPU - convert a little-endian uint32_t constant</a>
+<a name="165"><span class="lineNum"> 165 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="166"><span class="lineNum"> 166 </span> : : */</a>
+<a name="167"><span class="lineNum"> 167 </span> : : #define LE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : /**</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * LE16_TO_CPU - convert a little-endian uint16_t constant</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="172"><span class="lineNum"> 172 </span> : : */</a>
+<a name="173"><span class="lineNum"> 173 </span> : : #define LE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> : : #else /* ... HAVE_BIG_ENDIAN */</a>
+<a name="176"><span class="lineNum"> 176 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)BSWAP_64(native))</a>
+<a name="177"><span class="lineNum"> 177 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)BSWAP_32(native))</a>
+<a name="178"><span class="lineNum"> 178 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)BSWAP_16(native))</a>
+<a name="179"><span class="lineNum"> 179 </span> : : #define LE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="180"><span class="lineNum"> 180 </span> : : #define LE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="181"><span class="lineNum"> 181 </span> : : #define LE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="182"><span class="lineNum"> 182 </span> : : #endif /* HAVE_BIG_ENDIAN */</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : #if HAVE_BIG_ENDIAN</a>
+<a name="185"><span class="lineNum"> 185 </span> : : /**</a>
+<a name="186"><span class="lineNum"> 186 </span> : : * CPU_TO_BE64 - convert a constant uint64_t value to big-endian</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * @native: constant to convert</a>
+<a name="188"><span class="lineNum"> 188 </span> : : */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)(native))</a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> : : /**</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * CPU_TO_BE32 - convert a constant uint32_t value to big-endian</a>
+<a name="193"><span class="lineNum"> 193 </span> : : * @native: constant to convert</a>
+<a name="194"><span class="lineNum"> 194 </span> : : */</a>
+<a name="195"><span class="lineNum"> 195 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)(native))</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> : : /**</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * CPU_TO_BE16 - convert a constant uint16_t value to big-endian</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @native: constant to convert</a>
+<a name="200"><span class="lineNum"> 200 </span> : : */</a>
+<a name="201"><span class="lineNum"> 201 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)(native))</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : /**</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * BE64_TO_CPU - convert a big-endian uint64_t constant</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> : : #define BE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> : : /**</a>
+<a name="210"><span class="lineNum"> 210 </span> : : * BE32_TO_CPU - convert a big-endian uint32_t constant</a>
+<a name="211"><span class="lineNum"> 211 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="212"><span class="lineNum"> 212 </span> : : */</a>
+<a name="213"><span class="lineNum"> 213 </span> : : #define BE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> : : /**</a>
+<a name="216"><span class="lineNum"> 216 </span> : : * BE16_TO_CPU - convert a big-endian uint16_t constant</a>
+<a name="217"><span class="lineNum"> 217 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="218"><span class="lineNum"> 218 </span> : : */</a>
+<a name="219"><span class="lineNum"> 219 </span> : : #define BE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : #else /* ... HAVE_LITTLE_ENDIAN */</a>
+<a name="222"><span class="lineNum"> 222 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)BSWAP_64(native))</a>
+<a name="223"><span class="lineNum"> 223 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)BSWAP_32(native))</a>
+<a name="224"><span class="lineNum"> 224 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)BSWAP_16(native))</a>
+<a name="225"><span class="lineNum"> 225 </span> : : #define BE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="226"><span class="lineNum"> 226 </span> : : #define BE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="227"><span class="lineNum"> 227 </span> : : #define BE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="228"><span class="lineNum"> 228 </span> : : #endif /* HAVE_LITTE_ENDIAN */</a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * cpu_to_le64 - convert a uint64_t value to little-endian</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * @native: value to convert</a>
+<a name="234"><span class="lineNum"> 234 </span> : : */</a>
+<a name="235"><span class="lineNum"> 235 </span> : : static inline leint64_t cpu_to_le64(uint64_t native)</a>
+<a name="236"><span class="lineNum"> 236 </span> : : {</a>
+<a name="237"><span class="lineNum"> 237 </span> : : return CPU_TO_LE64(native);</a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /**</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * cpu_to_le32 - convert a uint32_t value to little-endian</a>
+<a name="242"><span class="lineNum"> 242 </span> : : * @native: value to convert</a>
+<a name="243"><span class="lineNum"> 243 </span> : : */</a>
+<a name="244"><span class="lineNum"> 244 </span> : : static inline leint32_t cpu_to_le32(uint32_t native)</a>
+<a name="245"><span class="lineNum"> 245 </span> : : {</a>
+<a name="246"><span class="lineNum"> 246 </span> : : return CPU_TO_LE32(native);</a>
+<a name="247"><span class="lineNum"> 247 </span> : : }</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> : : /**</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * cpu_to_le16 - convert a uint16_t value to little-endian</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * @native: value to convert</a>
+<a name="252"><span class="lineNum"> 252 </span> : : */</a>
+<a name="253"><span class="lineNum"> 253 </span> : : static inline leint16_t cpu_to_le16(uint16_t native)</a>
+<a name="254"><span class="lineNum"> 254 </span> : : {</a>
+<a name="255"><span class="lineNum"> 255 </span> : : return CPU_TO_LE16(native);</a>
+<a name="256"><span class="lineNum"> 256 </span> : : }</a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> : : /**</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * le64_to_cpu - convert a little-endian uint64_t value</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @le_val: little-endian value to convert</a>
+<a name="261"><span class="lineNum"> 261 </span> : : */</a>
+<a name="262"><span class="lineNum"> 262 </span> : : static inline uint64_t le64_to_cpu(leint64_t le_val)</a>
+<a name="263"><span class="lineNum"> 263 </span> : : {</a>
+<a name="264"><span class="lineNum"> 264 </span> : : return LE64_TO_CPU(le_val);</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : /**</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * le32_to_cpu - convert a little-endian uint32_t value</a>
+<a name="269"><span class="lineNum"> 269 </span> : : * @le_val: little-endian value to convert</a>
+<a name="270"><span class="lineNum"> 270 </span> : : */</a>
+<a name="271"><span class="lineNum"> 271 </span> : : static inline uint32_t le32_to_cpu(leint32_t le_val)</a>
+<a name="272"><span class="lineNum"> 272 </span> : : {</a>
+<a name="273"><span class="lineNum"> 273 </span> : : return LE32_TO_CPU(le_val);</a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /**</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * le16_to_cpu - convert a little-endian uint16_t value</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * @le_val: little-endian value to convert</a>
+<a name="279"><span class="lineNum"> 279 </span> : : */</a>
+<a name="280"><span class="lineNum"> 280 </span> : : static inline uint16_t le16_to_cpu(leint16_t le_val)</a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : return LE16_TO_CPU(le_val);</a>
+<a name="283"><span class="lineNum"> 283 </span> : : }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> : : /**</a>
+<a name="286"><span class="lineNum"> 286 </span> : : * cpu_to_be64 - convert a uint64_t value to big endian.</a>
+<a name="287"><span class="lineNum"> 287 </span> : : * @native: value to convert</a>
+<a name="288"><span class="lineNum"> 288 </span> : : */</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 450 : static inline beint64_t cpu_to_be64(uint64_t native)</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : {</a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 450 : return CPU_TO_BE64(native);</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : }</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : /**</a>
+<a name="295"><span class="lineNum"> 295 </span> : : * cpu_to_be32 - convert a uint32_t value to big endian.</a>
+<a name="296"><span class="lineNum"> 296 </span> : : * @native: value to convert</a>
+<a name="297"><span class="lineNum"> 297 </span> : : */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : static inline beint32_t cpu_to_be32(uint32_t native)</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : {</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : return CPU_TO_BE32(native);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : }</a>
+<a name="302"><span class="lineNum"> 302 </span> : : </a>
+<a name="303"><span class="lineNum"> 303 </span> : : /**</a>
+<a name="304"><span class="lineNum"> 304 </span> : : * cpu_to_be16 - convert a uint16_t value to big endian.</a>
+<a name="305"><span class="lineNum"> 305 </span> : : * @native: value to convert</a>
+<a name="306"><span class="lineNum"> 306 </span> : : */</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : static inline beint16_t cpu_to_be16(uint16_t native)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : {</a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : return CPU_TO_BE16(native);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> : : /**</a>
+<a name="313"><span class="lineNum"> 313 </span> : : * be64_to_cpu - convert a big-endian uint64_t value</a>
+<a name="314"><span class="lineNum"> 314 </span> : : * @be_val: big-endian value to convert</a>
+<a name="315"><span class="lineNum"> 315 </span> : : */</a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 5055 : static inline uint64_t be64_to_cpu(beint64_t be_val)</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 5055 : return BE64_TO_CPU(be_val);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /**</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * be32_to_cpu - convert a big-endian uint32_t value</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * @be_val: big-endian value to convert</a>
+<a name="324"><span class="lineNum"> 324 </span> : : */</a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : static inline uint32_t be32_to_cpu(beint32_t be_val)</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : return BE32_TO_CPU(be_val);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : }</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> : : /**</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * be16_to_cpu - convert a big-endian uint16_t value</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * @be_val: big-endian value to convert</a>
+<a name="333"><span class="lineNum"> 333 </span> : : */</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineNoCov"> 0 : static inline uint16_t be16_to_cpu(beint16_t be_val)</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : {</a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineNoCov"> 0 : return BE16_TO_CPU(be_val);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : }</a>
+<a name="338"><span class="lineNum"> 338 </span> : : </a>
+<a name="339"><span class="lineNum"> 339 </span> : : /* Whichever they include first, they get these definitions. */</a>
+<a name="340"><span class="lineNum"> 340 </span> : : #ifdef CCAN_SHORT_TYPES_H</a>
+<a name="341"><span class="lineNum"> 341 </span> : : /**</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * be64/be32/be16 - 64/32/16 bit big-endian representation.</a>
+<a name="343"><span class="lineNum"> 343 </span> : : */</a>
+<a name="344"><span class="lineNum"> 344 </span> : : typedef beint64_t be64;</a>
+<a name="345"><span class="lineNum"> 345 </span> : : typedef beint32_t be32;</a>
+<a name="346"><span class="lineNum"> 346 </span> : : typedef beint16_t be16;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /**</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * le64/le32/le16 - 64/32/16 bit little-endian representation.</a>
+<a name="350"><span class="lineNum"> 350 </span> : : */</a>
+<a name="351"><span class="lineNum"> 351 </span> : : typedef leint64_t le64;</a>
+<a name="352"><span class="lineNum"> 352 </span> : : typedef leint32_t le32;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : typedef leint16_t le16;</a>
+<a name="354"><span class="lineNum"> 354 </span> : : #endif</a>
+<a name="355"><span class="lineNum"> 355 </span> : : #endif /* CCAN_ENDIAN_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/endian/index-sort-b.html b/coverage-report/external/gard/ccan/endian/index-sort-b.html
new file mode 100644
index 0000000..86f6b5c
--- /dev/null
+++ b/coverage-report/external/gard/ccan/endian/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=33 height=10 alt="33.3%"><img src="../../../../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/endian/index-sort-f.html b/coverage-report/external/gard/ccan/endian/index-sort-f.html
new file mode 100644
index 0000000..5e744f5
--- /dev/null
+++ b/coverage-report/external/gard/ccan/endian/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=33 height=10 alt="33.3%"><img src="../../../../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/endian/index-sort-l.html b/coverage-report/external/gard/ccan/endian/index-sort-l.html
new file mode 100644
index 0000000..257face
--- /dev/null
+++ b/coverage-report/external/gard/ccan/endian/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=33 height=10 alt="33.3%"><img src="../../../../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/endian/index.html b/coverage-report/external/gard/ccan/endian/index.html
new file mode 100644
index 0000000..d807cde
--- /dev/null
+++ b/coverage-report/external/gard/ccan/endian/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=33 height=10 alt="33.3%"><img src="../../../../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/list/index-sort-b.html b/coverage-report/external/gard/ccan/list/index-sort-b.html
new file mode 100644
index 0000000..a553584
--- /dev/null
+++ b/coverage-report/external/gard/ccan/list/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/list/index-sort-f.html b/coverage-report/external/gard/ccan/list/index-sort-f.html
new file mode 100644
index 0000000..2964a38
--- /dev/null
+++ b/coverage-report/external/gard/ccan/list/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/list/index-sort-l.html b/coverage-report/external/gard/ccan/list/index-sort-l.html
new file mode 100644
index 0000000..0bf7ad6
--- /dev/null
+++ b/coverage-report/external/gard/ccan/list/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/list/index.html b/coverage-report/external/gard/ccan/list/index.html
new file mode 100644
index 0000000..743cfdc
--- /dev/null
+++ b/coverage-report/external/gard/ccan/list/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/gard/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/list/list.c.func-sort-c.html b/coverage-report/external/gard/ccan/list/list.c.func-sort-c.html
new file mode 100644
index 0000000..8ad67af
--- /dev/null
+++ b/coverage-report/external/gard/ccan/list/list.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/list/list.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/gard/ccan/list</a> - list.c<span style="font-size: 80%;"> (<a href="list.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="list.c.func.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#4">corrupt</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#36">list_check</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#18">list_check_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/list/list.c.func.html b/coverage-report/external/gard/ccan/list/list.c.func.html
new file mode 100644
index 0000000..b59c3db
--- /dev/null
+++ b/coverage-report/external/gard/ccan/list/list.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/list/list.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/gard/ccan/list</a> - list.c<span style="font-size: 80%;"> (<a href="list.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="list.c.func-sort-c.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#4">corrupt</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#36">list_check</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#18">list_check_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/ccan/list/list.c.gcov.html b/coverage-report/external/gard/ccan/list/list.c.gcov.html
new file mode 100644
index 0000000..4905d1b
--- /dev/null
+++ b/coverage-report/external/gard/ccan/list/list.c.gcov.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/ccan/list/list.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/gard/ccan/list</a> - list.c<span style="font-size: 80%;"> (source / <a href="list.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Licensed under BSD-MIT - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;list.h&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineNoCov"> 0 : static void *corrupt(const char *abortstr,</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : const struct list_node *head,</a>
+<a name="8"><span class="lineNum"> 8 </span> : : const struct list_node *node,</a>
+<a name="9"><span class="lineNum"> 9 </span> : : unsigned int count)</a>
+<a name="10"><span class="lineNum"> 10 </span> : : {</a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineNoCov"> 0 : if (abortstr) {</span></a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineNoCov"> 0 : fprintf(stderr,</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : &quot;%s: prev corrupt in node %p (%u) of %p\n&quot;,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : abortstr, node, count, head);</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : }</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineNoCov"> 0 : struct list_node *list_check_node(const struct list_node *node,</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : const char *abortstr)</a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : const struct list_node *p, *n;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : int count = 0;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : for (p = node, n = node-&gt;next; n != node; p = n, n = n-&gt;next) {</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : count++;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : if (n-&gt;prev != p)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : return corrupt(abortstr, node, n, count);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* Check prev on head node. */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : if (node-&gt;prev != p)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : return corrupt(abortstr, node, node, 0);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : return (struct list_node *)node;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : struct list_head *list_check(const struct list_head *h, const char *abortstr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : if (!list_check_node(&amp;h-&gt;n, abortstr))</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : return (struct list_head *)h;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/arch_flash_common.c.func-sort-c.html b/coverage-report/external/gard/common/arch_flash_common.c.func-sort-c.html
new file mode 100644
index 0000000..13067cf
--- /dev/null
+++ b/coverage-report/external/gard/common/arch_flash_common.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common/arch_flash_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (<a href="arch_flash_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">22.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">25.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="arch_flash_common.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#29">arch_flash_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#17">arch_flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#43">arch_flash_set_wrprotect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#36">arch_flash_access</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/arch_flash_common.c.func.html b/coverage-report/external/gard/common/arch_flash_common.c.func.html
new file mode 100644
index 0000000..44ec617
--- /dev/null
+++ b/coverage-report/external/gard/common/arch_flash_common.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common/arch_flash_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (<a href="arch_flash_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">22.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">25.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="arch_flash_common.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#29">arch_flash_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#36">arch_flash_access</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#17">arch_flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#43">arch_flash_set_wrprotect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/arch_flash_common.c.gcov.html b/coverage-report/external/gard/common/arch_flash_common.c.gcov.html
new file mode 100644
index 0000000..775c147
--- /dev/null
+++ b/coverage-report/external/gard/common/arch_flash_common.c.gcov.html
@@ -0,0 +1,135 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common/arch_flash_common.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (source / <a href="arch_flash_common.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">22.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">25.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Default implementations</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2015-2017 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;arch_flash.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : /*</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * This just assumes that an erase from zero to total size is</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * 'correct'.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * An erase from zero to total size is the correct approach for</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * powerpc and x86. ARM has it own function which also includes a call</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * to the flash driver.</a>
+<a name="18"><span class="lineNum"> 18 </span> : : */</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak)) arch_flash_erase_chip(struct blocklevel_device *bl)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : uint64_t total_size;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, &amp;total_size, NULL);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : return rc;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return blocklevel_erase(bl, 0, total_size);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak,const)) arch_flash_4b_mode(struct blocklevel_device *bl, int set_4b)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : {</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : (void)set_4b;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 46 : enum flash_access __attribute__((weak,const)) arch_flash_access(struct blocklevel_device *bl, enum flash_access access)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 46 : (void)bl;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 46 : (void)access;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 46 : return ACCESS_INVAL;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak,const)) arch_flash_set_wrprotect(struct blocklevel_device *bl, int set)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : (void)set;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/arch_flash_unknown.c.func-sort-c.html b/coverage-report/external/gard/common/arch_flash_unknown.c.func-sort-c.html
new file mode 100644
index 0000000..d6690bd
--- /dev/null
+++ b/coverage-report/external/gard/common/arch_flash_unknown.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common/arch_flash_unknown.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (<a href="arch_flash_unknown.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="arch_flash_unknown.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#36">arch_flash_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#17">arch_flash_init</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/arch_flash_unknown.c.func.html b/coverage-report/external/gard/common/arch_flash_unknown.c.func.html
new file mode 100644
index 0000000..26a688075
--- /dev/null
+++ b/coverage-report/external/gard/common/arch_flash_unknown.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common/arch_flash_unknown.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (<a href="arch_flash_unknown.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="arch_flash_unknown.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#36">arch_flash_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#17">arch_flash_init</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/arch_flash_unknown.c.gcov.html b/coverage-report/external/gard/common/arch_flash_unknown.c.gcov.html
new file mode 100644
index 0000000..0410382
--- /dev/null
+++ b/coverage-report/external/gard/common/arch_flash_unknown.c.gcov.html
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common/arch_flash_unknown.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (source / <a href="arch_flash_unknown.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp.</a>
+<a name="3"><span class="lineNum"> 3 </span> : : */</a>
+<a name="4"><span class="lineNum"> 4 </span> : : </a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;limits.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;dirent.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;libflash/file.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;arch_flash.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 46 : int arch_flash_init(struct blocklevel_device **r_bl, const char *file, bool keep_alive)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 46 : int rc;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 46 : struct blocklevel_device *new_bl;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : /* Must have passed through a file to operate on */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 46 : if (!file) {</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Cannot operate without a file\n&quot;);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 46 : rc = file_init_path(file, NULL, keep_alive, &amp;new_bl);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 46 : if (rc)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : return -1;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 46 : *r_bl = new_bl;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 46 : return 0;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : void arch_flash_close(struct blocklevel_device *bl, const char *file)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : (void)file;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : file_exit_close(bl);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/index-sort-b.html b/coverage-report/external/gard/common/index-sort-b.html
new file mode 100644
index 0000000..885e011
--- /dev/null
+++ b/coverage-report/external/gard/common/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=57 height=10 alt="57.1%"><img src="../../../snow.png" width=43 height=10 alt="57.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=22 height=10 alt="22.2%"><img src="../../../snow.png" width=78 height=10 alt="22.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">22.2&nbsp;%</td>
+ <td class="coverNumLo">4 / 18</td>
+ <td class="coverPerLo">25.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/index-sort-f.html b/coverage-report/external/gard/common/index-sort-f.html
new file mode 100644
index 0000000..ba08e66
--- /dev/null
+++ b/coverage-report/external/gard/common/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=22 height=10 alt="22.2%"><img src="../../../snow.png" width=78 height=10 alt="22.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">22.2&nbsp;%</td>
+ <td class="coverNumLo">4 / 18</td>
+ <td class="coverPerLo">25.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=57 height=10 alt="57.1%"><img src="../../../snow.png" width=43 height=10 alt="57.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/index-sort-l.html b/coverage-report/external/gard/common/index-sort-l.html
new file mode 100644
index 0000000..8382dad
--- /dev/null
+++ b/coverage-report/external/gard/common/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=22 height=10 alt="22.2%"><img src="../../../snow.png" width=78 height=10 alt="22.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">22.2&nbsp;%</td>
+ <td class="coverNumLo">4 / 18</td>
+ <td class="coverPerLo">25.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=57 height=10 alt="57.1%"><img src="../../../snow.png" width=43 height=10 alt="57.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/common/index.html b/coverage-report/external/gard/common/index.html
new file mode 100644
index 0000000..a6da1f8
--- /dev/null
+++ b/coverage-report/external/gard/common/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=22 height=10 alt="22.2%"><img src="../../../snow.png" width=78 height=10 alt="22.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">22.2&nbsp;%</td>
+ <td class="coverNumLo">4 / 18</td>
+ <td class="coverPerLo">25.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=57 height=10 alt="57.1%"><img src="../../../snow.png" width=43 height=10 alt="57.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/gard.c.func-sort-c.html b/coverage-report/external/gard/gard.c.func-sort-c.html
new file mode 100644
index 0000000..4a69e43
--- /dev/null
+++ b/coverage-report/external/gard/gard.c.func-sort-c.html
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/gard.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/gard</a> - gard.c<span style="font-size: 80%;"> (<a href="gard.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">326</td>
+ <td class="headerCovTableEntry">468</td>
+ <td class="headerCovTableEntryLo">69.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntryHi">95.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="gard.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#60">show_flash_err</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#766">usage</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#515">do_show</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#589">reset_partition</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#402">count_records</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#532">do_clear_i</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#484">do_show_i</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#616">do_clear</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#346">do_iterate</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#424">find_longest_path</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#413">count_valid_records</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#449">do_list</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#199">deconfig_reason_str</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#639">do_create</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#275">parse_path</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#440">draw_ruler</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#243">format_path</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#701">check_gard_partition</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#123">set_chip_gen</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#807">main</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#185">str_to_target_type</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#377">__gard_next</a></td>
+ <td class="coverFnHi">104</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#174">target_type_to_str</a></td>
+ <td class="coverFnHi">194</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/gard.c.func.html b/coverage-report/external/gard/gard.c.func.html
new file mode 100644
index 0000000..278e39b
--- /dev/null
+++ b/coverage-report/external/gard/gard.c.func.html
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/gard.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/gard</a> - gard.c<span style="font-size: 80%;"> (<a href="gard.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">326</td>
+ <td class="headerCovTableEntry">468</td>
+ <td class="headerCovTableEntryLo">69.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntryHi">95.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="gard.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#377">__gard_next</a></td>
+ <td class="coverFnHi">104</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#701">check_gard_partition</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#402">count_records</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#413">count_valid_records</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#199">deconfig_reason_str</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#616">do_clear</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#532">do_clear_i</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#639">do_create</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#346">do_iterate</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#449">do_list</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#515">do_show</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#484">do_show_i</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#440">draw_ruler</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#424">find_longest_path</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#243">format_path</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#807">main</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#275">parse_path</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#589">reset_partition</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#123">set_chip_gen</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#60">show_flash_err</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#185">str_to_target_type</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#174">target_type_to_str</a></td>
+ <td class="coverFnHi">194</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="gard.c.gcov.html#766">usage</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/gard.c.gcov.html b/coverage-report/external/gard/gard.c.gcov.html
new file mode 100644
index 0000000..9647414
--- /dev/null
+++ b/coverage-report/external/gard/gard.c.gcov.html
@@ -0,0 +1,1093 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/gard.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/gard</a> - gard.c<span style="font-size: 80%;"> (source / <a href="gard.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">326</td>
+ <td class="headerCovTableEntry">468</td>
+ <td class="headerCovTableEntryLo">69.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntryHi">95.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Manipulate GARD records in the GARD partition</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;errno.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;string.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;sys/mman.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;dirent.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;limits.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &lt;ccan/array_size/array_size.h&gt;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &lt;mtd/mtd-abi.h&gt;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;getopt.h&gt;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &lt;libflash/libffs.h&gt;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &lt;libflash/file.h&gt;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #include &lt;common/arch_flash.h&gt;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : #include &quot;gard.h&quot;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : #define FDT_PATH &quot;/proc/device-tree&quot;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #define FDT_FSP_NODE FDT_PATH&quot;/fsps&quot;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define FDT_ACTIVE_FLASH_PATH FDT_PATH&quot;/chosen/ibm,system-flash&quot;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define SYSFS_MTD_PATH &quot;/sys/class/mtd/&quot;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define FLASH_GARD_PART &quot;GUARD&quot;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define VPNOR_GARD_DIR &quot;/media/pnor-prsv&quot;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define VPNOR_GARD_FILE VPNOR_GARD_DIR&quot;/GUARD&quot;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : /* Full gard version number (possibly includes gitid). */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : extern const char version[];</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : #define __unused __attribute__((unused))</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : struct gard_ctx {</a>
+<a name="51"><span class="lineNum"> 51 </span> : : uint32_t f_size;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : uint32_t f_pos;</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : uint32_t gard_part_idx;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : uint32_t gard_data_pos;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : uint32_t gard_data_len;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : struct blocklevel_device *bl;</a>
+<a name="59"><span class="lineNum"> 59 </span> : : struct ffs_handle *ffs;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : };</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : static void show_flash_err(int rc)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : {</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : switch (rc) {</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : case FFS_ERR_BAD_MAGIC:</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libffs bad magic\n&quot;);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : case FFS_ERR_BAD_VERSION:</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libffs bad version\n&quot;);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : case FFS_ERR_BAD_CKSUM:</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libffs bad check sum\n&quot;);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : case FFS_ERR_PART_NOT_FOUND:</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libffs flash partition not found\n&quot;);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : /* ------- */</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_MALLOC_FAILED:</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash malloc failed\n&quot;);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_CHIP_UNKNOWN:</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash unknown flash chip\n&quot;);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_PARM_ERROR:</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash parameter error\n&quot;);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_ERASE_BOUNDARY:</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash erase boundary error\n&quot;);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_WREN_TIMEOUT:</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash WREN timeout\n&quot;);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_WIP_TIMEOUT:</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash WIP timeout\n&quot;);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_VERIFY_FAILURE:</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash verification failure\n&quot;);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_4B_NOT_SUPPORTED:</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash 4byte mode not supported\n&quot;);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_CTRL_CONFIG_MISMATCH:</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash control config mismatch\n&quot;);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_CHIP_ER_NOT_SUPPORTED:</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash chip not supported\n&quot;);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_CTRL_CMD_UNSUPPORTED:</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash unsupported control command\n&quot;);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_CTRL_TIMEOUT:</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash control timeout\n&quot;);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : case FLASH_ERR_ECC_INVALID:</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;libflash ecc invalid\n&quot;);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;A libflash/libffs error has occurred %d\n&quot;, rc);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : const struct chip_unit_desc *chip_units;</a>
+<a name="123"><span class="lineNum"> 123 </span> : : int chip_unit_count;</a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 46 : static void set_chip_gen(const struct chip_unit_desc *c)</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : {</a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 46 : chip_units = c;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 46 : chip_unit_count = 0;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 3258 : while (strcmp(&quot;LAST_IN_RANGE&quot;, c-&gt;desc)) {</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 3212 : chip_unit_count++;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 3212 : c++;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : }</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 46 : }</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : #ifdef __powerpc64__</a>
+<a name="137"><span class="lineNum"> 137 </span> : : static void guess_chip_gen(void)</a>
+<a name="138"><span class="lineNum"> 138 </span> : : {</a>
+<a name="139"><span class="lineNum"> 139 </span> : : /*</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * Guesstimate what chip generation based on the PVR if we're running</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * on ppc64.</a>
+<a name="142"><span class="lineNum"> 142 </span> : : */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : uint32_t pvr;</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /* grab the chip type from the PVR SPR */</a>
+<a name="146"><span class="lineNum"> 146 </span> : : asm (&quot;mfspr %0,0x11f&quot; : &quot;=r&quot; (pvr));</a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> : : switch (pvr &gt;&gt; 16) {</a>
+<a name="149"><span class="lineNum"> 149 </span> : : case 0x004b: /* murano */</a>
+<a name="150"><span class="lineNum"> 150 </span> : : case 0x004c: /* naples */</a>
+<a name="151"><span class="lineNum"> 151 </span> : : case 0x004d: /* venice */</a>
+<a name="152"><span class="lineNum"> 152 </span> : : set_chip_gen(p8_chip_units);</a>
+<a name="153"><span class="lineNum"> 153 </span> : : return;</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> : : case 0x004e: /* nimbus */</a>
+<a name="156"><span class="lineNum"> 156 </span> : : case 0x004f: /* axone */</a>
+<a name="157"><span class="lineNum"> 157 </span> : : set_chip_gen(p9_chip_units);</a>
+<a name="158"><span class="lineNum"> 158 </span> : : return;</a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : default:</a>
+<a name="161"><span class="lineNum"> 161 </span> : : fprintf(stderr, &quot;Unsupported processor (pvr %#x)! Set the processor generation manually with -8 or -9\n&quot;, pvr);</a>
+<a name="162"><span class="lineNum"> 162 </span> : : exit(1);</a>
+<a name="163"><span class="lineNum"> 163 </span> : : }</a>
+<a name="164"><span class="lineNum"> 164 </span> : : }</a>
+<a name="165"><span class="lineNum"> 165 </span> : : #else</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 30 : static void guess_chip_gen(void)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : {</a>
+<a name="168"><span class="lineNum"> 168 </span> : : #ifdef ASSUME_P8</a>
+<a name="169"><span class="lineNum"> 169 </span> : : set_chip_gen(p8_chip_units);</a>
+<a name="170"><span class="lineNum"> 170 </span> : : #else</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 30 : set_chip_gen(p9_chip_units);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : #endif</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 30 : }</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : #endif</a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 194 : static const char *target_type_to_str(int type)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : {</a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 194 : int i;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 4658 : for (i = 0; i &lt; chip_unit_count; i++)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 4658 : if (chip_units[i].type == type)</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 194 : return chip_units[i].desc;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : return &quot;UNKNOWN&quot;;</a>
+<a name="185"><span class="lineNum"> 185 </span> : : }</a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 72 : static int str_to_target_type(const char *path)</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : {</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 72 : int i, len;</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 1826 : for (i = 0; i &lt; chip_unit_count; i++) {</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 1822 : len = strlen(chip_units[i].desc);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 1822 : if (!strncasecmp(chip_units[i].desc, path, len))</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 68 : return chip_units[i].type; /* match! */</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : }</a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> : : return -1;</a>
+<a name="199"><span class="lineNum"> 199 </span> : : }</a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 18 : static const char *deconfig_reason_str(enum gard_reason reason)</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : {</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 18 : switch (reason) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : case GARD_NO_REASON:</a>
+<a name="205"><span class="lineNum"> 205 </span> : : return &quot;None&quot;;</a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 10 : case GARD_MANUAL:</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 10 : return &quot;Manual&quot;;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : case GARD_UNRECOVERABLE:</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : return &quot;Unrecoverable&quot;;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 2 : case GARD_FATAL:</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 2 : return &quot;Fatal&quot;;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 6 : case GARD_PREDICTIVE:</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 6 : return &quot;Predictive&quot;;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : case GARD_POWER:</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : return &quot;Power&quot;; // What does this even mean?</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : case GARD_HYP:</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : return &quot;Hypervisor&quot;;</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : case GARD_RECONFIG:</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : return &quot;Reconfig&quot;;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : return &quot;Unknown&quot;;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : }</a>
+<a name="223"><span class="lineNum"> 223 </span> : : };</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 4 : static const char *path_type_to_str(enum path_type t)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : {</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 4 : switch (t) {</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : case PATH_NA:</a>
+<a name="229"><span class="lineNum"> 229 </span> : : return &quot;not applicable&quot;;</a>
+<a name="230"><span class="lineNum"> 230 </span> : : case PATH_AFFINITY:</a>
+<a name="231"><span class="lineNum"> 231 </span> : : return &quot;affinity&quot;;</a>
+<a name="232"><span class="lineNum"> 232 </span> : : case PATH_PHYSICAL:</a>
+<a name="233"><span class="lineNum"> 233 </span> : : return &quot;physical&quot;;</a>
+<a name="234"><span class="lineNum"> 234 </span> : : case PATH_DEVICE:</a>
+<a name="235"><span class="lineNum"> 235 </span> : : return &quot;device&quot;;</a>
+<a name="236"><span class="lineNum"> 236 </span> : : case PATH_POWER:</a>
+<a name="237"><span class="lineNum"> 237 </span> : : return &quot;power&quot;;</a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : return &quot;Unknown&quot;;</a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : /*</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * NB: buffer is assumped to be MAX_PATH_SIZE</a>
+<a name="244"><span class="lineNum"> 244 </span> : : */</a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 28 : static char *format_path(struct entity_path *path, char *buffer)</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : {</a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 28 : int elements = path-&gt;type_size &amp; PATH_ELEMENTS_MASK;</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 28 : int i, offset = 0;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 140 : for (i = 0; i &lt; elements; i++) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 112 : const struct path_element *e = &amp;path-&gt;path_elements[i];</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 112 : offset += sprintf(buffer + offset, &quot;/%s%d&quot;,</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 112 : target_type_to_str(e-&gt;target_type),</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 112 : e-&gt;instance);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : }</a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 28 : return buffer;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : }</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> : : /*</a>
+<a name="262"><span class="lineNum"> 262 </span> : : * parses a Path string into the entity_path structured provided.</a>
+<a name="263"><span class="lineNum"> 263 </span> : : *</a>
+<a name="264"><span class="lineNum"> 264 </span> : : * str - In param, String to parse</a>
+<a name="265"><span class="lineNum"> 265 </span> : : * parsed - Out param, resultant entity_path</a>
+<a name="266"><span class="lineNum"> 266 </span> : : *</a>
+<a name="267"><span class="lineNum"> 267 </span> : : * e.g.</a>
+<a name="268"><span class="lineNum"> 268 </span> : : *</a>
+<a name="269"><span class="lineNum"> 269 </span> : : * &quot;/Sys0/Node0/Proc1&quot; -&gt; {</a>
+<a name="270"><span class="lineNum"> 270 </span> : : * type_size = 0x23,</a>
+<a name="271"><span class="lineNum"> 271 </span> : : *</a>
+<a name="272"><span class="lineNum"> 272 </span> : : * path_element[0] = {0, 0}</a>
+<a name="273"><span class="lineNum"> 273 </span> : : * path_element[1] = {1, 0}</a>
+<a name="274"><span class="lineNum"> 274 </span> : : * path_element[2] = {2, 1}</a>
+<a name="275"><span class="lineNum"> 275 </span> : : * }</a>
+<a name="276"><span class="lineNum"> 276 </span> : : */</a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 18 : static int parse_path(const char *str, struct entity_path *parsed)</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : {</a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 18 : int unit_count = 0;</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 18 : memset(parsed, 0, sizeof(*parsed));</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 82 : while (*str != '\0') {</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 72 : int unit_id = str_to_target_type(++str); /* ++ skips the '/' */</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 72 : long instance;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 72 : char *end;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 72 : size_t len;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 72 : if (unit_count &gt; MAX_PATH_ELEMENTS - 1) {</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;Path has more than 10 components!\n&quot;);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 8 : return -1;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : }</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : /* find the type Id of this component */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 70 : if (unit_id &lt; 0) { /* unknown unit, bail out */</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 4 : fprintf(stderr, &quot;Unknown unit at: '%s'\n&quot;, str);</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 4 : return -1;</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : }</a>
+<a name="299"><span class="lineNum"> 299 </span> : : </a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 66 : parsed-&gt;path_elements[unit_count].target_type = unit_id;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> : : /* now parse the instance # */</a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 66 : len = strlen(target_type_to_str(unit_id));</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 66 : instance = strtol(str + len, &amp;end, 10);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : </a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 66 : if (!isdigit(*(str + len))) {</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Missing instance number after '%s'\n&quot;,</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : str);</a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 66 : if (*end != '\0' &amp;&amp; *end != '/') {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unable to parse instance after '%s'\n&quot;,</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : str);</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : }</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 66 : if (instance &gt; 255 || instance &lt; 0) {</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 2 : fprintf(stderr,</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : &quot;Instance %ld is invalid. Must be 0 to 255\n&quot;,</a>
+<a name="321"><span class="lineNum"> 321 </span> : : instance);</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 2 : return -1;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> : : }</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 64 : parsed-&gt;path_elements[unit_count].instance = instance;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 64 : str = end;</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 64 : unit_count++;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : }</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> : : /*</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * We assume the path is a physical path because every gard record I've</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * seen so far uses them. We might need to fix this later on, but lets</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * cross the bridge when we have to.</a>
+<a name="334"><span class="lineNum"> 334 </span> : : */</a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 10 : parsed-&gt;type_size = (unit_count &amp; 0xf) |</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : (PATH_PHYSICAL &lt;&lt; PATH_TYPE_SHIFT);</a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 10 : return 0;</span></a>
+<a name="339"><span class="lineNum"> 339 </span> : : }</a>
+<a name="340"><span class="lineNum"> 340 </span> : : </a>
+<a name="341"><span class="lineNum"> 341 </span> : : static struct gard_record blank_record;</a>
+<a name="342"><span class="lineNum"> 342 </span> : : </a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 112 : static bool is_valid_record(struct gard_record *g)</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : {</a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 112 : return memcmp(&amp;blank_record, g, sizeof(*g));</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : }</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 10 : static int do_iterate(struct gard_ctx *ctx,</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : int (*func)(struct gard_ctx *ctx, int pos,</a>
+<a name="350"><span class="lineNum"> 350 </span> : : struct gard_record *gard, void *priv),</a>
+<a name="351"><span class="lineNum"> 351 </span> : : void *priv)</a>
+<a name="352"><span class="lineNum"> 352 </span> : : {</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 10 : int rc = 0;</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 10 : unsigned int i;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 10 : struct gard_record gard, null_gard;</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 10 : memset(&amp;null_gard, UINT_MAX, sizeof(gard));</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 22 : for (i = 0; i * sizeof(gard) &lt; ctx-&gt;gard_data_len &amp;&amp; rc == 0; i++) {</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 22 : memset(&amp;gard, 0, sizeof(gard));</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 22 : rc = blocklevel_read(ctx-&gt;bl, ctx-&gt;gard_data_pos + (i * sizeof(gard)),</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : &amp;gard, sizeof(gard));</a>
+<a name="363"><span class="lineNum"> 363 </span> : : /* It isn't super clear what constitutes the end, this should do */</a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 22 : if (rc || memcmp(&amp;gard, &amp;null_gard, sizeof(gard)) == 0)</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : break;</a>
+<a name="366"><span class="lineNum"> 366 </span> : : </a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 12 : rc = func(ctx, i, &amp;gard, priv);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : }</a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 10 : return rc;</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : }</a>
+<a name="372"><span class="lineNum"> 372 </span> : : </a>
+<a name="373"><span class="lineNum"> 373 </span> : : /*</a>
+<a name="374"><span class="lineNum"> 374 </span> : : * read the next guard record into the supplied buffer (gard)</a>
+<a name="375"><span class="lineNum"> 375 </span> : : *</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * returns the record id (nb: 1 based not zero)</a>
+<a name="377"><span class="lineNum"> 377 </span> : : *</a>
+<a name="378"><span class="lineNum"> 378 </span> : : */</a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 104 : static int __gard_next(struct gard_ctx *ctx, int pos, struct gard_record *gard, int *rc)</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : {</a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 104 : uint32_t offset = pos * sizeof(*gard);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 104 : if (offset &gt; ctx-&gt;gard_data_len) /* too big */</span></a>
+<a name="384"><span class="lineNum"> 384 </span> : : return -1;</a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> : : /* you lose error handling information, *gruble* */</a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 104 : memset(gard, 0, sizeof(*gard));</span></a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineCov"> 104 : *rc = blocklevel_read(ctx-&gt;bl, ctx-&gt;gard_data_pos + offset,</span></a>
+<a name="389"><span class="lineNum"> 389 </span> : : gard, sizeof(*gard));</a>
+<a name="390"><span class="lineNum"> 390 </span> : : </a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 104 : if (!is_valid_record(gard))</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : return -1;</a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 56 : if (*rc)</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> : : return pos;</a>
+<a name="398"><span class="lineNum"> 398 </span> : : }</a>
+<a name="399"><span class="lineNum"> 399 </span> : : </a>
+<a name="400"><span class="lineNum"> 400 </span> : : #define for_each_gard(ctx, pos, gard, rc) \</a>
+<a name="401"><span class="lineNum"> 401 </span> : : for (pos = __gard_next(ctx, 0, gard, rc); \</a>
+<a name="402"><span class="lineNum"> 402 </span> : : pos &gt;= 0; pos = __gard_next(ctx, ++pos, gard, rc))</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 6 : static int count_records(struct gard_ctx *ctx)</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : {</a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 6 : struct gard_record record;</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineCov"> 6 : int rc, pos, count = 0;</span></a>
+<a name="408"><span class="lineNum"> 408 </span> : : </a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 14 : for_each_gard(ctx, pos, &amp;record, &amp;rc)</span></a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 8 : count++;</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : </a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 6 : return rc ? rc : count;</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : }</a>
+<a name="414"><span class="lineNum"> 414 </span> : : </a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 14 : static int count_valid_records(struct gard_ctx *ctx)</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : {</a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 14 : struct gard_record record;</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 14 : int rc, pos, count = 0;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : </a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 28 : for_each_gard(ctx, pos, &amp;record, &amp;rc)</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineCov"> 14 : count++;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 14 : return rc ? rc : count;</span></a>
+<a name="424"><span class="lineNum"> 424 </span> : : }</a>
+<a name="425"><span class="lineNum"> 425 </span> : : </a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 10 : static size_t find_longest_path(struct gard_ctx *ctx)</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : {</a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 10 : char scratch[MAX_PATH_SIZE];</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 10 : struct gard_record gard;</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 10 : size_t len, longest = 0;</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 10 : int rc, pos;</span></a>
+<a name="432"><span class="lineNum"> 432 </span> : : </a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 24 : for_each_gard(ctx, pos, &amp;gard, &amp;rc) {</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 14 : len = strlen(format_path(&amp;gard.target_id, scratch));</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineCov"> 14 : if (len &gt; longest)</span></a>
+<a name="436"><span class="lineNum"> 436 </span> : : longest = len;</a>
+<a name="437"><span class="lineNum"> 437 </span> : : }</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 10 : return longest;</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : }</a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 20 : static void draw_ruler(char c, int size)</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : {</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 20 : int i;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : </a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 1580 : for (i = 0; i &lt; size; i++)</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 1560 : putchar(c);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 20 : putchar('\n');</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineCov"> 20 : }</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineCov"> 14 : static int do_list(struct gard_ctx *ctx, int argc __attribute__((unused)),</span></a>
+<a name="452"><span class="lineNum"> 452 </span> : : char **argv __attribute__((unused)))</a>
+<a name="453"><span class="lineNum"> 453 </span> : : {</a>
+<a name="454"><span class="lineNum"> 454 </span> : : /* This header matches the line formatting above in do_list_i() */</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 14 : const char *header = &quot; ID | Error | Type | Path&quot;;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineCov"> 14 : size_t ruler_size;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 14 : char scratch[MAX_PATH_SIZE];</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 14 : struct gard_record gard;</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 14 : int rc = 0, pos;</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : </a>
+<a name="461"><span class="lineNum"> 461 </span> : : /* No entries */</a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 14 : if (count_valid_records(ctx) == 0) {</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 4 : printf(&quot;No GARD entries to display\n&quot;);</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 4 : return 0;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : }</a>
+<a name="466"><span class="lineNum"> 466 </span> : : </a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 10 : puts(header);</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : </a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 10 : ruler_size = strlen(header) + find_longest_path(ctx);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 10 : draw_ruler('-', ruler_size);</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 24 : for_each_gard(ctx, pos, &amp;gard, &amp;rc) {</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 14 : printf(&quot; %08x | %08x | %-10s | %s%s\n&quot;,</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : be32toh(gard.record_id),</a>
+<a name="475"><span class="lineNum"> 475 </span> : : be32toh(gard.errlog_eid),</a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 14 : deconfig_reason_str(gard.error_type),</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : format_path(&amp;gard.target_id, scratch),</a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 14 : gard.record_id == 0xffffffff ? &quot; *CLEARED*&quot; : &quot;&quot;);</span></a>
+<a name="479"><span class="lineNum"> 479 </span> : : }</a>
+<a name="480"><span class="lineNum"> 480 </span> : : </a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineCov"> 10 : draw_ruler('=', ruler_size);</span></a>
+<a name="482"><span class="lineNum"> 482 </span> : : </a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 10 : return rc;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> : : }</a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineCov"> 6 : static int do_show_i(struct gard_ctx *ctx, int pos, struct gard_record *gard, void *priv)</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : {</a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineCov"> 6 : uint32_t id;</span></a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 6 : (void)ctx;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 6 : (void)pos;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> : : </a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 6 : if (!priv || !gard)</span></a>
+<a name="494"><span class="lineNum"> 494 </span> : : return -1;</a>
+<a name="495"><span class="lineNum"> 495 </span> : : </a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 6 : id = *(uint32_t *)priv;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> : : </a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineCov"> 6 : if (be32toh(gard-&gt;record_id) == id) {</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 4 : unsigned int count, i;</span></a>
+<a name="500"><span class="lineNum"> 500 </span> : : </a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 8 : printf(&quot;Record ID: 0x%08x%s\n&quot;, id, id == 0xffffffff ? &quot; *CLEARED*&quot; : &quot;&quot;);</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 4 : printf(&quot;========================\n&quot;);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 4 : printf(&quot;Error ID: 0x%08x\n&quot;, be32toh(gard-&gt;errlog_eid));</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 4 : printf(&quot;Error Type: %s (0x%02x)\n&quot;,</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : deconfig_reason_str(gard-&gt;error_type),</a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineCov"> 4 : gard-&gt;error_type);</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 8 : printf(&quot;Path Type: %s\n&quot;, path_type_to_str(gard-&gt;target_id.type_size &gt;&gt; PATH_TYPE_SHIFT));</span></a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 4 : count = gard-&gt;target_id.type_size &amp; PATH_ELEMENTS_MASK;</span></a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 20 : for (i = 0; i &lt; count &amp;&amp; i &lt; MAX_PATH_ELEMENTS; i++)</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 16 : printf(&quot;%*c%s, Instance #%d\n&quot;, i + 1, '&gt;', target_type_to_str(gard-&gt;target_id.path_elements[i].target_type),</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 16 : gard-&gt;target_id.path_elements[i].instance);</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : }</a>
+<a name="513"><span class="lineNum"> 513 </span> : : </a>
+<a name="514"><span class="lineNum"> 514 </span> : : return 0;</a>
+<a name="515"><span class="lineNum"> 515 </span> : : }</a>
+<a name="516"><span class="lineNum"> 516 </span> : : </a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 4 : static int do_show(struct gard_ctx *ctx, int argc, char **argv)</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : {</a>
+<a name="519"><span class="lineNum"> 519 </span> :<span class="lineCov"> 4 : uint32_t id;</span></a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 4 : int rc;</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 4 : if (argc != 2) {</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;%s option requires a GARD record\n&quot;, argv[0]);</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 4 : id = strtoul(argv[1], NULL, 16);</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : </a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 4 : rc = do_iterate(ctx, &amp;do_show_i, &amp;id);</span></a>
+<a name="530"><span class="lineNum"> 530 </span> : : </a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineCov"> 6 : static int do_clear_i(struct gard_ctx *ctx, int pos, struct gard_record *gard, void *priv)</span></a>
+<a name="535"><span class="lineNum"> 535 </span> : : {</a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineCov"> 6 : int largest, rc = 0;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineCov"> 6 : char *buf;</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineCov"> 6 : struct gard_record null_gard;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : </a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 6 : if (!gard || !ctx || !priv)</span></a>
+<a name="541"><span class="lineNum"> 541 </span> : : return -1;</a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> : : /* Not this one */</a>
+<a name="544"><span class="lineNum"> 544 </span> :<span class="lineCov"> 6 : if (be32toh(gard-&gt;record_id) != *(uint32_t *)priv)</span></a>
+<a name="545"><span class="lineNum"> 545 </span> : : return 0;</a>
+<a name="546"><span class="lineNum"> 546 </span> : : </a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineCov"> 6 : memset(&amp;null_gard, 0xFF, sizeof(null_gard));</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 6 : largest = count_records(ctx);</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : </a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineCov"> 6 : printf(&quot;Clearing gard record 0x%08x...&quot;, be32toh(gard-&gt;record_id));</span></a>
+<a name="552"><span class="lineNum"> 552 </span> : : </a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineCov"> 6 : if (largest &lt; 0 || pos &gt; largest) {</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : /* Something went horribly wrong */</a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;largest index out of range %d\n&quot;, largest);</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="557"><span class="lineNum"> 557 </span> : : }</a>
+<a name="558"><span class="lineNum"> 558 </span> : : </a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 6 : if (pos &lt; largest) {</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : /* We're not clearing the last record, shift all the records up */</a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineCov"> 6 : int buf_len = ((largest - pos) * sizeof(struct gard_record));</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineCov"> 6 : int buf_pos = ctx-&gt;gard_data_pos + ((pos + 1) * sizeof(struct gard_record));</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineCov"> 6 : buf = malloc(buf_len);</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineCov"> 6 : if (!buf)</span></a>
+<a name="565"><span class="lineNum"> 565 </span> : : return -ENOMEM;</a>
+<a name="566"><span class="lineNum"> 566 </span> : : </a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineCov"> 6 : rc = blocklevel_read(ctx-&gt;bl, buf_pos, buf, buf_len);</span></a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineNoCov"> 0 : free(buf);</span></a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't read from flash at 0x%08x for len 0x%08x\n&quot;, buf_pos, buf_len);</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="572"><span class="lineNum"> 572 </span> : : }</a>
+<a name="573"><span class="lineNum"> 573 </span> : : </a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineCov"> 6 : rc = blocklevel_smart_write(ctx-&gt;bl, buf_pos - sizeof(*gard), buf, buf_len);</span></a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineCov"> 6 : free(buf);</span></a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't write to flash at 0x%08x for len 0x%08x\n&quot;,</span></a>
+<a name="578"><span class="lineNum"> 578 </span> : : buf_pos - (int) sizeof(struct gard_record), buf_len);</a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="580"><span class="lineNum"> 580 </span> : : }</a>
+<a name="581"><span class="lineNum"> 581 </span> : : }</a>
+<a name="582"><span class="lineNum"> 582 </span> : : </a>
+<a name="583"><span class="lineNum"> 583 </span> : : /* Now wipe the last record */</a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineCov"> 6 : rc = blocklevel_smart_write(ctx-&gt;bl, ctx-&gt;gard_data_pos + (largest * sizeof(null_gard)),</span></a>
+<a name="585"><span class="lineNum"> 585 </span> : : &amp;null_gard, sizeof(null_gard));</a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 6 : printf(&quot;done\n&quot;);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> : : </a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineCov"> 6 : return rc;</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : }</a>
+<a name="590"><span class="lineNum"> 590 </span> : : </a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineCov"> 4 : static int reset_partition(struct gard_ctx *ctx)</span></a>
+<a name="592"><span class="lineNum"> 592 </span> : : {</a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 4 : int no_ecc_len = (ctx-&gt;gard_data_len / 9) * 8;</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineCov"> 4 : struct gard_record *gard;</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineCov"> 4 : int rc = 0;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : </a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineCov"> 4 : gard = malloc(ctx-&gt;gard_data_len);</span></a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineCov"> 4 : if (!gard) {</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="600"><span class="lineNum"> 600 </span> : : }</a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 4 : memset(gard, 0xFF, ctx-&gt;gard_data_len);</span></a>
+<a name="602"><span class="lineNum"> 602 </span> : : </a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineCov"> 4 : rc = blocklevel_smart_erase(ctx-&gt;bl, ctx-&gt;gard_data_pos, ctx-&gt;gard_data_len);</span></a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't erase the gard partition. Bailing out\n&quot;);</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : }</a>
+<a name="608"><span class="lineNum"> 608 </span> : : </a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineCov"> 4 : rc = blocklevel_write(ctx-&gt;bl, ctx-&gt;gard_data_pos, gard, no_ecc_len);</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineCov"> 4 : if (rc)</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't reset the entire gard partition. Bailing out\n&quot;);</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineCov"> 4 : out:</span></a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 4 : free(gard);</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : }</a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineCov"> 10 : static int do_clear(struct gard_ctx *ctx, int argc, char **argv)</span></a>
+<a name="619"><span class="lineNum"> 619 </span> : : {</a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineCov"> 10 : int rc;</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineCov"> 10 : uint32_t id;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineCov"> 10 : if (argc != 2) {</span></a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;%s option requires a GARD record or 'all'\n&quot;, argv[0]);</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="626"><span class="lineNum"> 626 </span> : : }</a>
+<a name="627"><span class="lineNum"> 627 </span> : : </a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineCov"> 10 : if (strncmp(argv[1], &quot;all&quot;, strlen(&quot;all&quot;)) == 0) {</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 4 : printf(&quot;Clearing the entire gard partition...&quot;);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 4 : fflush(stdout);</span></a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 4 : rc = reset_partition(ctx);</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 4 : printf(&quot;done\n&quot;);</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : } else {</a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 6 : id = strtoul(argv[1], NULL, 16);</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineCov"> 6 : rc = do_iterate(ctx, do_clear_i, &amp;id);</span></a>
+<a name="636"><span class="lineNum"> 636 </span> : : }</a>
+<a name="637"><span class="lineNum"> 637 </span> : : </a>
+<a name="638"><span class="lineNum"> 638 </span> : : return rc;</a>
+<a name="639"><span class="lineNum"> 639 </span> : : }</a>
+<a name="640"><span class="lineNum"> 640 </span> : : </a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineCov"> 18 : static int do_create(struct gard_ctx *ctx, int argc, char **argv)</span></a>
+<a name="642"><span class="lineNum"> 642 </span> : : {</a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 18 : int rc, pos, max_id = 0, last_pos = 0;</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineCov"> 18 : struct gard_record gard;</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 18 : struct entity_path path;</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : </a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 18 : if (argc &lt; 2) {</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;create requires path to gard\n&quot;);</span></a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;e.g.\n&quot;);</span></a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot; /Sys0/Node0/Proc0\n&quot;);</span></a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot; /Sys0/Node0/DIMM15\n&quot;);</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : }</a>
+<a name="654"><span class="lineNum"> 654 </span> : : </a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineCov"> 18 : if (parse_path(argv[1], &amp;path)) {</span></a>
+<a name="656"><span class="lineNum"> 656 </span> :<span class="lineCov"> 8 : fprintf(stderr, &quot;Unable to parse path\n&quot;);</span></a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 8 : return -1;</span></a>
+<a name="658"><span class="lineNum"> 658 </span> : : }</a>
+<a name="659"><span class="lineNum"> 659 </span> : : </a>
+<a name="660"><span class="lineNum"> 660 </span> : : /* check if we already have a gard record applied to this path */</a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 14 : for_each_gard(ctx, pos, &amp;gard, &amp;rc) {</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 6 : if (!memcmp(&amp;path, &amp;gard.target_id, sizeof(path))) {</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 2 : fprintf(stderr,</span></a>
+<a name="664"><span class="lineNum"> 664 </span> : : &quot;Unit %s is already GARDed by record %#08x\n&quot;,</a>
+<a name="665"><span class="lineNum"> 665 </span> : : argv[1], be32toh(gard.record_id));</a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineCov"> 2 : return -1;</span></a>
+<a name="667"><span class="lineNum"> 667 </span> : : }</a>
+<a name="668"><span class="lineNum"> 668 </span> : : </a>
+<a name="669"><span class="lineNum"> 669 </span> : : /*</a>
+<a name="670"><span class="lineNum"> 670 </span> : : * Keep track of the largest record ID seen so far,</a>
+<a name="671"><span class="lineNum"> 671 </span> : : * we'll give the new record the max + 1 to ensure</a>
+<a name="672"><span class="lineNum"> 672 </span> : : * that it's unique</a>
+<a name="673"><span class="lineNum"> 673 </span> : : */</a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineCov"> 4 : if (be32toh(gard.record_id) &gt; max_id)</span></a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineCov"> 4 : max_id = be32toh(gard.record_id);</span></a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineCov"> 4 : last_pos++;</span></a>
+<a name="678"><span class="lineNum"> 678 </span> : : }</a>
+<a name="679"><span class="lineNum"> 679 </span> : : </a>
+<a name="680"><span class="lineNum"> 680 </span> : : /* do we have an empty record to write into? */</a>
+<a name="681"><span class="lineNum"> 681 </span> :<span class="lineCov"> 8 : if (!rc &amp;&amp; !is_valid_record(&amp;gard)) {</span></a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 8 : int offset = last_pos * sizeof(gard);</span></a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineCov"> 8 : memset(&amp;gard, 0xff, sizeof(gard));</span></a>
+<a name="685"><span class="lineNum"> 685 </span> : : </a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineCov"> 8 : gard.record_id = be32toh(max_id + 1);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 8 : gard.error_type = GARD_MANUAL;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineCov"> 8 : gard.target_id = path;</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineCov"> 8 : gard.errlog_eid = 0x0;</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : </a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineCov"> 8 : if (offset &gt; ctx-&gt;gard_data_len - sizeof(gard)) {</span></a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;No space in GUARD for a new record\n&quot;);</span></a>
+<a name="693"><span class="lineNum"> 693 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="694"><span class="lineNum"> 694 </span> : : }</a>
+<a name="695"><span class="lineNum"> 695 </span> : : </a>
+<a name="696"><span class="lineNum"> 696 </span> :<span class="lineCov"> 8 : rc = blocklevel_smart_write(ctx-&gt;bl,</span></a>
+<a name="697"><span class="lineNum"> 697 </span> :<span class="lineCov"> 8 : ctx-&gt;gard_data_pos + offset, &amp;gard, sizeof(gard));</span></a>
+<a name="698"><span class="lineNum"> 698 </span> : : }</a>
+<a name="699"><span class="lineNum"> 699 </span> : : </a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 8 : return rc;</span></a>
+<a name="701"><span class="lineNum"> 701 </span> : : }</a>
+<a name="702"><span class="lineNum"> 702 </span> : : </a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 46 : static int check_gard_partition(struct gard_ctx *ctx)</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : {</a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineCov"> 46 : int rc;</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 46 : struct gard_record gard;</span></a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineCov"> 46 : char msg[2];</span></a>
+<a name="708"><span class="lineNum"> 708 </span> : : </a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineCov"> 46 : if (ctx-&gt;gard_data_len == 0 || ctx-&gt;gard_data_len % sizeof(struct gard_record) != 0)</span></a>
+<a name="710"><span class="lineNum"> 710 </span> : : /* Just warn for now */</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;The %s partition doesn't appear to be an exact multiple of&quot;</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : &quot;gard records in size: %zd vs %u (or partition is zero in length)\n&quot;,</a>
+<a name="713"><span class="lineNum"> 713 </span> : : FLASH_GARD_PART, sizeof(struct gard_record), ctx-&gt;gard_data_len);</a>
+<a name="714"><span class="lineNum"> 714 </span> : : </a>
+<a name="715"><span class="lineNum"> 715 </span> : : /*</a>
+<a name="716"><span class="lineNum"> 716 </span> : : * Attempt to read the first record, nothing can really operate if the</a>
+<a name="717"><span class="lineNum"> 717 </span> : : * first record is dead. There (currently) isn't a way to validate more</a>
+<a name="718"><span class="lineNum"> 718 </span> : : * than ECC correctness.</a>
+<a name="719"><span class="lineNum"> 719 </span> : : */</a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 46 : rc = blocklevel_read(ctx-&gt;bl, ctx-&gt;gard_data_pos, &amp;gard, sizeof(gard));</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 46 : if (rc == FLASH_ERR_ECC_INVALID) {</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;The data at the GUARD partition does not appear to be valid gard data\n&quot;);</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Clear the entire GUARD partition? [y/N]\n&quot;);</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : if (fgets(msg, sizeof(msg), stdin) == NULL) {</span></a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't read from standard input\n&quot;);</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : }</a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : if (msg[0] == 'y') {</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : rc = reset_partition(ctx);</span></a>
+<a name="730"><span class="lineNum"> 730 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't reset the GUARD partition. Bailing out\n&quot;);</span></a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="733"><span class="lineNum"> 733 </span> : : }</a>
+<a name="734"><span class="lineNum"> 734 </span> : : }</a>
+<a name="735"><span class="lineNum"> 735 </span> : : /*</a>
+<a name="736"><span class="lineNum"> 736 </span> : : * else leave rc as is so that the main bails out, not going to be</a>
+<a name="737"><span class="lineNum"> 737 </span> : : * able to do sensible anyway</a>
+<a name="738"><span class="lineNum"> 738 </span> : : */</a>
+<a name="739"><span class="lineNum"> 739 </span> : : }</a>
+<a name="740"><span class="lineNum"> 740 </span> : : return rc;</a>
+<a name="741"><span class="lineNum"> 741 </span> : : }</a>
+<a name="742"><span class="lineNum"> 742 </span> : : </a>
+<a name="743"><span class="lineNum"> 743 </span> : : __attribute__ ((unused))</a>
+<a name="744"><span class="lineNum"> 744 </span> : : static int do_nop(struct gard_ctx *ctx, int argc, char **argv)</a>
+<a name="745"><span class="lineNum"> 745 </span> : : {</a>
+<a name="746"><span class="lineNum"> 746 </span> : : (void)ctx;</a>
+<a name="747"><span class="lineNum"> 747 </span> : : (void)argc;</a>
+<a name="748"><span class="lineNum"> 748 </span> : : fprintf(stderr, &quot;Unimplemented action '%s'\n&quot;, argv[0]);</a>
+<a name="749"><span class="lineNum"> 749 </span> : : return EXIT_SUCCESS;</a>
+<a name="750"><span class="lineNum"> 750 </span> : : }</a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> : : struct {</a>
+<a name="753"><span class="lineNum"> 753 </span> : : const char *name;</a>
+<a name="754"><span class="lineNum"> 754 </span> : : const char *desc;</a>
+<a name="755"><span class="lineNum"> 755 </span> : : int (*fn)(struct gard_ctx *, int, char **);</a>
+<a name="756"><span class="lineNum"> 756 </span> : : } actions[] = {</a>
+<a name="757"><span class="lineNum"> 757 </span> : : { &quot;list&quot;, &quot;List current GARD records&quot;, do_list },</a>
+<a name="758"><span class="lineNum"> 758 </span> : : { &quot;show&quot;, &quot;Show details of a GARD record&quot;, do_show },</a>
+<a name="759"><span class="lineNum"> 759 </span> : : { &quot;clear&quot;, &quot;Clear GARD records&quot;, do_clear },</a>
+<a name="760"><span class="lineNum"> 760 </span> : : { &quot;create&quot;, &quot;Create a GARD record&quot;, do_create },</a>
+<a name="761"><span class="lineNum"> 761 </span> : : };</a>
+<a name="762"><span class="lineNum"> 762 </span> : : </a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 2 : static void print_version(void)</span></a>
+<a name="764"><span class="lineNum"> 764 </span> : : {</a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineCov"> 2 : printf(&quot;Open-Power GARD tool %s\n&quot;, version);</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : }</a>
+<a name="767"><span class="lineNum"> 767 </span> : : </a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineCov"> 2 : static void usage(const char *progname)</span></a>
+<a name="769"><span class="lineNum"> 769 </span> : : {</a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineCov"> 2 : unsigned int i;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : </a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineCov"> 2 : print_version();</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;Usage: %s [-a -e -f &lt;file&gt; -p] &lt;command&gt; [&lt;args&gt;]\n\n&quot;,</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : progname);</a>
+<a name="775"><span class="lineNum"> 775 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;-8 --p8\n&quot;);</span></a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;-9 --p9\n\tSet the processor generation\n\n&quot;);</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;-e --ecc\n\tForce reading/writing with ECC bytes.\n\n&quot;);</span></a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;-f --file &lt;file&gt;\n\tDon't search for MTD device,&quot;</span></a>
+<a name="779"><span class="lineNum"> 779 </span> : : &quot; read from &lt;file&gt;.\n\n&quot;);</a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;-p --part\n\tUsed in conjunction with -f to specify&quot;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : &quot; that just\n&quot;);</a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;\tthe GUARD partition is in &lt;file&gt; and libffs\n&quot;);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;\tshouldn't be used.\n\n&quot;);</span></a>
+<a name="784"><span class="lineNum"> 784 </span> : : </a>
+<a name="785"><span class="lineNum"> 785 </span> : : </a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineCov"> 2 : fprintf(stderr, &quot;Where &lt;command&gt; is one of:\n\n&quot;);</span></a>
+<a name="787"><span class="lineNum"> 787 </span> : : </a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineCov"> 12 : for (i = 0; i &lt; ARRAY_SIZE(actions); i++) {</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 8 : fprintf(stderr, &quot;\t%-7s\t%s\n&quot;,</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : actions[i].name, actions[i].desc);</a>
+<a name="791"><span class="lineNum"> 791 </span> : : }</a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : </a>
+<a name="794"><span class="lineNum"> 794 </span> :<span class="lineCov"> 48 : static bool is_fsp(void)</span></a>
+<a name="795"><span class="lineNum"> 795 </span> : : {</a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineCov"> 48 : return access(FDT_FSP_NODE, F_OK) == 0;</span></a>
+<a name="797"><span class="lineNum"> 797 </span> : : }</a>
+<a name="798"><span class="lineNum"> 798 </span> : : </a>
+<a name="799"><span class="lineNum"> 799 </span> : : static struct option global_options[] = {</a>
+<a name="800"><span class="lineNum"> 800 </span> : : { &quot;file&quot;, required_argument, 0, 'f' },</a>
+<a name="801"><span class="lineNum"> 801 </span> : : { &quot;part&quot;, no_argument, 0, 'p' },</a>
+<a name="802"><span class="lineNum"> 802 </span> : : { &quot;ecc&quot;, no_argument, 0, 'e' },</a>
+<a name="803"><span class="lineNum"> 803 </span> : : { &quot;p8&quot;, no_argument, 0, '8' },</a>
+<a name="804"><span class="lineNum"> 804 </span> : : { &quot;p9&quot;, no_argument, 0, '9' },</a>
+<a name="805"><span class="lineNum"> 805 </span> : : { 0 },</a>
+<a name="806"><span class="lineNum"> 806 </span> : : };</a>
+<a name="807"><span class="lineNum"> 807 </span> : : static const char *global_optstring = &quot;+ef:p89&quot;;</a>
+<a name="808"><span class="lineNum"> 808 </span> : : </a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineCov"> 48 : int main(int argc, char **argv)</span></a>
+<a name="810"><span class="lineNum"> 810 </span> : : {</a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineCov"> 48 : const char *action, *progname;</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineCov"> 48 : char *filename = NULL;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineCov"> 48 : struct gard_ctx _ctx, *ctx;</span></a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineCov"> 48 : uint64_t bl_size;</span></a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineCov"> 48 : int rc, i = 0;</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineCov"> 48 : bool part = 0;</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 48 : bool ecc = 0;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> : : </a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineCov"> 48 : progname = argv[0];</span></a>
+<a name="820"><span class="lineNum"> 820 </span> : : </a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 48 : ctx = &amp;_ctx;</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineCov"> 48 : memset(ctx, 0, sizeof(*ctx));</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineCov"> 48 : memset(&amp;blank_record, 0xff, sizeof(blank_record));</span></a>
+<a name="824"><span class="lineNum"> 824 </span> : : </a>
+<a name="825"><span class="lineNum"> 825 </span> : : /* process global options */</a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineCov"> 202 : for (;;) {</span></a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineCov"> 202 : int c;</span></a>
+<a name="828"><span class="lineNum"> 828 </span> : : </a>
+<a name="829"><span class="lineNum"> 829 </span> :<span class="lineCov"> 202 : c = getopt_long(argc, argv, global_optstring, global_options,</span></a>
+<a name="830"><span class="lineNum"> 830 </span> : : NULL);</a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineCov"> 202 : if (c == -1)</span></a>
+<a name="832"><span class="lineNum"> 832 </span> : : break;</a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineCov"> 154 : switch (c) {</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineCov"> 46 : case 'e':</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 46 : ecc = true;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineCov"> 46 : break;</span></a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineCov"> 46 : case 'f':</span></a>
+<a name="838"><span class="lineNum"> 838 </span> : : /* If they specify -f twice */</a>
+<a name="839"><span class="lineNum"> 839 </span> :<span class="lineCov"> 46 : free(filename);</span></a>
+<a name="840"><span class="lineNum"> 840 </span> : : </a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 46 : filename = strdup(optarg);</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineCov"> 46 : if (!filename) {</span></a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Out of memory\n&quot;);</span></a>
+<a name="844"><span class="lineNum"> 844 </span> :<span class="lineNoCov"> 0 : return EXIT_FAILURE;</span></a>
+<a name="845"><span class="lineNum"> 845 </span> : : }</a>
+<a name="846"><span class="lineNum"> 846 </span> : : break;</a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineCov"> 46 : case 'p':</span></a>
+<a name="848"><span class="lineNum"> 848 </span> :<span class="lineCov"> 46 : part = true;</span></a>
+<a name="849"><span class="lineNum"> 849 </span> :<span class="lineCov"> 46 : break;</span></a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineCov"> 10 : case '8':</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineCov"> 10 : set_chip_gen(p8_chip_units);</span></a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineCov"> 10 : break;</span></a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineCov"> 6 : case '9':</span></a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineCov"> 6 : set_chip_gen(p9_chip_units);</span></a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="856"><span class="lineNum"> 856 </span> :<span class="lineNoCov"> 0 : case '?':</span></a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : usage(progname);</span></a>
+<a name="858"><span class="lineNum"> 858 </span> :<span class="lineNoCov"> 0 : rc = EXIT_FAILURE;</span></a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="860"><span class="lineNum"> 860 </span> : : }</a>
+<a name="861"><span class="lineNum"> 861 </span> : : }</a>
+<a name="862"><span class="lineNum"> 862 </span> : : </a>
+<a name="863"><span class="lineNum"> 863 </span> : : </a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineCov"> 48 : if (is_fsp() &amp;&amp; !filename) {</span></a>
+<a name="865"><span class="lineNum"> 865 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;This is the OpenPower gard tool which does &quot;</span></a>
+<a name="866"><span class="lineNum"> 866 </span> : : &quot;not support FSP systems\n&quot;);</a>
+<a name="867"><span class="lineNum"> 867 </span> :<span class="lineNoCov"> 0 : return EXIT_FAILURE;</span></a>
+<a name="868"><span class="lineNum"> 868 </span> : : }</a>
+<a name="869"><span class="lineNum"> 869 </span> : : </a>
+<a name="870"><span class="lineNum"> 870 </span> : : </a>
+<a name="871"><span class="lineNum"> 871 </span> : : /*</a>
+<a name="872"><span class="lineNum"> 872 </span> : : * It doesn't make sense to specify that we have the gard partition but</a>
+<a name="873"><span class="lineNum"> 873 </span> : : * read from flash</a>
+<a name="874"><span class="lineNum"> 874 </span> : : */</a>
+<a name="875"><span class="lineNum"> 875 </span> :<span class="lineCov"> 48 : if (part &amp;&amp; !filename) {</span></a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineNoCov"> 0 : usage(progname);</span></a>
+<a name="877"><span class="lineNum"> 877 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;-p only makes sense when used with -f!\n&quot;);</span></a>
+<a name="878"><span class="lineNum"> 878 </span> :<span class="lineNoCov"> 0 : return EXIT_FAILURE;</span></a>
+<a name="879"><span class="lineNum"> 879 </span> : : }</a>
+<a name="880"><span class="lineNum"> 880 </span> : : </a>
+<a name="881"><span class="lineNum"> 881 </span> : : /* do we have a command? */</a>
+<a name="882"><span class="lineNum"> 882 </span> :<span class="lineCov"> 48 : if (optind == argc) {</span></a>
+<a name="883"><span class="lineNum"> 883 </span> :<span class="lineCov"> 2 : usage(progname);</span></a>
+<a name="884"><span class="lineNum"> 884 </span> :<span class="lineCov"> 2 : rc = EXIT_FAILURE;</span></a>
+<a name="885"><span class="lineNum"> 885 </span> :<span class="lineCov"> 2 : goto out_free;</span></a>
+<a name="886"><span class="lineNum"> 886 </span> : : }</a>
+<a name="887"><span class="lineNum"> 887 </span> : : </a>
+<a name="888"><span class="lineNum"> 888 </span> :<span class="lineCov"> 46 : argc -= optind;</span></a>
+<a name="889"><span class="lineNum"> 889 </span> :<span class="lineCov"> 46 : argv += optind;</span></a>
+<a name="890"><span class="lineNum"> 890 </span> :<span class="lineCov"> 46 : action = argv[0];</span></a>
+<a name="891"><span class="lineNum"> 891 </span> : : </a>
+<a name="892"><span class="lineNum"> 892 </span> : : #ifdef __arm__</a>
+<a name="893"><span class="lineNum"> 893 </span> : : /*</a>
+<a name="894"><span class="lineNum"> 894 </span> : : * HACK: Look for a vPNOR GUARD file if we haven't been given anything</a>
+<a name="895"><span class="lineNum"> 895 </span> : : * explitly. If it exists then we can safely assume that:</a>
+<a name="896"><span class="lineNum"> 896 </span> : : * a) The host is a P9</a>
+<a name="897"><span class="lineNum"> 897 </span> : : * b) The file is ECC protected</a>
+<a name="898"><span class="lineNum"> 898 </span> : : * c) The file is a bare partition.</a>
+<a name="899"><span class="lineNum"> 899 </span> : : *</a>
+<a name="900"><span class="lineNum"> 900 </span> : : * This is a stupid hack, but there's not other sane place for it.</a>
+<a name="901"><span class="lineNum"> 901 </span> : : * arch_init_flash() always looks for a FFS formatted PNOR when</a>
+<a name="902"><span class="lineNum"> 902 </span> : : * filename is NULL</a>
+<a name="903"><span class="lineNum"> 903 </span> : : */</a>
+<a name="904"><span class="lineNum"> 904 </span> : : if (!filename) {</a>
+<a name="905"><span class="lineNum"> 905 </span> : : struct stat buf;</a>
+<a name="906"><span class="lineNum"> 906 </span> : : </a>
+<a name="907"><span class="lineNum"> 907 </span> : : if (!stat(VPNOR_GARD_FILE, &amp;buf)) {</a>
+<a name="908"><span class="lineNum"> 908 </span> : : filename = strdup(VPNOR_GARD_FILE);</a>
+<a name="909"><span class="lineNum"> 909 </span> : : /* BUG: This ignores the command line settings */</a>
+<a name="910"><span class="lineNum"> 910 </span> : : part = true;</a>
+<a name="911"><span class="lineNum"> 911 </span> : : ecc = true;</a>
+<a name="912"><span class="lineNum"> 912 </span> : : } else if (!stat(VPNOR_GARD_DIR, &amp;buf)) {</a>
+<a name="913"><span class="lineNum"> 913 </span> : : printf(VPNOR_GARD_FILE&quot; is missing. Nothing to do\n&quot;);</a>
+<a name="914"><span class="lineNum"> 914 </span> : : return 0;</a>
+<a name="915"><span class="lineNum"> 915 </span> : : }</a>
+<a name="916"><span class="lineNum"> 916 </span> : : }</a>
+<a name="917"><span class="lineNum"> 917 </span> : : #endif</a>
+<a name="918"><span class="lineNum"> 918 </span> : : </a>
+<a name="919"><span class="lineNum"> 919 </span> :<span class="lineCov"> 46 : if (!chip_units)</span></a>
+<a name="920"><span class="lineNum"> 920 </span> :<span class="lineCov"> 30 : guess_chip_gen();</span></a>
+<a name="921"><span class="lineNum"> 921 </span> : : </a>
+<a name="922"><span class="lineNum"> 922 </span> : : /*</a>
+<a name="923"><span class="lineNum"> 923 </span> : : * Force libflash to do flash accesses via the MTD. Direct mode is</a>
+<a name="924"><span class="lineNum"> 924 </span> : : * generally unsafe since it fiddles with the flash controller state</a>
+<a name="925"><span class="lineNum"> 925 </span> : : * underneath the kernel. Anyone who needs direct mode can use pflash</a>
+<a name="926"><span class="lineNum"> 926 </span> : : * instead.</a>
+<a name="927"><span class="lineNum"> 927 </span> : : */</a>
+<a name="928"><span class="lineNum"> 928 </span> :<span class="lineCov"> 46 : arch_flash_access(ctx-&gt;bl, PNOR_MTD);</span></a>
+<a name="929"><span class="lineNum"> 929 </span> : : </a>
+<a name="930"><span class="lineNum"> 930 </span> :<span class="lineCov"> 46 : if (arch_flash_init(&amp;(ctx-&gt;bl), filename, true)) {</span></a>
+<a name="931"><span class="lineNum"> 931 </span> : : /* Can fail for a few ways, most likely couldn't open MTD device */</a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Can't open %s\n&quot;, filename ? filename : &quot;MTD Device. Are you root?&quot;);</span></a>
+<a name="933"><span class="lineNum"> 933 </span> :<span class="lineNoCov"> 0 : rc = EXIT_FAILURE;</span></a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="935"><span class="lineNum"> 935 </span> : : }</a>
+<a name="936"><span class="lineNum"> 936 </span> : : </a>
+<a name="937"><span class="lineNum"> 937 </span> :<span class="lineCov"> 46 : rc = blocklevel_get_info(ctx-&gt;bl, NULL, &amp;bl_size, NULL);</span></a>
+<a name="938"><span class="lineNum"> 938 </span> :<span class="lineCov"> 46 : if (rc)</span></a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="940"><span class="lineNum"> 940 </span> : : </a>
+<a name="941"><span class="lineNum"> 941 </span> :<span class="lineCov"> 46 : if (bl_size &gt; UINT_MAX) {</span></a>
+<a name="942"><span class="lineNum"> 942 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;MTD device bigger than %i: size: %&quot; PRIu64 &quot;\n&quot;,</span></a>
+<a name="943"><span class="lineNum"> 943 </span> : : UINT_MAX, bl_size);</a>
+<a name="944"><span class="lineNum"> 944 </span> :<span class="lineNoCov"> 0 : rc = EXIT_FAILURE;</span></a>
+<a name="945"><span class="lineNum"> 945 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="946"><span class="lineNum"> 946 </span> : : }</a>
+<a name="947"><span class="lineNum"> 947 </span> :<span class="lineCov"> 46 : ctx-&gt;f_size = bl_size;</span></a>
+<a name="948"><span class="lineNum"> 948 </span> : : </a>
+<a name="949"><span class="lineNum"> 949 </span> :<span class="lineCov"> 46 : if (!part) {</span></a>
+<a name="950"><span class="lineNum"> 950 </span> :<span class="lineNoCov"> 0 : rc = ffs_init(0, ctx-&gt;f_size, ctx-&gt;bl, &amp;ctx-&gt;ffs, 1);</span></a>
+<a name="951"><span class="lineNum"> 951 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="952"><span class="lineNum"> 952 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="953"><span class="lineNum"> 953 </span> : : </a>
+<a name="954"><span class="lineNum"> 954 </span> :<span class="lineNoCov"> 0 : rc = ffs_lookup_part(ctx-&gt;ffs, FLASH_GARD_PART, &amp;ctx-&gt;gard_part_idx);</span></a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="956"><span class="lineNum"> 956 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="957"><span class="lineNum"> 957 </span> : : </a>
+<a name="958"><span class="lineNum"> 958 </span> :<span class="lineNoCov"> 0 : rc = ffs_part_info(ctx-&gt;ffs, ctx-&gt;gard_part_idx, NULL, &amp;(ctx-&gt;gard_data_pos),</span></a>
+<a name="959"><span class="lineNum"> 959 </span> : : &amp;(ctx-&gt;gard_data_len), NULL, NULL);</a>
+<a name="960"><span class="lineNum"> 960 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="961"><span class="lineNum"> 961 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="962"><span class="lineNum"> 962 </span> : : } else {</a>
+<a name="963"><span class="lineNum"> 963 </span> :<span class="lineCov"> 46 : if (ecc) {</span></a>
+<a name="964"><span class="lineNum"> 964 </span> :<span class="lineCov"> 46 : rc = blocklevel_ecc_protect(ctx-&gt;bl, 0, ctx-&gt;f_size);</span></a>
+<a name="965"><span class="lineNum"> 965 </span> :<span class="lineCov"> 46 : if (rc)</span></a>
+<a name="966"><span class="lineNum"> 966 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="967"><span class="lineNum"> 967 </span> : : }</a>
+<a name="968"><span class="lineNum"> 968 </span> : : </a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineCov"> 46 : ctx-&gt;gard_data_pos = 0;</span></a>
+<a name="970"><span class="lineNum"> 970 </span> :<span class="lineCov"> 46 : ctx-&gt;gard_data_len = ctx-&gt;f_size;</span></a>
+<a name="971"><span class="lineNum"> 971 </span> : : }</a>
+<a name="972"><span class="lineNum"> 972 </span> : : </a>
+<a name="973"><span class="lineNum"> 973 </span> :<span class="lineCov"> 46 : rc = check_gard_partition(ctx);</span></a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 46 : if (rc) {</span></a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Does not appear to be sane gard data\n&quot;);</span></a>
+<a name="976"><span class="lineNum"> 976 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="977"><span class="lineNum"> 977 </span> : : }</a>
+<a name="978"><span class="lineNum"> 978 </span> : : </a>
+<a name="979"><span class="lineNum"> 979 </span> :<span class="lineCov"> 124 : for (i = 0; i &lt; ARRAY_SIZE(actions); i++) {</span></a>
+<a name="980"><span class="lineNum"> 980 </span> :<span class="lineCov"> 124 : if (!strcmp(actions[i].name, action)) {</span></a>
+<a name="981"><span class="lineNum"> 981 </span> :<span class="lineCov"> 46 : rc = actions[i].fn(ctx, argc, argv);</span></a>
+<a name="982"><span class="lineNum"> 982 </span> :<span class="lineCov"> 46 : break;</span></a>
+<a name="983"><span class="lineNum"> 983 </span> : : }</a>
+<a name="984"><span class="lineNum"> 984 </span> : : }</a>
+<a name="985"><span class="lineNum"> 985 </span> : : </a>
+<a name="986"><span class="lineNum"> 986 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="987"><span class="lineNum"> 987 </span> :<span class="lineCov"> 46 : if (ctx-&gt;ffs)</span></a>
+<a name="988"><span class="lineNum"> 988 </span> :<span class="lineNoCov"> 0 : ffs_close(ctx-&gt;ffs);</span></a>
+<a name="989"><span class="lineNum"> 989 </span> : : </a>
+<a name="990"><span class="lineNum"> 990 </span> :<span class="lineCov"> 46 : file_exit_close(ctx-&gt;bl);</span></a>
+<a name="991"><span class="lineNum"> 991 </span> : : </a>
+<a name="992"><span class="lineNum"> 992 </span> :<span class="lineCov"> 46 : if (i == ARRAY_SIZE(actions)) {</span></a>
+<a name="993"><span class="lineNum"> 993 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;%s: '%s' isn't a valid command\n&quot;, progname, action);</span></a>
+<a name="994"><span class="lineNum"> 994 </span> :<span class="lineNoCov"> 0 : usage(progname);</span></a>
+<a name="995"><span class="lineNum"> 995 </span> :<span class="lineNoCov"> 0 : rc = EXIT_FAILURE;</span></a>
+<a name="996"><span class="lineNum"> 996 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="997"><span class="lineNum"> 997 </span> : : }</a>
+<a name="998"><span class="lineNum"> 998 </span> : : </a>
+<a name="999"><span class="lineNum"> 999 </span> :<span class="lineCov"> 46 : if (rc &gt; 0) {</span></a>
+<a name="1000"><span class="lineNum"> 1000 </span> :<span class="lineNoCov"> 0 : show_flash_err(rc);</span></a>
+<a name="1001"><span class="lineNum"> 1001 </span> :<span class="lineNoCov"> 0 : if (filename &amp;&amp; rc == FFS_ERR_BAD_MAGIC)</span></a>
+<a name="1002"><span class="lineNum"> 1002 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Maybe you didn't give a full flash image file?\nDid you mean '--part'?\n&quot;);</span></a>
+<a name="1003"><span class="lineNum"> 1003 </span> : : }</a>
+<a name="1004"><span class="lineNum"> 1004 </span> : : </a>
+<a name="1005"><span class="lineNum"> 1005 </span> :<span class="lineCov"> 46 : out_free:</span></a>
+<a name="1006"><span class="lineNum"> 1006 </span> :<span class="lineCov"> 48 : free(filename);</span></a>
+<a name="1007"><span class="lineNum"> 1007 </span> :<span class="lineCov"> 48 : return rc;</span></a>
+<a name="1008"><span class="lineNum"> 1008 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/index-sort-b.html b/coverage-report/external/gard/index-sort-b.html
new file mode 100644
index 0000000..60b292d
--- /dev/null
+++ b/coverage-report/external/gard/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/gard</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">326</td>
+ <td class="headerCovTableEntry">468</td>
+ <td class="headerCovTableEntryLo">69.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntryHi">95.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="gard.c.gcov.html">gard.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="69.7%"><img src="../../snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/index-sort-f.html b/coverage-report/external/gard/index-sort-f.html
new file mode 100644
index 0000000..9eb1b23
--- /dev/null
+++ b/coverage-report/external/gard/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/gard</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">326</td>
+ <td class="headerCovTableEntry">468</td>
+ <td class="headerCovTableEntryLo">69.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntryHi">95.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="gard.c.gcov.html">gard.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="69.7%"><img src="../../snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/index-sort-l.html b/coverage-report/external/gard/index-sort-l.html
new file mode 100644
index 0000000..90b57cb
--- /dev/null
+++ b/coverage-report/external/gard/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/gard</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">326</td>
+ <td class="headerCovTableEntry">468</td>
+ <td class="headerCovTableEntryLo">69.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntryHi">95.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="gard.c.gcov.html">gard.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="69.7%"><img src="../../snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/index.html b/coverage-report/external/gard/index.html
new file mode 100644
index 0000000..969ebcf
--- /dev/null
+++ b/coverage-report/external/gard/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/gard</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">326</td>
+ <td class="headerCovTableEntry">468</td>
+ <td class="headerCovTableEntryLo">69.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntryHi">95.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="gard.c.gcov.html">gard.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=70 height=10 alt="69.7%"><img src="../../snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/blocklevel.c.func-sort-c.html b/coverage-report/external/gard/libflash/blocklevel.c.func-sort-c.html
new file mode 100644
index 0000000..48926e5
--- /dev/null
+++ b/coverage-report/external/gard/libflash/blocklevel.c.func-sort-c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">155</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">40.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="blocklevel.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">101</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/blocklevel.c.func.html b/coverage-report/external/gard/libflash/blocklevel.c.func.html
new file mode 100644
index 0000000..1a70683
--- /dev/null
+++ b/coverage-report/external/gard/libflash/blocklevel.c.func.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">155</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">40.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="blocklevel.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">101</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">126</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/blocklevel.c.gcov.html b/coverage-report/external/gard/libflash/blocklevel.c.gcov.html
new file mode 100644
index 0000000..253b3a7
--- /dev/null
+++ b/coverage-report/external/gard/libflash/blocklevel.c.gcov.html
@@ -0,0 +1,826 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/blocklevel.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (source / <a href="blocklevel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">155</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">40.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;errno.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;libflash/errors.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define PROT_REALLOC_NUM 25</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* This function returns tristate values.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * 1 - The region is ECC protected</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * 0 - The region is not ECC protected</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * -1 - Partially protected</a>
+<a name="24"><span class="lineNum"> 24 </span> : : */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 101 : static int ecc_protected(struct blocklevel_device *bl, uint64_t pos, uint64_t len, uint64_t *start)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : {</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 101 : int i;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Length of 0 is nonsensical so add 1 */</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 101 : if (len == 0)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : len = 1;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 101 : for (i = 0; i &lt; bl-&gt;ecc_prot.n_prot; i++) {</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* Fits entirely within the range */</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 101 : if (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 101 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt;= pos + len) {</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 101 : if (start)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 101 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 101 : return 1;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /*</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Even if ranges are merged we can't currently guarantee two</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * contiguous regions are sanely ECC protected so a partial fit</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * is no good.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : if ((bl-&gt;ecc_prot.prot[i].start &gt;= pos &amp;&amp; bl-&gt;ecc_prot.prot[i].start &lt; pos + len) ||</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt; pos)) {</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : if (start)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : return 0;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 101 : static uint64_t with_ecc_pos(uint64_t ecc_start, uint64_t pos)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 101 : return pos + ((pos - ecc_start) / (BYTES_PER_ECC));</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 126 : static int reacquire(struct blocklevel_device *bl)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 126 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;reacquire)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : return bl-&gt;reacquire(bl);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : return 0;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 126 : static int release(struct blocklevel_device *bl)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 126 : int rc = 0;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 126 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;release) {</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* This is the error return path a lot, preserve errno */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : int err = errno;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;release(bl);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 126 : return rc;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 89 : int blocklevel_raw_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 89 : int rc;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 89 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 89 : if (!bl || !bl-&gt;read || !buf) {</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 89 : rc = reacquire(bl);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 89 : if (rc)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : return rc;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 89 : rc = bl-&gt;read(bl, pos, buf, len);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 89 : release(bl);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 89 : return rc;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 89 : int blocklevel_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 89 : int rc, ecc_protection;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 89 : struct ecc64 *buffer;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 89 : uint64_t ecc_pos, ecc_start, ecc_diff, ecc_len;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 89 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 89 : if (!bl || !buf) {</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : }</a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 89 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 89 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="119"><span class="lineNum"> 119 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 89 : if (!ecc_protection)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineNoCov"> 0 : return blocklevel_raw_read(bl, pos, buf, len);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /*</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * The region we're reading to has both ecc protection and not.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="127"><span class="lineNum"> 127 </span> : : */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 89 : if (ecc_protection == -1) {</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 89 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 89 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 89 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 89 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 89 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="142"><span class="lineNum"> 142 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 89 : buffer = malloc(ecc_len);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 89 : if (!buffer) {</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 89 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, ecc_len);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 89 : if (rc)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> : : /*</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * Could optimise and simply call memcpy_from_ecc() if ecc_diff</a>
+<a name="156"><span class="lineNum"> 156 </span> : : * == 0 but _unaligned checks and bascially does that for us</a>
+<a name="157"><span class="lineNum"> 157 </span> : : */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 89 : if (memcpy_from_ecc_unaligned(buf, buffer, len, ecc_diff)) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 89 : out:</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 89 : free(buffer);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 89 : return rc;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 12 : int blocklevel_raw_write(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : const void *buf, uint64_t len)</a>
+<a name="170"><span class="lineNum"> 170 </span> : : {</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 12 : int rc;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 12 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 12 : if (!bl || !bl-&gt;write || !buf) {</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 12 : rc = reacquire(bl);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 12 : if (rc)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : return rc;</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 12 : rc = bl-&gt;write(bl, pos, buf, len);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 12 : release(bl);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 12 : return rc;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : }</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 12 : int blocklevel_write(struct blocklevel_device *bl, uint64_t pos, const void *buf,</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : uint64_t len)</a>
+<a name="192"><span class="lineNum"> 192 </span> : : {</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 12 : int rc, ecc_protection;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 12 : struct ecc64 *buffer;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 12 : uint64_t ecc_len;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 12 : uint64_t ecc_start, ecc_pos, ecc_diff;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 12 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 12 : if (!bl || !buf) {</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : }</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 12 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 12 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="208"><span class="lineNum"> 208 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 12 : if (!ecc_protection)</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : return blocklevel_raw_write(bl, pos, buf, len);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /*</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * The region we're writing to has both ecc protection and not.</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="216"><span class="lineNum"> 216 </span> : : */</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 12 : if (ecc_protection == -1) {</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : }</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 12 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 12 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 12 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 12 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 12 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="231"><span class="lineNum"> 231 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 12 : buffer = malloc(ecc_len);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 12 : if (!buffer) {</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 12 : if (ecc_diff) {</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : uint64_t start_chunk = ecc_diff;</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : uint64_t end_chunk = BYTES_PER_ECC - ecc_diff;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : uint64_t end_len = ecc_len - end_chunk;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /*</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * Read the start bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * to calculate the first ecc byte</a>
+<a name="248"><span class="lineNum"> 248 </span> : : */</a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, start_chunk);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> : : /*</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * Read the end bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * to calculate the last ecc byte</a>
+<a name="259"><span class="lineNum"> 259 </span> : : */</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos + end_len, ((char *)buffer) + end_len,</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : end_chunk);</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : if (memcpy_to_ecc_unaligned(buffer, buf, len, ecc_diff)) {</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : } else {</a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 12 : if (memcpy_to_ecc(buffer, buf, len)) {</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : }</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 12 : rc = blocklevel_raw_write(bl, pos, buffer, ecc_len);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : </a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 12 : out:</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 12 : free(buffer);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 12 : return rc;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 2 : int blocklevel_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : {</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 2 : int rc;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 2 : if (!bl || !bl-&gt;erase) {</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 2 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /* Programmer may be making a horrible mistake without knowing it */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 2 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_erase: pos (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : pos, bl-&gt;erase_mask + 1);</a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : }</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 2 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_erase: len (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : len, bl-&gt;erase_mask + 1);</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : }</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 2 : rc = reacquire(bl);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : return rc;</a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 2 : rc = bl-&gt;erase(bl, pos, len);</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 2 : release(bl);</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 2 : return rc;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 23 : int blocklevel_get_info(struct blocklevel_device *bl, const char **name, uint64_t *total_size,</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : uint32_t *erase_granule)</a>
+<a name="323"><span class="lineNum"> 323 </span> : : {</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 23 : int rc;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 23 : if (!bl || !bl-&gt;get_info) {</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : }</a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 23 : rc = reacquire(bl);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 23 : if (rc)</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : return rc;</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 23 : rc = bl-&gt;get_info(bl, name, total_size, erase_granule);</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : </a>
+<a name="337"><span class="lineNum"> 337 </span> : : /* Check the validity of what we are being told */</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 23 : if (erase_granule &amp;&amp; *erase_granule != bl-&gt;erase_mask + 1)</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_get_info: WARNING: erase_granule (0x%08x) and erase_mask&quot;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : &quot; (0x%08x) don't match\n&quot;, *erase_granule, bl-&gt;erase_mask + 1);</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 23 : release(bl);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 23 : return rc;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : }</a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+<a name="347"><span class="lineNum"> 347 </span> : : /*</a>
+<a name="348"><span class="lineNum"> 348 </span> : : * Compare flash and memory to determine if:</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * a) Erase must happen before write</a>
+<a name="350"><span class="lineNum"> 350 </span> : : * b) Flash and memory are identical</a>
+<a name="351"><span class="lineNum"> 351 </span> : : * c) Flash can simply be written to</a>
+<a name="352"><span class="lineNum"> 352 </span> : : *</a>
+<a name="353"><span class="lineNum"> 353 </span> : : * returns -1 for a</a>
+<a name="354"><span class="lineNum"> 354 </span> : : * returns 0 for b</a>
+<a name="355"><span class="lineNum"> 355 </span> : : * returns 1 for c</a>
+<a name="356"><span class="lineNum"> 356 </span> : : */</a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : static int blocklevel_flashcmp(const void *flash_buf, const void *mem_buf, uint64_t len)</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : {</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : uint64_t i;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : int same = true;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : const uint8_t *f_buf, *m_buf;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : f_buf = flash_buf;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : m_buf = mem_buf;</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : if (m_buf[i] &amp; ~f_buf[i])</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : return -1;</a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : if (same &amp;&amp; (m_buf[i] != f_buf[i]))</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : same = false;</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : }</a>
+<a name="372"><span class="lineNum"> 372 </span> : : </a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : return same ? 0 : 1;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : }</a>
+<a name="375"><span class="lineNum"> 375 </span> : : </a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 2 : int blocklevel_smart_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : {</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 2 : uint64_t block_size;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 2 : void *erase_buf;</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 2 : int rc;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> : : </a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 2 : if (!bl) {</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 2 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> : : /* Nothing smart needs to be done, pos and len are aligned */</a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 2 : if ((pos &amp; bl-&gt;erase_mask) == 0 &amp;&amp; (len &amp; bl-&gt;erase_mask) == 0) {</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 2 : FL_DBG(&quot;%s: Skipping smarts everything is aligned 0x%&quot; PRIx64 &quot; 0x%&quot; PRIx64</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : &quot;to 0x%08x\n&quot;, __func__, pos, len, bl-&gt;erase_mask);</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 2 : return blocklevel_erase(bl, pos, len);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : }</a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : block_size = bl-&gt;erase_mask + 1;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : erase_buf = malloc(block_size);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : if (!erase_buf) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : }</a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : }</a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : /*</a>
+<a name="410"><span class="lineNum"> 410 </span> : : * base_pos and base_len are the values in the first erase</a>
+<a name="411"><span class="lineNum"> 411 </span> : : * block that we need to preserve: the region up to pos.</a>
+<a name="412"><span class="lineNum"> 412 </span> : : */</a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : uint64_t base_pos = pos &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : uint64_t base_len = pos - base_pos;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : __func__, base_pos, base_pos + base_len);</a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> : : /*</a>
+<a name="420"><span class="lineNum"> 420 </span> : : * Read the entire block in case this is the ONLY block we're</a>
+<a name="421"><span class="lineNum"> 421 </span> : : * modifying, we may need the end chunk of it later</a>
+<a name="422"><span class="lineNum"> 422 </span> : : */</a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, base_pos, erase_buf, block_size);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, base_pos, block_size);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, base_pos, erase_buf, base_len);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /*</a>
+<a name="436"><span class="lineNum"> 436 </span> : : * The requested erase fits entirely into this erase block and</a>
+<a name="437"><span class="lineNum"> 437 </span> : : * so we need to write back the chunk at the end of the block</a>
+<a name="438"><span class="lineNum"> 438 </span> : : */</a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : if (base_pos + base_len + len &lt; base_pos + block_size) {</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, pos + len, erase_buf + base_len + len,</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : block_size - base_len - len);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: Early exit, everything was in one erase block\n&quot;,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : __func__);</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : pos += block_size - base_len;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : len -= block_size - base_len;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* Now we should be aligned, best to double check */</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s:pos 0x%&quot; PRIx64 &quot; isn't erase_mask 0x%08x aligned\n&quot;,</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : __func__, pos, bl-&gt;erase_mask);</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : }</a>
+<a name="458"><span class="lineNum"> 458 </span> : : </a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : if (len &amp; ~(bl-&gt;erase_mask)) {</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, pos, len &amp; ~(bl-&gt;erase_mask));</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : </a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : pos += len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineNoCov"> 0 : len -= len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : }</a>
+<a name="467"><span class="lineNum"> 467 </span> : : </a>
+<a name="468"><span class="lineNum"> 468 </span> : : /* Length should be less than a block now */</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : if (len &gt; block_size) {</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: len 0x%&quot; PRIx64 &quot; is still exceeds block_size 0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : __func__, len, block_size);</a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : }</a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : /*</a>
+<a name="478"><span class="lineNum"> 478 </span> : : * top_pos is the first byte that must be preserved and</a>
+<a name="479"><span class="lineNum"> 479 </span> : : * top_len is the length from top_pos to the end of the erase</a>
+<a name="480"><span class="lineNum"> 480 </span> : : * block: the region that must be preserved</a>
+<a name="481"><span class="lineNum"> 481 </span> : : */</a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineNoCov"> 0 : uint64_t top_pos = pos + len;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineNoCov"> 0 : uint64_t top_len = block_size - len;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : __func__, top_pos, top_pos + top_len);</a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, pos, block_size);</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> : : </a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="499"><span class="lineNum"> 499 </span> : : }</a>
+<a name="500"><span class="lineNum"> 500 </span> : : </a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 10 : int blocklevel_smart_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len)</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : {</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 10 : void *ecc_buf = NULL;</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 10 : uint64_t ecc_start;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 10 : int ecc_protection;</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 10 : void *erase_buf = NULL;</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 10 : uint32_t erase_size;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : </a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineCov"> 10 : const void *write_buf;</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 10 : uint64_t write_len;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineCov"> 10 : uint64_t write_pos;</span></a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 10 : int rc = 0;</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 10 : if (!buf || !bl) {</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 10 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : </a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 10 : if (!(bl-&gt;flags &amp; WRITE_NEED_ERASE)) {</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 10 : FL_DBG(&quot;%s: backend doesn't need erase\n&quot;, __func__);</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 10 : return blocklevel_write(bl, pos, buf, len);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, NULL, &amp;erase_size);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="536"><span class="lineNum"> 536 </span> : : return rc;</a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (ecc_protection == -1) {</span></a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : }</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : if (ecc_protection) {</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : uint64_t ecc_pos, ecc_align, ecc_diff, ecc_len;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : </a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region has ECC\n&quot;, __func__);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : ecc_pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : ecc_align = ecc_buffer_align(ecc_start, ecc_pos);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : ecc_diff = ecc_pos - ecc_align;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : ecc_buf = malloc(ecc_len);</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : if (!ecc_buf) {</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> : : }</a>
+<a name="560"><span class="lineNum"> 560 </span> : : </a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : if (ecc_diff) {</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, ecc_align, ecc_buf, ecc_diff);</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : }</a>
+<a name="569"><span class="lineNum"> 569 </span> : : </a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc_unaligned(ecc_buf, buf, len, ecc_diff);</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ECC_INVALID;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : }</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> : : write_buf = ecc_buf;</a>
+<a name="578"><span class="lineNum"> 578 </span> : : write_len = ecc_len;</a>
+<a name="579"><span class="lineNum"> 579 </span> : : write_pos = ecc_pos;</a>
+<a name="580"><span class="lineNum"> 580 </span> : : } else {</a>
+<a name="581"><span class="lineNum"> 581 </span> : : write_buf = buf;</a>
+<a name="582"><span class="lineNum"> 582 </span> : : write_len = len;</a>
+<a name="583"><span class="lineNum"> 583 </span> : : write_pos = pos;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : }</a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : erase_buf = malloc(erase_size);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : if (!erase_buf) {</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : }</a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : </a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineNoCov"> 0 : while (write_len &gt; 0) {</span></a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : uint32_t erase_block = write_pos &amp; ~(erase_size - 1);</span></a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineNoCov"> 0 : uint32_t block_offset = write_pos &amp; (erase_size - 1);</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : uint32_t chunk_size = erase_size &gt; write_len ?</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : write_len : erase_size;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : int cmp;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : </a>
+<a name="604"><span class="lineNum"> 604 </span> : : /* Write crosses an erase boundary, shrink the write to the boundary */</a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : if (erase_size &lt; block_offset + chunk_size) {</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : chunk_size = erase_size - block_offset;</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : }</a>
+<a name="608"><span class="lineNum"> 608 </span> : : </a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : cmp = blocklevel_flashcmp(erase_buf + block_offset, write_buf,</span></a>
+<a name="614"><span class="lineNum"> 614 </span> : : chunk_size);</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region 0x%08x..0x%08x &quot;, __func__,</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : erase_block, erase_size);</a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : if (cmp != 0) {</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;needs &quot;);</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : if (cmp == -1) {</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;erase and &quot;);</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : bl-&gt;erase(bl, erase_block, erase_size);</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : }</a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;write\n&quot;);</span></a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : memcpy(erase_buf + block_offset, write_buf, chunk_size);</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : } else {</a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;clean\n&quot;);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : write_len -= chunk_size;</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : write_pos += chunk_size;</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : write_buf += chunk_size;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : }</a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : out_free:</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="643"><span class="lineNum"> 643 </span> : : }</a>
+<a name="644"><span class="lineNum"> 644 </span> : : </a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 23 : static bool insert_bl_prot_range(struct blocklevel_range *ranges, struct bl_prot_range range)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : {</a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 23 : int i;</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineCov"> 23 : uint32_t pos, len;</span></a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineCov"> 23 : struct bl_prot_range *prot = ranges-&gt;prot;</span></a>
+<a name="650"><span class="lineNum"> 650 </span> : : </a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 23 : pos = range.start;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 23 : len = range.len;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 23 : if (len == 0)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : return true;</a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* Check for overflow */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineCov"> 23 : if (pos + len &lt; len)</span></a>
+<a name="659"><span class="lineNum"> 659 </span> : : return false;</a>
+<a name="660"><span class="lineNum"> 660 </span> : : </a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 23 : for (i = 0; i &lt; ranges-&gt;n_prot &amp;&amp; len &gt; 0; i++) {</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : if (prot[i].start &lt;= pos &amp;&amp; prot[i].start + prot[i].len &gt;= pos + len) {</span></a>
+<a name="663"><span class="lineNum"> 663 </span> : : len = 0;</a>
+<a name="664"><span class="lineNum"> 664 </span> : : break; /* Might as well, the next two conditions can't be true */</a>
+<a name="665"><span class="lineNum"> 665 </span> : : }</a>
+<a name="666"><span class="lineNum"> 666 </span> : : </a>
+<a name="667"><span class="lineNum"> 667 </span> : : /* Can easily extend this down just by adjusting start */</a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : if (pos &lt;= prot[i].start &amp;&amp; pos + len &gt;= prot[i].start) {</span></a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: extending start down\n&quot;, __func__);</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : prot[i].len += prot[i].start - pos;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : prot[i].start = pos;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : pos += prot[i].len;</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : if (prot[i].len &gt;= len)</span></a>
+<a name="674"><span class="lineNum"> 674 </span> : : len = 0;</a>
+<a name="675"><span class="lineNum"> 675 </span> : : else</a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineNoCov"> 0 : len -= prot[i].len;</span></a>
+<a name="677"><span class="lineNum"> 677 </span> : : }</a>
+<a name="678"><span class="lineNum"> 678 </span> : : </a>
+<a name="679"><span class="lineNum"> 679 </span> : : /*</a>
+<a name="680"><span class="lineNum"> 680 </span> : : * Jump over this range but the new range might be so big that</a>
+<a name="681"><span class="lineNum"> 681 </span> : : * theres a chunk after</a>
+<a name="682"><span class="lineNum"> 682 </span> : : */</a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : if (pos &gt;= prot[i].start &amp;&amp; pos &lt; prot[i].start + prot[i].len) {</span></a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: fits within current range &quot;, __func__);</span></a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : if (prot[i].start + prot[i].len - pos &gt; len) {</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;but there is some extra at the end\n&quot;);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : len -= prot[i].start + prot[i].len - pos;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : pos = prot[i].start + prot[i].len;</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : } else {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;\n&quot;);</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : len = 0;</a>
+<a name="692"><span class="lineNum"> 692 </span> : : }</a>
+<a name="693"><span class="lineNum"> 693 </span> : : }</a>
+<a name="694"><span class="lineNum"> 694 </span> : : /*</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * This condition will be true if the range is smaller than</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * the current range, therefore it should go here!</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : if (pos &lt; prot[i].start &amp;&amp; pos + len &lt;= prot[i].start)</span></a>
+<a name="699"><span class="lineNum"> 699 </span> : : break;</a>
+<a name="700"><span class="lineNum"> 700 </span> : : }</a>
+<a name="701"><span class="lineNum"> 701 </span> : : </a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineCov"> 23 : if (len) {</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 23 : int insert_pos = i;</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineCov"> 23 : struct bl_prot_range *new_ranges = ranges-&gt;prot;</span></a>
+<a name="705"><span class="lineNum"> 705 </span> : : </a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 23 : FL_DBG(&quot;%s: adding 0x%08x..0x%08x\n&quot;, __func__, pos, pos + len);</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 23 : if (ranges-&gt;n_prot == ranges-&gt;total_prot) {</span></a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineCov"> 23 : new_ranges = realloc(ranges-&gt;prot,</span></a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 23 : sizeof(range) * ((ranges-&gt;n_prot) + PROT_REALLOC_NUM));</span></a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineCov"> 23 : if (!new_ranges)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : return false;</a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 23 : ranges-&gt;total_prot += PROT_REALLOC_NUM;</span></a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineCov"> 23 : if (insert_pos != ranges-&gt;n_prot)</span></a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : for (i = ranges-&gt;n_prot; i &gt; insert_pos; i--)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;new_ranges[i], &amp;new_ranges[i - 1], sizeof(range));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 23 : range.start = pos;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 23 : range.len = len;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 23 : memcpy(&amp;new_ranges[insert_pos], &amp;range, sizeof(range));</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 23 : ranges-&gt;prot = new_ranges;</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 23 : ranges-&gt;n_prot++;</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 23 : prot = new_ranges;</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : }</a>
+<a name="725"><span class="lineNum"> 725 </span> : : </a>
+<a name="726"><span class="lineNum"> 726 </span> : : return true;</a>
+<a name="727"><span class="lineNum"> 727 </span> : : }</a>
+<a name="728"><span class="lineNum"> 728 </span> : : </a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineCov"> 23 : int blocklevel_ecc_protect(struct blocklevel_device *bl, uint32_t start, uint32_t len)</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : {</a>
+<a name="731"><span class="lineNum"> 731 </span> : : /*</a>
+<a name="732"><span class="lineNum"> 732 </span> : : * Could implement this at hardware level by having an accessor to the</a>
+<a name="733"><span class="lineNum"> 733 </span> : : * backend in struct blocklevel_device and as a result do nothing at</a>
+<a name="734"><span class="lineNum"> 734 </span> : : * this level (although probably not for ecc!)</a>
+<a name="735"><span class="lineNum"> 735 </span> : : */</a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineCov"> 23 : struct bl_prot_range range = { .start = start, .len = len };</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : </a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineCov"> 23 : if (len &lt; BYTES_PER_ECC)</span></a>
+<a name="739"><span class="lineNum"> 739 </span> : : return -1;</a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 23 : return !insert_bl_prot_range(&amp;bl-&gt;ecc_prot, range);</span></a>
+<a name="741"><span class="lineNum"> 741 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/ecc.c.func-sort-c.html b/coverage-report/external/gard/libflash/ecc.c.func-sort-c.html
new file mode 100644
index 0000000..0405e6d
--- /dev/null
+++ b/coverage-report/external/gard/libflash/ecc.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">54</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">50.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnHi">450</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnHi">450</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/ecc.c.func.html b/coverage-report/external/gard/libflash/ecc.c.func.html
new file mode 100644
index 0000000..ee0fe20
--- /dev/null
+++ b/coverage-report/external/gard/libflash/ecc.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">54</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">50.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnHi">450</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnHi">450</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/ecc.c.gcov.html b/coverage-report/external/gard/libflash/ecc.c.gcov.html
new file mode 100644
index 0000000..f6b6ba5
--- /dev/null
+++ b/coverage-report/external/gard/libflash/ecc.c.gcov.html
@@ -0,0 +1,534 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/ecc.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - ecc.c<span style="font-size: 80%;"> (source / <a href="ecc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">54</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">50.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : /* Bit field identifiers for syndrome calculations. */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : enum eccbitfields</a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : GD = 0xff, //&lt; Good, ECC matches.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : UE = 0xfe, //&lt; Uncorrectable.</a>
+<a name="22"><span class="lineNum"> 22 </span> : : E0 = 71, //&lt; Error in ECC bit 0</a>
+<a name="23"><span class="lineNum"> 23 </span> : : E1 = 70, //&lt; Error in ECC bit 1</a>
+<a name="24"><span class="lineNum"> 24 </span> : : E2 = 69, //&lt; Error in ECC bit 2</a>
+<a name="25"><span class="lineNum"> 25 </span> : : E3 = 68, //&lt; Error in ECC bit 3</a>
+<a name="26"><span class="lineNum"> 26 </span> : : E4 = 67, //&lt; Error in ECC bit 4</a>
+<a name="27"><span class="lineNum"> 27 </span> : : E5 = 66, //&lt; Error in ECC bit 5</a>
+<a name="28"><span class="lineNum"> 28 </span> : : E6 = 65, //&lt; Error in ECC bit 6</a>
+<a name="29"><span class="lineNum"> 29 </span> : : E7 = 64 //&lt; Error in ECC bit 7</a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* 0-63 Correctable bit in byte */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /*</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * Matrix used for ECC calculation.</a>
+<a name="35"><span class="lineNum"> 35 </span> : : *</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * Each row of this is the set of data word bits that are used for</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * the calculation of the corresponding ECC bit. The parity of the</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * bitset is the value of the ECC bit.</a>
+<a name="39"><span class="lineNum"> 39 </span> : : *</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * ie. ECC[n] = eccMatrix[n] &amp; data</a>
+<a name="41"><span class="lineNum"> 41 </span> : : *</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * Note: To make the math easier (and less shifts in resulting code),</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * row0 = ECC7. HW numbering is MSB, order here is LSB.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * These values come from the HW design of the ECC algorithm.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : static uint64_t eccmatrix[] = {</a>
+<a name="48"><span class="lineNum"> 48 </span> : : 0x0000e8423c0f99ffull,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : 0x00e8423c0f99ff00ull,</a>
+<a name="50"><span class="lineNum"> 50 </span> : : 0xe8423c0f99ff0000ull,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : 0x423c0f99ff0000e8ull,</a>
+<a name="52"><span class="lineNum"> 52 </span> : : 0x3c0f99ff0000e842ull,</a>
+<a name="53"><span class="lineNum"> 53 </span> : : 0x0f99ff0000e8423cull,</a>
+<a name="54"><span class="lineNum"> 54 </span> : : 0x99ff0000e8423c0full,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : 0xff0000e8423c0f99ull</a>
+<a name="56"><span class="lineNum"> 56 </span> : : };</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : /**</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * Syndrome calculation matrix.</a>
+<a name="60"><span class="lineNum"> 60 </span> : : *</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * Maps syndrome to flipped bit.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : *</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * To perform ECC correction, this matrix is a look-up of the bit</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * that is bad based on the binary difference of the good and bad</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * ECC. This difference is called the &quot;syndrome&quot;.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * When a particular bit is on in the data, it cause a column from</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * eccMatrix being XOR'd into the ECC field. This column is the</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * &quot;effect&quot; of each bit. If a bit is flipped in the data then its</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * &quot;effect&quot; is missing from the ECC. You can calculate ECC on unknown</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * quality data and compare the ECC field between the calculated</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * value and the stored value. If the difference is zero, then the</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * data is clean. If the difference is non-zero, you look up the</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * difference in the syndrome table to identify the &quot;effect&quot; that</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * is missing, which is the bit that is flipped.</a>
+<a name="76"><span class="lineNum"> 76 </span> : : *</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * Notice that ECC bit flips are recorded by a single &quot;effect&quot;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * bit (ie. 0x1, 0x2, 0x4, 0x8 ...) and double bit flips are identified</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * by the UE status in the table.</a>
+<a name="80"><span class="lineNum"> 80 </span> : : *</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * Bits are in MSB order.</a>
+<a name="82"><span class="lineNum"> 82 </span> : : */</a>
+<a name="83"><span class="lineNum"> 83 </span> : : static enum eccbitfields syndromematrix[] = {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : GD, E7, E6, UE, E5, UE, UE, 47, E4, UE, UE, 37, UE, 35, 39, UE,</a>
+<a name="85"><span class="lineNum"> 85 </span> : : E3, UE, UE, 48, UE, 30, 29, UE, UE, 57, 27, UE, 31, UE, UE, UE,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : E2, UE, UE, 17, UE, 18, 40, UE, UE, 58, 22, UE, 21, UE, UE, UE,</a>
+<a name="87"><span class="lineNum"> 87 </span> : : UE, 16, 49, UE, 19, UE, UE, UE, 23, UE, UE, UE, UE, 20, UE, UE,</a>
+<a name="88"><span class="lineNum"> 88 </span> : : E1, UE, UE, 51, UE, 46, 9, UE, UE, 34, 10, UE, 32, UE, UE, 36,</a>
+<a name="89"><span class="lineNum"> 89 </span> : : UE, 62, 50, UE, 14, UE, UE, UE, 13, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : UE, 61, 8, UE, 41, UE, UE, UE, 11, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : 15, UE, UE, UE, UE, UE, UE, UE, UE, UE, 12, UE, UE, UE, UE, UE,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : E0, UE, UE, 55, UE, 45, 43, UE, UE, 56, 38, UE, 1, UE, UE, UE,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : UE, 25, 26, UE, 2, UE, UE, UE, 24, UE, UE, UE, UE, UE, 28, UE,</a>
+<a name="94"><span class="lineNum"> 94 </span> : : UE, 59, 54, UE, 42, UE, UE, 44, 6, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="95"><span class="lineNum"> 95 </span> : : 5, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : UE, 63, 53, UE, 0, UE, UE, UE, 33, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : 3, UE, UE, 52, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : 7, UE, UE, UE, UE, UE, UE, UE, UE, 60, UE, UE, UE, UE, UE, UE,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : UE, UE, UE, UE, 4, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : };</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /**</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Create the ECC field corresponding to a 8-byte data field</a>
+<a name="104"><span class="lineNum"> 104 </span> : : *</a>
+<a name="105"><span class="lineNum"> 105 </span> : : * @data: The 8 byte data to generate ECC for.</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * @return: The 1 byte ECC corresponding to the data.</a>
+<a name="107"><span class="lineNum"> 107 </span> : : */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 5055 : static uint8_t eccgenerate(uint64_t data)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 5055 : int i;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 5055 : uint8_t result = 0;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 45495 : for (i = 0; i &lt; 8; i++)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 40440 : result |= __builtin_parityll(eccmatrix[i] &amp; data) &lt;&lt; i;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 5055 : return result;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : /**</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * Verify the data and ECC match or indicate how they are wrong.</a>
+<a name="121"><span class="lineNum"> 121 </span> : : *</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * @data: The data to check ECC on.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * @ecc: The [supposed] ECC for the data.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : *</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * @return: eccBitfield or 0-64.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : *</a>
+<a name="127"><span class="lineNum"> 127 </span> : : * @retval GD - Indicates the data is good (matches ECC).</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * @retval UE - Indicates the data is uncorrectable.</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * @retval all others - Indication of which bit is incorrect.</a>
+<a name="130"><span class="lineNum"> 130 </span> : : */</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 450 : static enum eccbitfields eccverify(uint64_t data, uint8_t ecc)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : {</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 450 : return syndromematrix[eccgenerate(data) ^ ecc];</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /* IBM bit ordering */</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : static inline uint64_t eccflipbit(uint64_t data, uint8_t bit)</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : {</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : if (bit &gt; 63)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : return data;</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : return data ^ (1ul &lt;&lt; (63 - bit));</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 450 : static int eccbyte(beint64_t *dst, struct ecc64 *src)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : {</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 450 : uint8_t ecc, badbit;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 450 : uint64_t data;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 450 : data = be64_to_cpu(src-&gt;data);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 450 : ecc = src-&gt;ecc;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 450 : badbit = eccverify(data, ecc);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 450 : if (badbit == UE) {</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;ECC: uncorrectable error: %016llx %02x\n&quot;, (unsigned long long int)data, ecc);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : return badbit;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : }</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 450 : if (badbit &lt;= UE)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : FL_INF(&quot;ECC: correctable error: %i\n&quot;, badbit);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 450 : if (badbit &lt; 64)</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : *dst = cpu_to_be64(eccflipbit(data, badbit));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : else</a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 450 : *dst = cpu_to_be64(data);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : return 0;</a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : static beint64_t *inc_beint64_by(const void *p, uint64_t i)</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : {</a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return (beint64_t *)(((char *)p) + i);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : static uint64_t *inc_uint64_by(const void *p, uint64_t i)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : {</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : return (uint64_t *)(((char *)p) + i);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : static struct ecc64 *inc_ecc64_by(struct ecc64 *p, uint64_t i)</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : {</a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : return (struct ecc64 *)(((char *)p) + i);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : }</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 178 : static uint64_t whole_ecc_bytes(uint64_t i)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : {</a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 178 : return i &amp; ~(BYTES_PER_ECC - 1);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 89 : static uint64_t whole_ecc_structs(uint64_t i)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : {</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 89 : return whole_ecc_bytes(i) &gt;&gt; 3;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : /**</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * Correct it along the way and check for errors.</a>
+<a name="196"><span class="lineNum"> 196 </span> : : *</a>
+<a name="197"><span class="lineNum"> 197 </span> : : * @dst: destination buffer without ECC</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * @src: source buffer with ECC</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="200"><span class="lineNum"> 200 </span> : : * Must be 8 byte aligned.</a>
+<a name="201"><span class="lineNum"> 201 </span> : : *</a>
+<a name="202"><span class="lineNum"> 202 </span> : : * @return: Success or error</a>
+<a name="203"><span class="lineNum"> 203 </span> : : *</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * @retval: 0 - success</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @retfal: other - fail</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 89 : int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len)</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 89 : uint32_t i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 89 : if (len &amp; 0x7) {</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* TODO: we could probably handle this */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;ECC data length must be 8 byte aligned length:%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : len);</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 89 : len &gt;&gt;= 3;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 539 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 450 : int rc;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 450 : rc = eccbyte(dst, src + i);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 450 : if (rc)</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 450 : dst++;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> : : return 0;</a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * Correct it along the way and check for errors.</a>
+<a name="234"><span class="lineNum"> 234 </span> : : *</a>
+<a name="235"><span class="lineNum"> 235 </span> : : * Unlike memcmp_from_ecc() which requires that the first byte into</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * dst be the first byte in src (which must also be aligned to a</a>
+<a name="237"><span class="lineNum"> 237 </span> : : * struct ecc64 struct boundary) this function can cope with the first</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * byte in dst not being the first byte in src.</a>
+<a name="239"><span class="lineNum"> 239 </span> : : *</a>
+<a name="240"><span class="lineNum"> 240 </span> : : * Note: src MUST still be aligned to a struct ecc64 otherwise ECC</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * calculations are impossible.</a>
+<a name="242"><span class="lineNum"> 242 </span> : : *</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * The alignment parameter species the number of bytes present at the</a>
+<a name="244"><span class="lineNum"> 244 </span> : : * start of src that should be skipped and not written to dst. Once</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * again, these bytes must be in src otherwise the ECC cannot be</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * checked.</a>
+<a name="247"><span class="lineNum"> 247 </span> : : *</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * len also doesn't have any value limitation for this function. Of</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * course src must contain an exact multiple of struct ecc64 otherwise</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * ECC calculation cannot be performed but this function won't copy</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * the entirety of the last src data word if len is not mutiple of 8</a>
+<a name="252"><span class="lineNum"> 252 </span> : : *</a>
+<a name="253"><span class="lineNum"> 253 </span> : : * @dst: destination buffer without ECC</a>
+<a name="254"><span class="lineNum"> 254 </span> : : * @src: source buffer with ECC</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * @alignment: number of leading bytes in src which shouldn't be</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * copied to dst</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * @return: Success or error</a>
+<a name="259"><span class="lineNum"> 259 </span> : : *</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @retval: 0 - success</a>
+<a name="261"><span class="lineNum"> 261 </span> : : * @retfal: other - fail</a>
+<a name="262"><span class="lineNum"> 262 </span> : : */</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 89 : int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src,</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="265"><span class="lineNum"> 265 </span> : : {</a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 89 : char data[BYTES_PER_ECC];</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 89 : uint8_t bytes_wanted;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 89 : int rc;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 89 : if (alignment &gt; 8)</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : return -1;</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 89 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /*</a>
+<a name="276"><span class="lineNum"> 276 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * required - otherwise jump straight to memcpy_from_ecc()</a>
+<a name="278"><span class="lineNum"> 278 </span> : : */</a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 89 : if (alignment) {</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : return rc;</a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : memcpy(dst, &amp;data[alignment], bytes_wanted);</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : src = inc_ecc64_by(src, sizeof(struct ecc64));</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : dst = inc_beint64_by(dst, bytes_wanted);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : len -= bytes_wanted;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : }</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 89 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 89 : rc = memcpy_from_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 89 : if (rc)</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : return rc;</a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> : : /*</a>
+<a name="297"><span class="lineNum"> 297 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * here, (dst and src are different types)</a>
+<a name="299"><span class="lineNum"> 299 </span> : : */</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 89 : dst += whole_ecc_structs(len);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 89 : src += whole_ecc_structs(len);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 89 : len -= whole_ecc_bytes(len);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 89 : if (len) {</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineNoCov"> 0 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : return rc;</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : memcpy(dst, data, len);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : }</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> : : return 0;</a>
+<a name="314"><span class="lineNum"> 314 </span> : : }</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> : : /**</a>
+<a name="317"><span class="lineNum"> 317 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="318"><span class="lineNum"> 318 </span> : : *</a>
+<a name="319"><span class="lineNum"> 319 </span> : : * @dst: destination buffer with ECC</a>
+<a name="320"><span class="lineNum"> 320 </span> : : * @src: source buffer without ECC</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * Must be 8 byte aligned.</a>
+<a name="324"><span class="lineNum"> 324 </span> : : *</a>
+<a name="325"><span class="lineNum"> 325 </span> : : * @return: success or failure</a>
+<a name="326"><span class="lineNum"> 326 </span> : : *</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * @retval: 0 - success</a>
+<a name="328"><span class="lineNum"> 328 </span> : : * @retfal: other - fail</a>
+<a name="329"><span class="lineNum"> 329 </span> : : */</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 12 : int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : {</a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 12 : struct ecc64 ecc_word;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 12 : uint64_t i;</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 12 : if (len &amp; 0x7) {</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : /* TODO: we could probably handle this */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;Data to add ECC bytes to must be 8 byte aligned length: %&quot;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : PRIx64 &quot;\n&quot;, len);</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 12 : len &gt;&gt;= 3;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 4617 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 4605 : ecc_word.ecc = eccgenerate(be64_to_cpu(*(src + i)));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 4605 : ecc_word.data = *(src + i);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : </a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 4605 : *(dst + i) = ecc_word;</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : }</a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : return 0;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : }</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> : : /**</a>
+<a name="356"><span class="lineNum"> 356 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="357"><span class="lineNum"> 357 </span> : : *</a>
+<a name="358"><span class="lineNum"> 358 </span> : : * Unlike memcmp_to_ecc() which requires that the first byte in src be</a>
+<a name="359"><span class="lineNum"> 359 </span> : : * the first byte of a struct ecc64 structure this function does not</a>
+<a name="360"><span class="lineNum"> 360 </span> : : * have this requirement.</a>
+<a name="361"><span class="lineNum"> 361 </span> : : *</a>
+<a name="362"><span class="lineNum"> 362 </span> : : * Like memcpy_to_ecc_unaligned() the alignment parameter specfies the</a>
+<a name="363"><span class="lineNum"> 363 </span> : : * number of bytes in the first src word that are missing and would be</a>
+<a name="364"><span class="lineNum"> 364 </span> : : * required to form a struct ecc64 structure.</a>
+<a name="365"><span class="lineNum"> 365 </span> : : *</a>
+<a name="366"><span class="lineNum"> 366 </span> : : * It must be noted here that extra work IN THE CALLER must be done</a>
+<a name="367"><span class="lineNum"> 367 </span> : : * if your data is unaligned. In order to peform ECC calculations</a>
+<a name="368"><span class="lineNum"> 368 </span> : : * whatever portions of the ecc words are missing in src must be in</a>
+<a name="369"><span class="lineNum"> 369 </span> : : * dst.</a>
+<a name="370"><span class="lineNum"> 370 </span> : : *</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * For example, if there is an alignment value of 1 then this means</a>
+<a name="372"><span class="lineNum"> 372 </span> : : * there is 1 byte (of the total of 8 bytes) missing in src which is</a>
+<a name="373"><span class="lineNum"> 373 </span> : : * needed to calculate the first ECC byte. Therefore the first byte of</a>
+<a name="374"><span class="lineNum"> 374 </span> : : * dst MUST CONTAIN IT!</a>
+<a name="375"><span class="lineNum"> 375 </span> : : *</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * The same problem exists for the end of the buffer where src may not</a>
+<a name="377"><span class="lineNum"> 377 </span> : : * end exactly aligned, if this is the case dst must contain the</a>
+<a name="378"><span class="lineNum"> 378 </span> : : * required bytes to calculate the last ECC byte - they should be in</a>
+<a name="379"><span class="lineNum"> 379 </span> : : * dst where they would normally be found if src did contain those</a>
+<a name="380"><span class="lineNum"> 380 </span> : : * bytes.</a>
+<a name="381"><span class="lineNum"> 381 </span> : : *</a>
+<a name="382"><span class="lineNum"> 382 </span> : : * @dst: destination buffer with ECC</a>
+<a name="383"><span class="lineNum"> 383 </span> : : * @src: source buffer without ECC</a>
+<a name="384"><span class="lineNum"> 384 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="385"><span class="lineNum"> 385 </span> : : * @alignment: The number of bytes 'missing' from the start of src to</a>
+<a name="386"><span class="lineNum"> 386 </span> : : * be struct ecc64 aligned</a>
+<a name="387"><span class="lineNum"> 387 </span> : : *</a>
+<a name="388"><span class="lineNum"> 388 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="389"><span class="lineNum"> 389 </span> : : * Must be 8 byte aligned.</a>
+<a name="390"><span class="lineNum"> 390 </span> : : *</a>
+<a name="391"><span class="lineNum"> 391 </span> : : * @return: success or failure</a>
+<a name="392"><span class="lineNum"> 392 </span> : : *</a>
+<a name="393"><span class="lineNum"> 393 </span> : : * @retval: 0 - success</a>
+<a name="394"><span class="lineNum"> 394 </span> : : * @retfal: other - fail</a>
+<a name="395"><span class="lineNum"> 395 </span> : : */</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src,</span></a>
+<a name="398"><span class="lineNum"> 398 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="399"><span class="lineNum"> 399 </span> : : {</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : struct ecc64 ecc_word;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : uint8_t bytes_wanted;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> : : /*</a>
+<a name="407"><span class="lineNum"> 407 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="408"><span class="lineNum"> 408 </span> : : * required - otherwise jump straight to memcpy_to_ecc()</a>
+<a name="409"><span class="lineNum"> 409 </span> : : */</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : if (alignment) {</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : ecc_word.data = dst-&gt;data;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : memcpy(inc_uint64_by(&amp;ecc_word.data, alignment), src, bytes_wanted);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : memcpy(dst, inc_ecc64_by(&amp;ecc_word, alignment),</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : sizeof(struct ecc64) - alignment);</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : dst = inc_ecc64_by(dst, sizeof(struct ecc64) - alignment);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : src = inc_beint64_by(src, bytes_wanted);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : len -= bytes_wanted;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : return rc;</a>
+<a name="427"><span class="lineNum"> 427 </span> : : </a>
+<a name="428"><span class="lineNum"> 428 </span> : : /*</a>
+<a name="429"><span class="lineNum"> 429 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="430"><span class="lineNum"> 430 </span> : : * here, (dst and src are different types)</a>
+<a name="431"><span class="lineNum"> 431 </span> : : */</a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : dst += whole_ecc_structs(len);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : src += whole_ecc_structs(len);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineNoCov"> 0 : len -= whole_ecc_bytes(len);</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : if (len) {</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - len;</span></a>
+<a name="439"><span class="lineNum"> 439 </span> : : </a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : ecc_word.data = *src;</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : memcpy(inc_uint64_by(&amp;ecc_word.data, len), inc_ecc64_by(dst, len),</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : bytes_wanted);</a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineNoCov"> 0 : *dst = ecc_word;</span></a>
+<a name="446"><span class="lineNum"> 446 </span> : : }</a>
+<a name="447"><span class="lineNum"> 447 </span> : : </a>
+<a name="448"><span class="lineNum"> 448 </span> : : return 0;</a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/ecc.h.func-sort-c.html b/coverage-report/external/gard/libflash/ecc.h.func-sort-c.html
new file mode 100644
index 0000000..2a56f5a
--- /dev/null
+++ b/coverage-report/external/gard/libflash/ecc.h.func-sort-c.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.h.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/ecc.h.func.html b/coverage-report/external/gard/libflash/ecc.h.func.html
new file mode 100644
index 0000000..81733e6
--- /dev/null
+++ b/coverage-report/external/gard/libflash/ecc.h.func.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.h.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/ecc.h.gcov.html b/coverage-report/external/gard/libflash/ecc.h.gcov.html
new file mode 100644
index 0000000..fc252c0
--- /dev/null
+++ b/coverage-report/external/gard/libflash/ecc.h.gcov.html
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/ecc.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - ecc.h<span style="font-size: 80%;"> (source / <a href="ecc.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #ifndef __ECC_H</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #define __ECC_H</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct ecc64 {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : beint64_t data;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : uint8_t ecc;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : } __attribute__((__packed__));</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : extern int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len);</a>
+<a name="20"><span class="lineNum"> 20 </span> : : extern int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src, uint64_t len,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint8_t alignment);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : extern int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src, uint64_t len,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : uint8_t alignment);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /*</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Calculate the size of a buffer if ECC is added</a>
+<a name="29"><span class="lineNum"> 29 </span> : : *</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * We add 1 byte of ecc for every 8 bytes of data. So we need to round up to 8</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * bytes length and then add 1/8</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #ifndef ALIGN_UP</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define ALIGN_UP(_v, _a) (((_v) + (_a) - 1) &amp; ~((_a) - 1))</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #endif</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define BYTES_PER_ECC 8</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 101 : static inline uint64_t ecc_size(uint64_t len)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 101 : return ALIGN_UP(len, BYTES_PER_ECC) &gt;&gt; 3;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 101 : static inline uint64_t ecc_buffer_size(uint64_t len)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 101 : return ALIGN_UP(len, BYTES_PER_ECC) + ecc_size(len);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : static inline int ecc_buffer_size_check(uint64_t len)</a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> : : return len % (BYTES_PER_ECC + 1);</a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : static inline uint64_t ecc_buffer_size_minus_ecc(uint64_t len)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : return len * BYTES_PER_ECC / (BYTES_PER_ECC + 1);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : }</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 101 : static inline uint64_t ecc_buffer_align(uint64_t start, uint64_t pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 101 : return pos - ((pos - start) % (BYTES_PER_ECC + 1));</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : }</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : #endif</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/file.c.func-sort-c.html b/coverage-report/external/gard/libflash/file.c.func-sort-c.html
new file mode 100644
index 0000000..f277daa
--- /dev/null
+++ b/coverage-report/external/gard/libflash/file.c.func-sort-c.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">48.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">61.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="file.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/file.c.func.html b/coverage-report/external/gard/libflash/file.c.func.html
new file mode 100644
index 0000000..3b522e7
--- /dev/null
+++ b/coverage-report/external/gard/libflash/file.c.func.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">48.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">61.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="file.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnHi">89</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/file.c.gcov.html b/coverage-report/external/gard/libflash/file.c.gcov.html
new file mode 100644
index 0000000..91460e6
--- /dev/null
+++ b/coverage-report/external/gard/libflash/file.c.gcov.html
@@ -0,0 +1,471 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/file.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - file.c<span style="font-size: 80%;"> (source / <a href="file.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">48.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">61.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define _GNU_SOURCE</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;errno.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/ioctl.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;limits.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;mtd/mtd-abi.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;libflash/file.h&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct file_data {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : int fd;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : char *name;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : char *path;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct blocklevel_device bl;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : };</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : static int file_release(struct blocklevel_device *bl)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : close(file_data-&gt;fd);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = -1;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : static int file_reacquire(struct blocklevel_device *bl)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : int fd;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : fd = open(file_data-&gt;path, O_RDWR);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : if (fd == -1)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = fd;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 89 : static int file_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 89 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 89 : int rc, count = 0;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 89 : rc = lseek(file_data-&gt;fd, pos, SEEK_SET);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : /* errno should remain set */</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 89 : if (rc != pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 178 : while (count &lt; len) {</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 89 : rc = read(file_data-&gt;fd, buf, len - count);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* errno should remain set */</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 89 : if (rc == -1 || rc == 0)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 89 : buf += rc;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 89 : count += rc;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : return 0;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 22 : static int file_write(struct blocklevel_device *bl, uint64_t dst, const void *src,</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : uint64_t len)</a>
+<a name="77"><span class="lineNum"> 77 </span> : : {</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 22 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 22 : int rc, count = 0;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 22 : rc = lseek(file_data-&gt;fd, dst, SEEK_SET);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* errno should remain set */</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 22 : if (rc != dst)</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 44 : while (count &lt; len) {</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 22 : rc = write(file_data-&gt;fd, src, len - count);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* errno should remain set */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 22 : if (rc == -1)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 22 : src += rc;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 22 : count += rc;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : }</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : return 0;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /*</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * Due to to the fact these interfaces are ultimately supposed to deal with</a>
+<a name="101"><span class="lineNum"> 101 </span> : : * flash, an erase function must be implemented even when the flash images</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * are backed by regular files.</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Also, erasing flash leaves all the bits set to 1. This may be expected</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * by higher level functions so this function should also emulate that</a>
+<a name="105"><span class="lineNum"> 105 </span> : : */</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 2 : static int file_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 2 : static char buf[4096];</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 2 : int i = 0;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 2 : int rc;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 2 : memset(buf, ~0, sizeof(buf));</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 12 : while (len - i &gt; 0) {</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 10 : rc = file_write(bl, dst + i, buf, len - i &gt; sizeof(buf) ? sizeof(buf) : len - i);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 10 : if (rc)</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 10 : i += (len - i &gt; sizeof(buf)) ? sizeof(buf) : len - i;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : return 0;</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : static int mtd_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : {</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : int err;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: dst: 0x%&quot; PRIx64 &quot;, len: 0x%&quot; PRIx64 &quot;\n&quot;, __func__, dst, len);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : /*</a>
+<a name="132"><span class="lineNum"> 132 </span> : : * Some kernels that pflash supports do not know about the 64bit</a>
+<a name="133"><span class="lineNum"> 133 </span> : : * version of the ioctl() therefore we'll just use the 32bit (which</a>
+<a name="134"><span class="lineNum"> 134 </span> : : * should always be supported...) unless we MUST use the 64bit and</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * then lets just hope the kernel knows how to deal with it. If it</a>
+<a name="136"><span class="lineNum"> 136 </span> : : * is unsupported the ioctl() will fail and we'll report that -</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * there is no other option.</a>
+<a name="138"><span class="lineNum"> 138 </span> : : *</a>
+<a name="139"><span class="lineNum"> 139 </span> : : * Furthermore, even very recent MTD layers and drivers aren't</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * particularly good at not blocking in the kernel. This creates</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * unexpected behaviour in userspace tools using these functions.</a>
+<a name="142"><span class="lineNum"> 142 </span> : : * In the absence of significant work inside the kernel, we'll just</a>
+<a name="143"><span class="lineNum"> 143 </span> : : * split stuff up here for convenience.</a>
+<a name="144"><span class="lineNum"> 144 </span> : : * We can assume everything is aligned here.</a>
+<a name="145"><span class="lineNum"> 145 </span> : : */</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : while (len) {</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : if (dst &gt; UINT_MAX || len &gt; UINT_MAX) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : struct erase_info_user64 erase_info = {</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : .start = dst,</a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : };</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE64, &amp;erase_info) == -1) {</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : if (err == 25) /* Kernel doesn't do 64bit MTD erase ioctl() */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Attempted a 64bit erase on a kernel which doesn't support it\n&quot;);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : } else {</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : struct erase_info_user erase_info = {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : .start = dst,</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : };</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE, &amp;erase_info) == -1) {</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : dst += file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : len -= file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : }</a>
+<a name="176"><span class="lineNum"> 176 </span> : : return 0;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : static int get_info_name(struct file_data *file_data, char **name)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : {</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : char *path, *lpath;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : int len;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : struct stat st;</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : if (asprintf(&amp;path, &quot;/proc/self/fd/%d&quot;, file_data-&gt;fd) == -1)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : if (lstat(path, &amp;st)) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : lpath = malloc(st.st_size + 1);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : if (!lpath) {</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : }</a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : len = readlink(path, lpath, st.st_size +1);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : if (len == -1) {</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : free(lpath);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : lpath[len] = '\0';</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : *name = lpath;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : static int mtd_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : struct mtd_info_user mtd_info;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : rc = ioctl(file_data-&gt;fd, MEMGETINFO, &amp;mtd_info);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : if (rc == -1)</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : *total_size = mtd_info.size;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : *erase_granule = mtd_info.erasesize;</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : if (name) {</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : return rc;</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : *name = file_data-&gt;name;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : }</a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : return 0;</a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 23 : static int file_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="243"><span class="lineNum"> 243 </span> : : {</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 23 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 23 : struct stat st;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 23 : int rc;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 23 : if (fstat(file_data-&gt;fd, &amp;st))</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 23 : if (total_size)</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 23 : *total_size = st.st_size;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 23 : if (erase_granule)</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : *erase_granule = 1;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 23 : if (name) {</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : return rc;</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : *name = file_data-&gt;name;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : return 0;</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 23 : int file_init(int fd, struct blocklevel_device **bl)</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : {</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 23 : struct file_data *file_data;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 23 : struct stat sbuf;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 23 : if (!bl)</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 23 : *bl = NULL;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 23 : file_data = calloc(1, sizeof(struct file_data));</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 23 : if (!file_data)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 23 : file_data-&gt;fd = fd;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.reacquire = &amp;file_reacquire;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.release = &amp;file_release;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.read = &amp;file_read;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.write = &amp;file_write;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.erase = &amp;file_erase;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.get_info = &amp;file_get_info;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.erase_mask = 0;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> : : /*</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * If the blocklevel_device is only inited with file_init() then keep</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * alive is assumed, as fd will change otherwise and this may break</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * callers assumptions.</a>
+<a name="294"><span class="lineNum"> 294 </span> : : */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.keep_alive = 1;</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /*</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * Unfortunately not all file descriptors are created equal...</a>
+<a name="299"><span class="lineNum"> 299 </span> : : * Here we check to see if the file descriptor is to an MTD device, in</a>
+<a name="300"><span class="lineNum"> 300 </span> : : * which case we have to erase and get the size of it differently.</a>
+<a name="301"><span class="lineNum"> 301 </span> : : */</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 23 : if (fstat(file_data-&gt;fd, &amp;sbuf) == -1)</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : /* Won't be able to handle other than MTD devices for now */</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 23 : if (S_ISCHR(sbuf.st_mode)) {</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase = &amp;mtd_erase;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.get_info = &amp;mtd_get_info;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : mtd_get_info(&amp;file_data-&gt;bl, NULL, NULL, &amp;(file_data-&gt;bl.erase_mask));</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase_mask--;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 23 : } else if (!S_ISREG(sbuf.st_mode)) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : /* If not a char device or a regular file something went wrong */</a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : }</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 23 : *bl = &amp;(file_data-&gt;bl);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 23 : return 0;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : free(file_data);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : }</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 23 : int file_init_path(const char *path, int *r_fd, bool keep_alive,</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : struct blocklevel_device **bl)</a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 23 : int fd, rc;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 23 : char *path_ptr = NULL;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 23 : struct file_data *file_data;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 23 : if (!path || !bl)</span></a>
+<a name="332"><span class="lineNum"> 332 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 23 : fd = open(path, O_RDWR);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 23 : if (fd == -1)</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : /*</a>
+<a name="339"><span class="lineNum"> 339 </span> : : * strdup() first so don't have to deal with malloc failure after</a>
+<a name="340"><span class="lineNum"> 340 </span> : : * file_init()</a>
+<a name="341"><span class="lineNum"> 341 </span> : : */</a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 23 : path_ptr = strdup(path);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 23 : if (!path_ptr) {</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : }</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 23 : rc = file_init(fd, bl);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 23 : if (rc)</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 23 : file_data = container_of(*bl, struct file_data, bl);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 23 : file_data-&gt;bl.keep_alive = keep_alive;</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 23 : file_data-&gt;path = path_ptr;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 23 : if (r_fd)</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : *r_fd = fd;</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : </a>
+<a name="359"><span class="lineNum"> 359 </span> : : return rc;</a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : free(path_ptr);</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : close(fd);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : }</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 23 : void file_exit(struct blocklevel_device *bl)</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : {</a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 23 : struct file_data *file_data;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 23 : if (bl) {</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 23 : free(bl-&gt;ecc_prot.prot);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 23 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 23 : free(file_data-&gt;name);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 23 : free(file_data-&gt;path);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 23 : free(file_data);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> : : }</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 23 : }</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : </a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 23 : void file_exit_close(struct blocklevel_device *bl)</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : {</a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 23 : struct file_data *file_data;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 23 : if (bl) {</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 23 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 23 : close(file_data-&gt;fd);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 23 : file_exit(bl);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 23 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/index-sort-b.html b/coverage-report/external/gard/libflash/index-sort-b.html
new file mode 100644
index 0000000..02d1980
--- /dev/null
+++ b/coverage-report/external/gard/libflash/index-sort-b.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">305</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">19.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">30.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=51 height=10 alt="50.9%"><img src="../../../snow.png" width=49 height=10 alt="50.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.9&nbsp;%</td>
+ <td class="coverNumLo">54 / 106</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=75 height=10 alt="75.0%"><img src="../../../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 431</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=41 height=10 alt="40.6%"><img src="../../../snow.png" width=59 height=10 alt="40.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.6&nbsp;%</td>
+ <td class="coverNumLo">155 / 382</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=49 height=10 alt="48.9%"><img src="../../../snow.png" width=51 height=10 alt="48.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.9&nbsp;%</td>
+ <td class="coverNumLo">90 / 184</td>
+ <td class="coverPerLo">61.5&nbsp;%</td>
+ <td class="coverNumLo">8 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/index-sort-f.html b/coverage-report/external/gard/libflash/index-sort-f.html
new file mode 100644
index 0000000..fac46e2
--- /dev/null
+++ b/coverage-report/external/gard/libflash/index-sort-f.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">305</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">19.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">30.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 431</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=49 height=10 alt="48.9%"><img src="../../../snow.png" width=51 height=10 alt="48.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.9&nbsp;%</td>
+ <td class="coverNumLo">90 / 184</td>
+ <td class="coverPerLo">61.5&nbsp;%</td>
+ <td class="coverNumLo">8 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=51 height=10 alt="50.9%"><img src="../../../snow.png" width=49 height=10 alt="50.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.9&nbsp;%</td>
+ <td class="coverNumLo">54 / 106</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=41 height=10 alt="40.6%"><img src="../../../snow.png" width=59 height=10 alt="40.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.6&nbsp;%</td>
+ <td class="coverNumLo">155 / 382</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=75 height=10 alt="75.0%"><img src="../../../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/index-sort-l.html b/coverage-report/external/gard/libflash/index-sort-l.html
new file mode 100644
index 0000000..720b947
--- /dev/null
+++ b/coverage-report/external/gard/libflash/index-sort-l.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">305</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">19.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">30.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 431</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=41 height=10 alt="40.6%"><img src="../../../snow.png" width=59 height=10 alt="40.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.6&nbsp;%</td>
+ <td class="coverNumLo">155 / 382</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=49 height=10 alt="48.9%"><img src="../../../snow.png" width=51 height=10 alt="48.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.9&nbsp;%</td>
+ <td class="coverNumLo">90 / 184</td>
+ <td class="coverPerLo">61.5&nbsp;%</td>
+ <td class="coverNumLo">8 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=51 height=10 alt="50.9%"><img src="../../../snow.png" width=49 height=10 alt="50.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.9&nbsp;%</td>
+ <td class="coverNumLo">54 / 106</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=75 height=10 alt="75.0%"><img src="../../../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/index.html b/coverage-report/external/gard/libflash/index.html
new file mode 100644
index 0000000..28fc4a8
--- /dev/null
+++ b/coverage-report/external/gard/libflash/index.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/gard/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">305</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">19.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">30.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=41 height=10 alt="40.6%"><img src="../../../snow.png" width=59 height=10 alt="40.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.6&nbsp;%</td>
+ <td class="coverNumLo">155 / 382</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=51 height=10 alt="50.9%"><img src="../../../snow.png" width=49 height=10 alt="50.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.9&nbsp;%</td>
+ <td class="coverNumLo">54 / 106</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=75 height=10 alt="75.0%"><img src="../../../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=49 height=10 alt="48.9%"><img src="../../../snow.png" width=51 height=10 alt="48.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.9&nbsp;%</td>
+ <td class="coverNumLo">90 / 184</td>
+ <td class="coverPerLo">61.5&nbsp;%</td>
+ <td class="coverNumLo">8 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 431</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/libffs.c.func-sort-c.html b/coverage-report/external/gard/libflash/libffs.c.func-sort-c.html
new file mode 100644
index 0000000..8f0ee0c
--- /dev/null
+++ b/coverage-report/external/gard/libflash/libffs.c.func-sort-c.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libffs.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/libffs.c.func.html b/coverage-report/external/gard/libflash/libffs.c.func.html
new file mode 100644
index 0000000..f078001
--- /dev/null
+++ b/coverage-report/external/gard/libflash/libffs.c.func.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libffs.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/libffs.c.gcov.html b/coverage-report/external/gard/libflash/libffs.c.gcov.html
new file mode 100644
index 0000000..5f1ec72
--- /dev/null
+++ b/coverage-report/external/gard/libflash/libffs.c.gcov.html
@@ -0,0 +1,927 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/libffs.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - libffs.c<span style="font-size: 80%;"> (source / <a href="libffs.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;limits.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #ifndef __SKIBOOT__</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #endif</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;ffs.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define __unused __attribute__((unused))</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define HDR_ENTRIES_NUM 30</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct ffs_handle {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : struct ffs_hdr hdr; /* Converted header */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint32_t toc_offset;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : uint32_t max_size;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : /* The converted header knows how big this is */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct __ffs_hdr *cache;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct blocklevel_device *bl;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : };</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : static uint32_t ffs_checksum(void* data, size_t size)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : {</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : uint32_t i, csum = 0;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : for (i = csum = 0; i &lt; (size/4); i++)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : csum ^= ((uint32_t *)data)[i];</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : return csum;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : /* Helper functions for typesafety and size safety */</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : static uint32_t ffs_hdr_checksum(struct __ffs_hdr *hdr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : return ffs_checksum(hdr, sizeof(struct __ffs_hdr));</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : static uint32_t ffs_entry_checksum(struct __ffs_entry *ent)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : return ffs_checksum(ent, sizeof(struct __ffs_entry));</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : static size_t ffs_hdr_raw_size(int num_entries)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : {</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : return sizeof(struct __ffs_hdr) + num_entries * sizeof(struct __ffs_entry);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : static int ffs_num_entries(struct ffs_hdr *hdr)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == 0)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s returned zero!\n&quot;, __func__);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : return hdr-&gt;count;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : static int ffs_check_convert_header(struct ffs_hdr *dst, struct __ffs_hdr *src)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(src-&gt;magic) != FFS_MAGIC)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : return FFS_ERR_BAD_MAGIC;</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : dst-&gt;version = be32_to_cpu(src-&gt;version);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : if (dst-&gt;version != FFS_VERSION_1)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FFS_ERR_BAD_VERSION;</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : if (ffs_hdr_checksum(src) != 0)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(src-&gt;entry_size) != sizeof(struct __ffs_entry))</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : if ((be32_to_cpu(src-&gt;entry_size) * be32_to_cpu(src-&gt;entry_count)) &gt;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : (be32_to_cpu(src-&gt;block_size) * be32_to_cpu(src-&gt;size)))</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : dst-&gt;block_size = be32_to_cpu(src-&gt;block_size);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : dst-&gt;size = be32_to_cpu(src-&gt;size) * dst-&gt;block_size;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : dst-&gt;block_count = be32_to_cpu(src-&gt;block_count);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : dst-&gt;entries_size = be32_to_cpu(src-&gt;entry_count);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : }</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : static int ffs_entry_user_to_flash(struct ffs_hdr *hdr __unused,</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : struct __ffs_entry_user *dst, struct ffs_entry_user *src)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineNoCov"> 0 : memset(dst, 0, sizeof(struct __ffs_entry_user));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : dst-&gt;datainteg = cpu_to_be16(src-&gt;datainteg);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : static int ffs_entry_user_to_cpu(struct ffs_hdr *hdr __unused,</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : struct ffs_entry_user *dst, struct __ffs_entry_user *src)</a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : memset(dst, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : dst-&gt;datainteg = be16_to_cpu(src-&gt;datainteg);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : static int ffs_entry_to_flash(struct ffs_hdr *hdr,</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : struct __ffs_entry *dst, struct ffs_entry *src)</a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : int rc, index;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : if (!hdr || !dst || !src)</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : return -1;</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : for (index = 0; index &lt; hdr-&gt;count &amp;&amp; hdr-&gt;entries[index] != src; index++);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : if (index == hdr-&gt;count)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : index++; /* On flash indexes start at 1 */</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : /*</a>
+<a name="119"><span class="lineNum"> 119 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * dst-&gt;checksum must be zero before calling ffs_entry_checksum()</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * appears the reserved fields are always zero.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : */</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : memset(dst, 0, sizeof(*dst));</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : dst-&gt;base = cpu_to_be32(src-&gt;base / hdr-&gt;block_size);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : dst-&gt;size = cpu_to_be32(src-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : dst-&gt;pid = cpu_to_be32(src-&gt;pid);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : dst-&gt;id = cpu_to_be32(index);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : dst-&gt;type = cpu_to_be32(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : dst-&gt;flags = cpu_to_be32(src-&gt;flags);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : dst-&gt;actual = cpu_to_be32(src-&gt;actual);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_user_to_flash(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : dst-&gt;checksum = ffs_entry_checksum(dst);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineNoCov"> 0 : static int ffs_entry_to_cpu(struct ffs_hdr *hdr,</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : struct ffs_entry *dst, struct __ffs_entry *src)</a>
+<a name="143"><span class="lineNum"> 143 </span> : : {</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : if (ffs_entry_checksum(src) != 0)</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : dst-&gt;base = be32_to_cpu(src-&gt;base) * hdr-&gt;block_size;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : dst-&gt;size = be32_to_cpu(src-&gt;size) * hdr-&gt;block_size;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : dst-&gt;actual = be32_to_cpu(src-&gt;actual);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : dst-&gt;pid = be32_to_cpu(src-&gt;pid);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : dst-&gt;type = be32_to_cpu(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : dst-&gt;flags = be32_to_cpu(src-&gt;flags);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_user_to_cpu(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : char *ffs_entry_user_to_string(struct ffs_entry_user *user)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : {</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : char *ret;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : if (!user)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : return NULL;</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : ret = strdup(&quot;----------&quot;);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : return NULL;</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : if (user-&gt;datainteg &amp; FFS_ENRY_INTEG_ECC)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : ret[0] = 'E';</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512V)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : ret[1] = 'L';</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512EC)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : ret[2] = 'I';</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_PRESERVED)</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : ret[3] = 'P';</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_READONLY)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : ret[4] = 'R';</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_BACKUP)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : ret[5] = 'B';</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_REPROVISION)</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : ret[6] = 'F';</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_GOLDEN)</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : ret[7] = 'G';</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_CLEARECC)</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : ret[8] = 'C';</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_VOLATILE)</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : ret[9] = 'V';</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : return ret;</a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : int ffs_string_to_entry_user(const char *flags, int nflags,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : struct ffs_entry_user *user)</a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : if (!user || !flags)</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : memset(user, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; nflags; i++) {</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : switch (flags[i]) {</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : case 'E':</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : user-&gt;datainteg |= FFS_ENRY_INTEG_ECC;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : case 'L':</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : user-&gt;vercheck |= FFS_VERCHECK_SHA512V;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : case 'I':</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : user-&gt;vercheck |= FFS_VERCHECK_SHA512EC;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : case 'P':</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_PRESERVED;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : case 'R':</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_READONLY;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : case 'B':</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_BACKUP;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : case 'F':</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_REPROVISION;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : case 'G':</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_GOLDEN;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : case 'C':</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_CLEARECC;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : case 'V':</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_VOLATILE;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Unknown flag '%c'\n&quot;, flags[i]);</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : }</a>
+<a name="251"><span class="lineNum"> 251 </span> : : }</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> : : return 0;</a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : bool has_flag(struct ffs_entry *ent, uint16_t flag)</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : return ((ent-&gt;user.miscflags &amp; flag) != 0);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : }</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : static struct ffs_entry *__ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : {</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : if (index &gt;= ffs-&gt;hdr.count)</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : return NULL;</a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : return ffs-&gt;hdr.entries[index];</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ret = __ffs_entry_get(ffs, index);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : if (ret)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : ret-&gt;ref++;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : return ret;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ffs_entry_put(struct ffs_entry *ent)</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : {</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : if (!ent)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return NULL;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : ent-&gt;ref--;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : if (ent-&gt;ref == 0) {</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : free(ent);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : ent = NULL;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> : : return ent;</a>
+<a name="288"><span class="lineNum"> 288 </span> : : }</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineNoCov"> 0 : bool has_ecc(struct ffs_entry *ent)</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : {</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return ((ent-&gt;user.datainteg &amp; FFS_ENRY_INTEG_ECC) != 0);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : struct ffs_handle **ffs, bool mark_ecc)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : struct __ffs_hdr blank_hdr;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : struct __ffs_hdr raw_hdr;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : struct ffs_handle *f;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : uint64_t total_size;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : int rc, i;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : if (!ffs || !bl)</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineNoCov"> 0 : *ffs = NULL;</span></a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, &amp;total_size, NULL);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d retrieving flash info\n&quot;, rc);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : }</a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : if (total_size &gt; UINT_MAX)</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : if ((offset + max_size) &lt; offset)</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : if ((max_size &gt; total_size))</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Read flash header */</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, offset, &amp;raw_hdr, sizeof(raw_hdr));</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash header\n&quot;, rc);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /*</a>
+<a name="329"><span class="lineNum"> 329 </span> : : * Flash controllers can get deconfigured or otherwise upset, when this</a>
+<a name="330"><span class="lineNum"> 330 </span> : : * happens they return all 0xFF bytes.</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * An __ffs_hdr consisting of all 0xFF cannot be valid and it would be</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * nice to drop a hint to the user to help with debugging. This will</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * help quickly differentiate between flash corruption and standard</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * type 'reading from the wrong place' errors vs controller errors or</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * reading erased data.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : memset(&amp;blank_hdr, UINT_MAX, sizeof(struct __ffs_hdr));</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : if (memcmp(&amp;blank_hdr, &amp;raw_hdr, sizeof(struct __ffs_hdr)) == 0) {</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Reading the flash has returned all 0xFF.\n&quot;);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Are you reading erased flash?\n&quot;);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Is something else using the flash controller?\n&quot;);</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_BAD_READ;</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : }</a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> : : /* Allocate ffs_handle structure and start populating */</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : f = calloc(1, sizeof(*f));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : if (!f)</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : f-&gt;toc_offset = offset;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : f-&gt;max_size = max_size;</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : f-&gt;bl = bl;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : </a>
+<a name="354"><span class="lineNum"> 354 </span> : : /* Convert and check flash header */</a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineNoCov"> 0 : rc = ffs_check_convert_header(&amp;f-&gt;hdr, &amp;raw_hdr);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : FL_INF(&quot;FFS: Flash header not found. Code: %d\n&quot;, rc);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> : : }</a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Check header is sane */</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : if ((f-&gt;hdr.block_count * f-&gt;hdr.block_size) &gt; max_size) {</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Flash header exceeds max flash size\n&quot;);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : }</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : f-&gt;hdr.entries = calloc(f-&gt;hdr.entries_size, sizeof(struct ffs_entry *));</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> : : /*</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * Grab the entire partition header</a>
+<a name="372"><span class="lineNum"> 372 </span> : : */</a>
+<a name="373"><span class="lineNum"> 373 </span> : : /* Check for overflow or a silly size */</a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : if (!f-&gt;hdr.size || f-&gt;hdr.size % f-&gt;hdr.block_size != 0) {</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Cache size overflow (0x%x * 0x%x)\n&quot;,</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : f-&gt;hdr.block_size, f-&gt;hdr.size);</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : }</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Partition map size: 0x%x\n&quot;, f-&gt;hdr.size);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> : : /* Allocate cache */</a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : f-&gt;cache = malloc(f-&gt;hdr.size);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineNoCov"> 0 : if (!f-&gt;cache) {</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> : : /* Read the cached map */</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, offset, f-&gt;cache, f-&gt;hdr.size);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash partition map\n&quot;, rc);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; f-&gt;hdr.entries_size; i++) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent = calloc(1, sizeof(struct ffs_entry));</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : if (!ent) {</span></a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : }</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : f-&gt;hdr.entries[f-&gt;hdr.count++] = ent;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : ent-&gt;ref = 1;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_to_cpu(&amp;f-&gt;hdr, ent, &amp;f-&gt;cache-&gt;entries[i]);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Failed checksum for partition %s\n&quot;,</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : f-&gt;cache-&gt;entries[i].name);</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : }</a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : if (mark_ecc &amp;&amp; has_ecc(ent)) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_ecc_protect(bl, ent-&gt;base, ent-&gt;size);</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;Failed to blocklevel_ecc_protect(0x%08x, 0x%08x)\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : ent-&gt;base, ent-&gt;size);</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : }</a>
+<a name="420"><span class="lineNum"> 420 </span> : : }</a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : if (rc == 0)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : *ffs = f;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : else</a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : ffs_close(f);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : return rc;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : }</a>
+<a name="431"><span class="lineNum"> 431 </span> : : </a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : static void __hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> : : {</a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : if (!hdr)</span></a>
+<a name="437"><span class="lineNum"> 437 </span> : : return;</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; hdr-&gt;count; i++)</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : ffs_entry_put(hdr-&gt;entries[i]);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : free(hdr-&gt;entries);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : }</a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : void ffs_hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : __hdr_free(hdr);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : free(hdr);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineNoCov"> 0 : void ffs_close(struct ffs_handle *ffs)</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : {</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : __hdr_free(&amp;ffs-&gt;hdr);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> : : </a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineNoCov"> 0 : if (ffs-&gt;cache)</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : free(ffs-&gt;cache);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : </a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineNoCov"> 0 : free(ffs);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="459"><span class="lineNum"> 459 </span> : : </a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : int ffs_lookup_part(struct ffs_handle *ffs, const char *name,</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : uint32_t *part_idx)</a>
+<a name="462"><span class="lineNum"> 462 </span> : : {</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineNoCov"> 0 : struct ffs_entry **ents = ffs-&gt;hdr.entries;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineNoCov"> 0 : for (i = 0;</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : i &lt; ffs-&gt;hdr.count &amp;&amp;</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineNoCov"> 0 : strncmp(name, ents[i]-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : i++);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : if (i == ffs-&gt;hdr.count)</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineNoCov"> 0 : if (part_idx)</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : *part_idx = i;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> : : return 0;</a>
+<a name="477"><span class="lineNum"> 477 </span> : : }</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : int ffs_part_info(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : char **name, uint32_t *start,</a>
+<a name="481"><span class="lineNum"> 481 </span> : : uint32_t *total_size, uint32_t *act_size, bool *ecc)</a>
+<a name="482"><span class="lineNum"> 482 </span> : : {</a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : char *n;</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineNoCov"> 0 : if (!ent)</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : if (start)</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : *start = ent-&gt;base;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : *total_size = ent-&gt;size;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : if (act_size)</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : *act_size = ent-&gt;actual;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : if (ecc)</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : *ecc = has_ecc(ent);</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : if (name) {</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : n = calloc(1, FFS_PART_NAME_MAX + 1);</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : if (!n)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : memcpy(n, ent-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : *name = n;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : return 0;</a>
+<a name="507"><span class="lineNum"> 507 </span> : : }</a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> : : /*</a>
+<a name="510"><span class="lineNum"> 510 </span> : : * There are quite a few ways one might consider two ffs_handles to be the</a>
+<a name="511"><span class="lineNum"> 511 </span> : : * same. For the purposes of this function we are trying to detect a fairly</a>
+<a name="512"><span class="lineNum"> 512 </span> : : * specific scenario:</a>
+<a name="513"><span class="lineNum"> 513 </span> : : * Consecutive calls to ffs_next_side() may succeed but have gone circular.</a>
+<a name="514"><span class="lineNum"> 514 </span> : : * It is possible that the OTHER_SIDE partition in one TOC actually points</a>
+<a name="515"><span class="lineNum"> 515 </span> : : * back to the TOC to first ffs_handle.</a>
+<a name="516"><span class="lineNum"> 516 </span> : : * This function compares for this case, therefore the requirements are</a>
+<a name="517"><span class="lineNum"> 517 </span> : : * simple, the underlying blocklevel_devices must be the same along with</a>
+<a name="518"><span class="lineNum"> 518 </span> : : * the toc_offset and the max_size.</a>
+<a name="519"><span class="lineNum"> 519 </span> : : */</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : bool ffs_equal(struct ffs_handle *one, struct ffs_handle *two)</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : {</a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : return (!one &amp;&amp; !two) || (one &amp;&amp; two &amp;&amp; one-&gt;bl == two-&gt;bl</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : &amp;&amp; one-&gt;toc_offset == two-&gt;toc_offset</a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : &amp;&amp; one-&gt;max_size == two-&gt;max_size);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : int ffs_next_side(struct ffs_handle *ffs, struct ffs_handle **new_ffs,</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : bool mark_ecc)</a>
+<a name="529"><span class="lineNum"> 529 </span> : : {</a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : uint32_t index, offset, max_size;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : </a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : if (!ffs || !new_ffs)</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : </a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : *new_ffs = NULL;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : rc = ffs_lookup_part(ffs, &quot;OTHER_SIDE&quot;, &amp;index);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : return rc;</a>
+<a name="541"><span class="lineNum"> 541 </span> : : </a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : rc = ffs_part_info(ffs, index, NULL, &amp;offset, &amp;max_size, NULL, NULL);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : return rc;</a>
+<a name="545"><span class="lineNum"> 545 </span> : : </a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : return ffs_init(offset, max_size, ffs-&gt;bl, new_ffs, mark_ecc);</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : }</a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : {</a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : const char *smallest_name;</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : uint32_t smallest_base, toc_base;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFFS: Adding '%s' at 0x%08x..0x%08x\n&quot;,</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : entry-&gt;name, entry-&gt;base, entry-&gt;base + entry-&gt;size);</a>
+<a name="557"><span class="lineNum"> 557 </span> : : </a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == 0) {</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFFS: Adding an entry to an empty header\n&quot;);</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : }</a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base + entry-&gt;size &gt; hdr-&gt;block_size * hdr-&gt;block_count)</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="564"><span class="lineNum"> 564 </span> : : </a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : smallest_base = entry-&gt;base;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : smallest_name = entry-&gt;name;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : toc_base = 0;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : /*</a>
+<a name="569"><span class="lineNum"> 569 </span> : : * TODO: This may have assumed entries was sorted</a>
+<a name="570"><span class="lineNum"> 570 </span> : : */</a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent = hdr-&gt;entries[i];</span></a>
+<a name="573"><span class="lineNum"> 573 </span> : : </a>
+<a name="574"><span class="lineNum"> 574 </span> : : /* Don't allow same names to differ only by case */</a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineNoCov"> 0 : if (strncasecmp(entry-&gt;name, ent-&gt;name, FFS_PART_NAME_MAX) == 0)</span></a>
+<a name="576"><span class="lineNum"> 576 </span> : : return FFS_ERR_BAD_PART_NAME;</a>
+<a name="577"><span class="lineNum"> 577 </span> : : </a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base &gt;= ent-&gt;base &amp;&amp; entry-&gt;base &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="579"><span class="lineNum"> 579 </span> : : return FFS_ERR_BAD_PART_BASE;</a>
+<a name="580"><span class="lineNum"> 580 </span> : : </a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base + entry-&gt;size &gt; ent-&gt;base &amp;&amp;</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : entry-&gt;base + entry-&gt;size &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="583"><span class="lineNum"> 583 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;actual &gt; entry-&gt;size)</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="587"><span class="lineNum"> 587 </span> : : </a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;pid != FFS_PID_TOPLEVEL)</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : return FFS_ERR_BAD_PART_PID;</a>
+<a name="590"><span class="lineNum"> 590 </span> : : </a>
+<a name="591"><span class="lineNum"> 591 </span> : : /* First partition is the partition table */</a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineNoCov"> 0 : if (i == 0) {</span></a>
+<a name="593"><span class="lineNum"> 593 </span> : : toc_base = ent-&gt;base;</a>
+<a name="594"><span class="lineNum"> 594 </span> : : } else {</a>
+<a name="595"><span class="lineNum"> 595 </span> : : /*</a>
+<a name="596"><span class="lineNum"> 596 </span> : : * We're looking for the partition directly</a>
+<a name="597"><span class="lineNum"> 597 </span> : : * after the toc to make sure we don't</a>
+<a name="598"><span class="lineNum"> 598 </span> : : * overflow onto it.</a>
+<a name="599"><span class="lineNum"> 599 </span> : : */</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : if (ent-&gt;base &lt; smallest_base &amp;&amp; ent-&gt;base &gt; toc_base) {</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : smallest_base = ent-&gt;base;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : smallest_name = ent-&gt;name;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : }</a>
+<a name="604"><span class="lineNum"> 604 </span> : : }</a>
+<a name="605"><span class="lineNum"> 605 </span> : : }</a>
+<a name="606"><span class="lineNum"> 606 </span> : : /* If the smallest base is before the TOC, don't worry */</a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : if (smallest_base &gt; toc_base &amp;&amp; (hdr-&gt;count + 1) * sizeof(struct __ffs_entry) +</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineNoCov"> 0 : sizeof(struct __ffs_hdr) + toc_base &gt; smallest_base) {</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Adding partition '%s' would cause partition '%s' at &quot;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : &quot;0x%08x to overlap with the header\n&quot;, entry-&gt;name, smallest_name,</a>
+<a name="611"><span class="lineNum"> 611 </span> : : smallest_base);</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_BAD_PART_BASE;</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : }</a>
+<a name="614"><span class="lineNum"> 614 </span> : : </a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == hdr-&gt;entries_size) {</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : struct ffs_entry **old = hdr-&gt;entries;</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = realloc(hdr-&gt;entries,</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : (HDR_ENTRIES_NUM + hdr-&gt;entries_size) * sizeof(struct ffs_entry *));</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : if (!hdr-&gt;entries) {</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = old;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="623"><span class="lineNum"> 623 </span> : : }</a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries_size += HDR_ENTRIES_NUM;</span></a>
+<a name="625"><span class="lineNum"> 625 </span> : : }</a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : entry-&gt;ref++;</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : int ffs_hdr_finalise(struct blocklevel_device *bl, struct ffs_hdr *hdr)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : {</a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : int num_entries, i, rc = 0;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : struct __ffs_hdr *real_hdr;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : num_entries = ffs_num_entries(hdr);</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /* A TOC shouldn't have zero partitions */</a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : if (num_entries == 0)</span></a>
+<a name="641"><span class="lineNum"> 641 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="642"><span class="lineNum"> 642 </span> : : </a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : real_hdr = malloc(ffs_hdr_raw_size(num_entries));</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : if (!real_hdr)</span></a>
+<a name="645"><span class="lineNum"> 645 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="646"><span class="lineNum"> 646 </span> : : </a>
+<a name="647"><span class="lineNum"> 647 </span> : : /*</a>
+<a name="648"><span class="lineNum"> 648 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="649"><span class="lineNum"> 649 </span> : : * real_hdr-&gt;checksum must be zero before calling ffs_hdr_checksum()</a>
+<a name="650"><span class="lineNum"> 650 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="651"><span class="lineNum"> 651 </span> : : * appears the reserved fields are always zero.</a>
+<a name="652"><span class="lineNum"> 652 </span> : : */</a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : memset(real_hdr, 0, sizeof(*real_hdr));</span></a>
+<a name="654"><span class="lineNum"> 654 </span> : : </a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : hdr-&gt;part-&gt;size = ffs_hdr_raw_size(num_entries) + hdr-&gt;block_size;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : /*</a>
+<a name="657"><span class="lineNum"> 657 </span> : : * So actual is in bytes. ffs_entry_to_flash() don't do the</a>
+<a name="658"><span class="lineNum"> 658 </span> : : * block_size division that we're relying on</a>
+<a name="659"><span class="lineNum"> 659 </span> : : */</a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineNoCov"> 0 : hdr-&gt;part-&gt;actual = (hdr-&gt;part-&gt;size / hdr-&gt;block_size) * hdr-&gt;block_size;</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;magic = cpu_to_be32(FFS_MAGIC);</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;version = cpu_to_be32(hdr-&gt;version);</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;size = cpu_to_be32(hdr-&gt;part-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;entry_size = cpu_to_be32(sizeof(struct __ffs_entry));</span></a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;entry_count = cpu_to_be32(num_entries);</span></a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;block_size = cpu_to_be32(hdr-&gt;block_size);</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;block_count = cpu_to_be32(hdr-&gt;block_count);</span></a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;checksum = ffs_hdr_checksum(real_hdr);</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : </a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_to_flash(hdr, real_hdr-&gt;entries + i, hdr-&gt;entries[i]);</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't format all entries for new TOC\n&quot;);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : }</a>
+<a name="676"><span class="lineNum"> 676 </span> : : }</a>
+<a name="677"><span class="lineNum"> 677 </span> : : </a>
+<a name="678"><span class="lineNum"> 678 </span> : : /* Don't really care if this fails */</a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : blocklevel_erase(bl, hdr-&gt;part-&gt;base, hdr-&gt;size);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_write(bl, hdr-&gt;part-&gt;base, real_hdr,</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : ffs_hdr_raw_size(num_entries));</a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="684"><span class="lineNum"> 684 </span> : : </a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : free(real_hdr);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> : : }</a>
+<a name="689"><span class="lineNum"> 689 </span> : : </a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : int ffs_entry_user_set(struct ffs_entry *ent, struct ffs_entry_user *user)</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : {</a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineNoCov"> 0 : if (!ent || !user)</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : return -1;</a>
+<a name="694"><span class="lineNum"> 694 </span> : : </a>
+<a name="695"><span class="lineNum"> 695 </span> : : /*</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * Don't allow the user to specify anything we dont't know about.</a>
+<a name="697"><span class="lineNum"> 697 </span> : : * Rationale: This is the library providing access to the FFS structures.</a>
+<a name="698"><span class="lineNum"> 698 </span> : : * If the consumer of the library knows more about FFS structures then</a>
+<a name="699"><span class="lineNum"> 699 </span> : : * questions need to be asked.</a>
+<a name="700"><span class="lineNum"> 700 </span> : : * The other possibility is that they've unknowningly supplied invalid</a>
+<a name="701"><span class="lineNum"> 701 </span> : : * flags, we should tell them.</a>
+<a name="702"><span class="lineNum"> 702 </span> : : */</a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : if (user-&gt;chip)</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : return -1;</a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : if (user-&gt;compresstype)</span></a>
+<a name="706"><span class="lineNum"> 706 </span> : : return -1;</a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineNoCov"> 0 : if (user-&gt;datainteg &amp; ~(FFS_ENRY_INTEG_ECC))</span></a>
+<a name="708"><span class="lineNum"> 708 </span> : : return -1;</a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineNoCov"> 0 : if (user-&gt;vercheck &amp; ~(FFS_VERCHECK_SHA512V | FFS_VERCHECK_SHA512EC))</span></a>
+<a name="710"><span class="lineNum"> 710 </span> : : return -1;</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; ~(FFS_MISCFLAGS_PRESERVED | FFS_MISCFLAGS_BACKUP |</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : FFS_MISCFLAGS_READONLY | FFS_MISCFLAGS_REPROVISION |</a>
+<a name="713"><span class="lineNum"> 713 </span> : : FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_GOLDEN |</a>
+<a name="714"><span class="lineNum"> 714 </span> : : FFS_MISCFLAGS_CLEARECC))</a>
+<a name="715"><span class="lineNum"> 715 </span> : : return -1;</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;ent-&gt;user, user, sizeof(*user));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> : : }</a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineNoCov"> 0 : struct ffs_entry_user ffs_entry_user_get(struct ffs_entry *ent)</span></a>
+<a name="722"><span class="lineNum"> 722 </span> : : {</a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : struct ffs_entry_user user = { 0 };</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : </a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineNoCov"> 0 : if (ent)</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;user, &amp;ent-&gt;user, sizeof(user));</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : </a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : return user;</span></a>
+<a name="729"><span class="lineNum"> 729 </span> : : }</a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineNoCov"> 0 : int ffs_entry_new(const char *name, uint32_t base, uint32_t size, struct ffs_entry **r)</span></a>
+<a name="732"><span class="lineNum"> 732 </span> : : {</a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ret;</span></a>
+<a name="734"><span class="lineNum"> 734 </span> : : </a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="738"><span class="lineNum"> 738 </span> : : </a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineNoCov"> 0 : strncpy(ret-&gt;name, name, FFS_PART_NAME_MAX);</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineNoCov"> 0 : ret-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineNoCov"> 0 : ret-&gt;base = base;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : ret-&gt;size = size;</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : ret-&gt;actual = size;</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineNoCov"> 0 : ret-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineNoCov"> 0 : ret-&gt;type = FFS_TYPE_DATA;</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : ret-&gt;ref = 1;</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineNoCov"> 0 : *r = ret;</span></a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="750"><span class="lineNum"> 750 </span> : : }</a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineNoCov"> 0 : int ffs_entry_set_act_size(struct ffs_entry *ent, uint32_t actual_size)</span></a>
+<a name="753"><span class="lineNum"> 753 </span> : : {</a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineNoCov"> 0 : if (!ent)</span></a>
+<a name="755"><span class="lineNum"> 755 </span> : : return -1;</a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineNoCov"> 0 : if (actual_size &gt; ent-&gt;size)</span></a>
+<a name="758"><span class="lineNum"> 758 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="759"><span class="lineNum"> 759 </span> : : </a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineNoCov"> 0 : ent-&gt;actual = actual_size;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : </a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : </a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineNoCov"> 0 : int ffs_hdr_new(uint32_t block_size, uint32_t block_count,</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : struct ffs_entry **e, struct ffs_hdr **r)</a>
+<a name="767"><span class="lineNum"> 767 </span> : : {</a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : struct ffs_hdr *ret;</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *part_table;</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : </a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="775"><span class="lineNum"> 775 </span> : : </a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineNoCov"> 0 : ret-&gt;version = FFS_VERSION_1;</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineNoCov"> 0 : ret-&gt;block_size = block_size;</span></a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineNoCov"> 0 : ret-&gt;block_count = block_count;</span></a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries = calloc(HDR_ENTRIES_NUM, sizeof(struct ffs_entry *));</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries_size = HDR_ENTRIES_NUM;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineNoCov"> 0 : if (!e || !(*e)) {</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : /* Don't know how big it will be, ffs_hdr_finalise() will fix */</a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_new(&quot;part&quot;, 0, 0, &amp;part_table);</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : free(ret);</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="788"><span class="lineNum"> 788 </span> : : }</a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineNoCov"> 0 : if (e)</span></a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineNoCov"> 0 : *e = part_table;</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : } else {</a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : part_table = *e;</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : }</a>
+<a name="794"><span class="lineNum"> 794 </span> : : </a>
+<a name="795"><span class="lineNum"> 795 </span> : : /* If the user still holds a ref to e, then inc the refcount */</a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineNoCov"> 0 : if (e)</span></a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineNoCov"> 0 : part_table-&gt;ref++;</span></a>
+<a name="798"><span class="lineNum"> 798 </span> : : </a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : ret-&gt;part = part_table;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : part_table-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineNoCov"> 0 : part_table-&gt;type = FFS_TYPE_PARTITION;</span></a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineNoCov"> 0 : part_table-&gt;flags = FFS_FLAGS_PROTECTED;</span></a>
+<a name="804"><span class="lineNum"> 804 </span> : : </a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries[0] = part_table;</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : ret-&gt;count = 1;</span></a>
+<a name="807"><span class="lineNum"> 807 </span> : : </a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineNoCov"> 0 : *r = ret;</span></a>
+<a name="809"><span class="lineNum"> 809 </span> : : </a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="811"><span class="lineNum"> 811 </span> : : }</a>
+<a name="812"><span class="lineNum"> 812 </span> : : </a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineNoCov"> 0 : int ffs_update_act_size(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="814"><span class="lineNum"> 814 </span> : : uint32_t act_size)</a>
+<a name="815"><span class="lineNum"> 815 </span> : : {</a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent;</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineNoCov"> 0 : struct __ffs_entry raw_ent;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineNoCov"> 0 : uint32_t offset;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="820"><span class="lineNum"> 820 </span> : : </a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineNoCov"> 0 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : if (!ent) {</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Entry not found\n&quot;);</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_PART_NOT_FOUND;</span></a>
+<a name="825"><span class="lineNum"> 825 </span> : : }</a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : offset = ffs-&gt;toc_offset + ffs_hdr_raw_size(part_idx);</span></a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: part index %d at offset 0x%08x\n&quot;,</span></a>
+<a name="828"><span class="lineNum"> 828 </span> : : part_idx, offset);</a>
+<a name="829"><span class="lineNum"> 829 </span> : : </a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : if (ent-&gt;actual == act_size) {</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: ent-&gt;actual alrady matches: 0x%08x==0x%08x\n&quot;,</span></a>
+<a name="832"><span class="lineNum"> 832 </span> : : act_size, ent-&gt;actual);</a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> : : }</a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineNoCov"> 0 : ent-&gt;actual = act_size;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_to_flash(&amp;ffs-&gt;hdr, &amp;raw_ent, ent);</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : return rc;</a>
+<a name="840"><span class="lineNum"> 840 </span> : : </a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineNoCov"> 0 : return blocklevel_smart_write(ffs-&gt;bl, offset, &amp;raw_ent, sizeof(struct __ffs_entry));</span></a>
+<a name="842"><span class="lineNum"> 842 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/libflash.c.func-sort-c.html b/coverage-report/external/gard/libflash/libflash.c.func-sort-c.html
new file mode 100644
index 0000000..b224d56
--- /dev/null
+++ b/coverage-report/external/gard/libflash/libflash.c.func-sort-c.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libflash.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/libflash.c.func.html b/coverage-report/external/gard/libflash/libflash.c.func.html
new file mode 100644
index 0000000..5b9f010
--- /dev/null
+++ b/coverage-report/external/gard/libflash/libflash.c.func.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libflash.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/gard/libflash/libflash.c.gcov.html b/coverage-report/external/gard/libflash/libflash.c.gcov.html
new file mode 100644
index 0000000..5444a72
--- /dev/null
+++ b/coverage-report/external/gard/libflash/libflash.c.gcov.html
@@ -0,0 +1,949 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/gard/libflash/libflash.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/gard/libflash</a> - libflash.c<span style="font-size: 80%;"> (source / <a href="libflash.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;string.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;libflash-priv.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : static const struct flash_info flash_info[] = {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : { 0xc22018, 0x01000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL12835F&quot;},</a>
+<a name="16"><span class="lineNum"> 16 </span> : : { 0xc22019, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL25635F&quot;},</a>
+<a name="17"><span class="lineNum"> 17 </span> : : { 0xc2201a, 0x04000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL51235F&quot;},</a>
+<a name="18"><span class="lineNum"> 18 </span> : : { 0xc2201b, 0x08000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MX66L1G45G&quot;},</a>
+<a name="19"><span class="lineNum"> 19 </span> : : { 0xef4018, 0x01000000, FL_ERASE_ALL, &quot;Winbond W25Q128BV&quot; },</a>
+<a name="20"><span class="lineNum"> 20 </span> : : { 0xef4019, 0x02000000, FL_ERASE_ALL | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="21"><span class="lineNum"> 21 </span> : : FL_ERASE_BULK,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : &quot;Winbond W25Q256BV&quot;},</a>
+<a name="23"><span class="lineNum"> 23 </span> : : { 0x20ba20, 0x04000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="24"><span class="lineNum"> 24 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : &quot;Micron N25Qx512Ax&quot; },</a>
+<a name="26"><span class="lineNum"> 26 </span> : : { 0x20ba19, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="27"><span class="lineNum"> 27 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="28"><span class="lineNum"> 28 </span> : : &quot;Micron N25Q256Ax&quot; },</a>
+<a name="29"><span class="lineNum"> 29 </span> : : { 0x1940ef, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="30"><span class="lineNum"> 30 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="31"><span class="lineNum"> 31 </span> : : &quot;Micron N25Qx256Ax&quot; },</a>
+<a name="32"><span class="lineNum"> 32 </span> : : { 0x4d5444, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;File Abstraction&quot;},</a>
+<a name="33"><span class="lineNum"> 33 </span> : : { 0x55aa55, 0x00100000, FL_ERASE_ALL | FL_CAN_4B, &quot;TEST_FLASH&quot; },</a>
+<a name="34"><span class="lineNum"> 34 </span> : : { 0xaa55aa, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;EMULATED_FLASH&quot;},</a>
+<a name="35"><span class="lineNum"> 35 </span> : : };</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct flash_chip {</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct spi_flash_ctrl *ctrl; /* Controller */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct flash_info info; /* Flash info */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t tsize; /* Corrected flash size */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint32_t min_erase_mask; /* Minimum erase size */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : bool mode_4b; /* Flash currently in 4b mode */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct flash_req *cur_req; /* Current request */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : void *smart_buf; /* Buffer for smart writes */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct blocklevel_device bl;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : };</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : #ifndef __SKIBOOT__</a>
+<a name="49"><span class="lineNum"> 49 </span> : : bool libflash_debug;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #endif</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : int fl_read_stat(struct spi_flash_ctrl *ct, uint8_t *stat)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_rd(ct, CMD_RDSR, false, 0, stat, 1);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : static void fl_micron_status(struct spi_flash_ctrl *ct)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : uint8_t flst;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /*</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * After a success status on a write or erase, we</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * need to do that command or some chip variants will</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * lock</a>
+<a name="65"><span class="lineNum"> 65 </span> : : */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : ct-&gt;cmd_rd(ct, CMD_MIC_RDFLST, false, 0, &amp;flst, 1);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /* Synchronous write completion, probably need a yield hook */</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : int fl_sync_wait_idle(struct spi_flash_ctrl *ct)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /* XXX Add timeout */</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : for (;;) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : if (!(stat &amp; STAT_WIP)) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;finfo-&gt;flags &amp; FL_MICRON_BUGS)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : fl_micron_status(ct);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : /* return FLASH_ERR_WIP_TIMEOUT; */</a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* Exported for internal use */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : int fl_wren(struct spi_flash_ctrl *ct)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : int i, rc;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* Some flashes need it to be hammered */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 1000; i++) {</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_WREN, false, 0, NULL, 0);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: WREN has WIP status set !\n&quot;);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : }</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WEN)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : return 0;</a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : return FLASH_ERR_WREN_TIMEOUT;</a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : static int flash_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* XXX Add sanity/bound checking */</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /*</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * If the controller supports read and either we are in 3b mode</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * high level read.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;read)</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : return ct-&gt;read(ct, pos, buf, len);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_rd)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_rd(ct, CMD_READ, true, pos, buf, len);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : #define COPY_BUFFER_LENGTH 4096</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /*</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * This provides a wrapper around flash_read on ECCed data</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * len is length of data without ECC attached</a>
+<a name="139"><span class="lineNum"> 139 </span> : : */</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : int flash_read_corrected(struct blocklevel_device *bl, uint32_t pos, void *buf,</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : uint32_t len, bool ecc)</a>
+<a name="142"><span class="lineNum"> 142 </span> : : {</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : uint32_t copylen;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return flash_read(bl, pos, buf, len);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /* Copy the buffer in chunks */</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* What's left to copy? */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : /* Read ECCed data from flash */</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, pos, bufecc, ecc_buffer_size(copylen));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* Extract data from ECCed data */</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : ret = memcpy_from_ecc(buf, bufecc, copylen);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> : : /* Update for next copy */</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : len -= copylen;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : pos += ecc_buffer_size(copylen);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> : : rc = 0;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : static void fl_get_best_erase(struct flash_chip *c, uint32_t dst, uint32_t size,</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : uint32_t *chunk, uint8_t *cmd)</a>
+<a name="187"><span class="lineNum"> 187 </span> : : {</a>
+<a name="188"><span class="lineNum"> 188 </span> : : /* Smaller than 32k, use 4k */</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : if ((dst &amp; 0x7fff) || (size &lt; 0x8000)) {</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : *chunk = 0x1000;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_SE;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : /* Smaller than 64k and 32k is supported, use it */</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : if ((c-&gt;info.flags &amp; FL_ERASE_32K) &amp;&amp;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : ((dst &amp; 0xffff) || (size &lt; 0x10000))) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : }</a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* If 64K is not supported, use whatever smaller size is */</a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : if (!(c-&gt;info.flags &amp; FL_ERASE_64K)) {</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_32K) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : } else {</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : *chunk = 0x1000;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_SE;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* Allright, let's go for 64K */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : *chunk = 0x10000;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : static int flash_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t size)</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : {</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : uint8_t cmd;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> : : /* Some sanity checking */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /* Check boundaries fit erase blocks */</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : if ((dst | size) &amp; c-&gt;min_erase_mask)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : return FLASH_ERR_ERASE_BOUNDARY;</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Erasing 0x%&quot; PRIx64&quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : dst, dst + size);</a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> : : /* Use controller erase if supported */</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;erase)</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, dst, size);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /* Allright, loop as long as there's something to erase */</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : while(size) {</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* How big can we make it based on alignent &amp; size */</a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : fl_get_best_erase(c, dst, size, &amp;chunk, &amp;cmd);</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /* Poke write enable */</a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> : : /* Send erase command */</a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, cmd, true, dst, NULL, 0);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /* Wait for write complete */</a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> : : return 0;</a>
+<a name="264"><span class="lineNum"> 264 </span> : : }</a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : int flash_erase_chip(struct flash_chip *c)</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : {</a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : /* XXX TODO: Fallback to using normal erases */</a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : if (!(c-&gt;info.flags &amp; (FL_ERASE_CHIP|FL_ERASE_BULK)))</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : return FLASH_ERR_CHIP_ER_NOT_SUPPORTED;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Erasing chip...\n&quot;);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* Use controller erase if supported */</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;erase)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, 0, 0xffffffff);</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_CHIP)</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_CE, false, 0, NULL, 0);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : else</a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_MIC_BULK_ERASE, false, 0, NULL, 0);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : return rc;</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> : : /* Wait for write complete */</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return fl_sync_wait_idle(ct);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : static int fl_wpage(struct flash_chip *c, uint32_t dst, const void *src,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : uint32_t size)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : </a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : if (size &lt; 1 || size &gt; 0x100)</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : return FLASH_ERR_BAD_PAGE_SIZE;</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_PP, true, dst, src, size);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : return rc;</a>
+<a name="310"><span class="lineNum"> 310 </span> : : </a>
+<a name="311"><span class="lineNum"> 311 </span> : : /* Wait for write complete */</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : return fl_sync_wait_idle(ct);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : }</a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : static int flash_write(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : uint32_t size, bool verify)</a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : uint32_t todo = size;</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : uint32_t d = dst;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : const void *s = src;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : uint8_t vbuf[0x100];</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : int rc; </span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> : : /* Some sanity checking */</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Writing to 0x%08x..0%08x...\n&quot;, dst, dst + size);</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> : : /*</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * If the controller supports write and either we are in 3b mode</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * high level write.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;write) {</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;write(ct, dst, src, size);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : return rc;</a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : goto writing_done;</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : }</a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /* Iterate for each page to write */</a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineNoCov"> 0 : while(todo) {</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : /* Handle misaligned start */</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : chunk = 0x100 - (d &amp; 0xff);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : if (chunk &gt; todo)</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : chunk = todo;</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : rc = fl_wpage(c, d, s, chunk);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : d += chunk;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : s += chunk;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : todo -= chunk;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : }</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : writing_done:</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : if (!verify)</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : return 0;</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> : : /* Verify */</a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Verifying...\n&quot;);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> : : </a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineNoCov"> 0 : while(size) {</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : chunk = sizeof(vbuf);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : if (chunk &gt; size)</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : chunk = size;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, dst, vbuf, chunk);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : if (memcmp(vbuf, src, chunk)) {</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Miscompare at 0x%08x\n&quot;, dst);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_VERIFY_FAILURE;</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : }</a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : src += chunk;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="386"><span class="lineNum"> 386 </span> : : }</a>
+<a name="387"><span class="lineNum"> 387 </span> : : return 0;</a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : int flash_write_corrected(struct blocklevel_device *bl, uint32_t pos, const void *buf,</span></a>
+<a name="391"><span class="lineNum"> 391 </span> : : uint32_t len, bool verify, bool ecc)</a>
+<a name="392"><span class="lineNum"> 392 </span> : : {</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : uint32_t copylen, copylen_minus_ecc;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return flash_write(bl, pos, buf, len, verify);</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> : : /* Copy the buffer in chunks */</a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="404"><span class="lineNum"> 404 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* What's left to copy? */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineNoCov"> 0 : copylen_minus_ecc = ecc_buffer_size_minus_ecc(copylen);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : /* Add the ecc byte to the data */</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : ret = memcpy_to_ecc(bufecc, buf, copylen_minus_ecc);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : }</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> : : /* Write ECCed data to the flash */</a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, pos, bufecc, copylen, verify);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> : : /* Update for next copy */</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : len -= copylen_minus_ecc;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen_minus_ecc;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : pos += copylen;</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : }</a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : rc = 0;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : }</a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> : : enum sm_comp_res {</a>
+<a name="437"><span class="lineNum"> 437 </span> : : sm_no_change,</a>
+<a name="438"><span class="lineNum"> 438 </span> : : sm_need_write,</a>
+<a name="439"><span class="lineNum"> 439 </span> : : sm_need_erase,</a>
+<a name="440"><span class="lineNum"> 440 </span> : : };</a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : static enum sm_comp_res flash_smart_comp(struct flash_chip *c,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : const void *src,</a>
+<a name="444"><span class="lineNum"> 444 </span> : : uint32_t offset, uint32_t size)</a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : uint8_t *b = c-&gt;smart_buf + offset;</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : const uint8_t *s = src;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : bool is_same = true;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : uint32_t i;</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* SRC DEST NEED_ERASE</a>
+<a name="452"><span class="lineNum"> 452 </span> : : * 0 1 0</a>
+<a name="453"><span class="lineNum"> 453 </span> : : * 1 1 0</a>
+<a name="454"><span class="lineNum"> 454 </span> : : * 0 0 0</a>
+<a name="455"><span class="lineNum"> 455 </span> : : * 1 0 1</a>
+<a name="456"><span class="lineNum"> 456 </span> : : */</a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; size; i++) {</span></a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* Any bit need to be set, need erase */</a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : if (s[i] &amp; ~b[i])</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : return sm_need_erase;</a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : if (is_same &amp;&amp; (b[i] != s[i]))</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : is_same = false;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : }</a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : return is_same ? sm_no_change : sm_need_write;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : }</a>
+<a name="466"><span class="lineNum"> 466 </span> : : </a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : static int flash_smart_write(struct blocklevel_device *bl, uint64_t dst, const void *src, uint64_t size)</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : {</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : uint32_t er_size = c-&gt;min_erase_mask + 1;</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : uint32_t end = dst + size;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> : : /* Some sanity checking */</a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : if (end &lt;= dst || !size || end &gt; c-&gt;tsize) {</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Smart write param error\n&quot;);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="478"><span class="lineNum"> 478 </span> : : }</a>
+<a name="479"><span class="lineNum"> 479 </span> : : </a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Smart writing to 0x%&quot; PRIx64 &quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="481"><span class="lineNum"> 481 </span> : : dst, dst + size);</a>
+<a name="482"><span class="lineNum"> 482 </span> : : </a>
+<a name="483"><span class="lineNum"> 483 </span> : : /* As long as we have something to write ... */</a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : while(dst &lt; end) {</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : uint32_t page, off, chunk;</span></a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : enum sm_comp_res sr;</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> : : /* Figure out which erase page we are in and read it */</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : page = dst &amp; ~c-&gt;min_erase_mask;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : off = dst &amp; c-&gt;min_erase_mask;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: reading page 0x%08x..0x%08x...\n&quot;,</span></a>
+<a name="492"><span class="lineNum"> 492 </span> : : page, page + er_size);</a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, page, c-&gt;smart_buf, er_size);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...error %d!\n&quot;, rc);</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> : : }</a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> : : /* Locate the chunk of data we are working on */</a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : chunk = er_size - off;</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : if (size &lt; chunk)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : chunk = size;</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> : : /* Compare against what we are writing and ff */</a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : sr = flash_smart_comp(c, src, off, chunk);</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : switch(sr) {</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : case sm_no_change:</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : /* Identical, skip it */</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...same !\n&quot;);</span></a>
+<a name="510"><span class="lineNum"> 510 </span> : : break;</a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : case sm_need_write:</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : /* Just needs writing over */</a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...need write !\n&quot;);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, dst, src, chunk, true);</span></a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Write error %d !\n&quot;, rc);</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : }</a>
+<a name="519"><span class="lineNum"> 519 </span> : : break;</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : case sm_need_erase:</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...need erase !\n&quot;);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : rc = flash_erase(bl, page, er_size);</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: erase error %d !\n&quot;, rc);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="526"><span class="lineNum"> 526 </span> : : }</a>
+<a name="527"><span class="lineNum"> 527 </span> : : /* Then update the portion of the buffer and write the block */</a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : memcpy(c-&gt;smart_buf + off, src, chunk);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, page, c-&gt;smart_buf, er_size, true);</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: write error %d !\n&quot;, rc);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="533"><span class="lineNum"> 533 </span> : : }</a>
+<a name="534"><span class="lineNum"> 534 </span> : : break;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : }</a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineNoCov"> 0 : src += chunk;</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : }</a>
+<a name="540"><span class="lineNum"> 540 </span> : : return 0;</a>
+<a name="541"><span class="lineNum"> 541 </span> : : }</a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : int flash_smart_write_corrected(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : uint32_t size, bool ecc)</a>
+<a name="545"><span class="lineNum"> 545 </span> : : {</a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : struct ecc64 *buf;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : return flash_smart_write(bl, dst, src, size);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : buf = malloc(ecc_buffer_size(size));</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : if (!buf)</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="555"><span class="lineNum"> 555 </span> : : </a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc(buf, src, size);</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : }</a>
+<a name="561"><span class="lineNum"> 561 </span> : : </a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : rc = flash_smart_write(bl, dst, buf, ecc_buffer_size(size));</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : </a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : free(buf);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : </a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineNoCov"> 0 : static int fl_chip_id(struct spi_flash_ctrl *ct, uint8_t *id_buf,</span></a>
+<a name="570"><span class="lineNum"> 570 </span> : : uint32_t *id_size)</a>
+<a name="571"><span class="lineNum"> 571 </span> : : {</a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : </a>
+<a name="575"><span class="lineNum"> 575 </span> : : /* Check initial status */</a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="578"><span class="lineNum"> 578 </span> : : return rc;</a>
+<a name="579"><span class="lineNum"> 579 </span> : : </a>
+<a name="580"><span class="lineNum"> 580 </span> : : /* If stuck writing, wait for idle */</a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash in writing state ! Waiting...\n&quot;);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="585"><span class="lineNum"> 585 </span> : : return rc;</a>
+<a name="586"><span class="lineNum"> 586 </span> : : } else</a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Init status: %02x\n&quot;, stat);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : </a>
+<a name="589"><span class="lineNum"> 589 </span> : : /* Fallback to get ID manually */</a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_rd(ct, CMD_RDID, false, 0, id_buf, 3);</span></a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="592"><span class="lineNum"> 592 </span> : : return rc;</a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : *id_size = 3;</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : </a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : }</a>
+<a name="597"><span class="lineNum"> 597 </span> : : </a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : static int flash_identify(struct flash_chip *c)</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : {</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : const struct flash_info *info = NULL;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : uint32_t iid, id_size;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : #define MAX_ID_SIZE 16</a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineNoCov"> 0 : uint8_t id[MAX_ID_SIZE];</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : int rc, i;</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;chip_id) {</span></a>
+<a name="608"><span class="lineNum"> 608 </span> : : /* High level controller interface */</a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : id_size = MAX_ID_SIZE;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;chip_id(ct, id, &amp;id_size);</span></a>
+<a name="611"><span class="lineNum"> 611 </span> : : } else</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : rc = fl_chip_id(ct, id, &amp;id_size);</span></a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="614"><span class="lineNum"> 614 </span> : : return rc;</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : if (id_size &lt; 3)</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : return FLASH_ERR_CHIP_UNKNOWN;</a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> : : /* Convert to a dword for lookup */</a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : iid = id[0];</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : iid = (iid &lt;&lt; 8) | id[1];</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : iid = (iid &lt;&lt; 8) | id[2];</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash ID: %02x.%02x.%02x (%06x)\n&quot;,</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : id[0], id[1], id[2], iid);</a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> : : /* Lookup in flash_info */</a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; ARRAY_SIZE(flash_info); i++) {</span></a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineNoCov"> 0 : info = &amp;flash_info[i];</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : if (info-&gt;id == iid)</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : break; </a>
+<a name="631"><span class="lineNum"> 631 </span> : : }</a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : if (!info || info-&gt;id != iid)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : return FLASH_ERR_CHIP_UNKNOWN;</a>
+<a name="634"><span class="lineNum"> 634 </span> : : </a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : c-&gt;info = *info;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineNoCov"> 0 : c-&gt;tsize = info-&gt;size;</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : ct-&gt;finfo = &amp;c-&gt;info;</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /*</a>
+<a name="640"><span class="lineNum"> 640 </span> : : * Let controller know about our settings and possibly</a>
+<a name="641"><span class="lineNum"> 641 </span> : : * override them</a>
+<a name="642"><span class="lineNum"> 642 </span> : : */</a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;setup) {</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;setup(ct, &amp;c-&gt;tsize);</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : return rc;</a>
+<a name="647"><span class="lineNum"> 647 </span> : : }</a>
+<a name="648"><span class="lineNum"> 648 </span> : : </a>
+<a name="649"><span class="lineNum"> 649 </span> : : /* Calculate min erase granularity */</a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_4K)</span></a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0xfff;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_32K)</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0x7fff;</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_64K)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0xffff;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : else {</a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* No erase size ? oops ... */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: No erase sizes !\n&quot;);</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CTRL_CONFIG_MISMATCH;</span></a>
+<a name="660"><span class="lineNum"> 660 </span> : : }</a>
+<a name="661"><span class="lineNum"> 661 </span> : : </a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Found chip %s size %dM erase granule: %dK\n&quot;,</span></a>
+<a name="663"><span class="lineNum"> 663 </span> : : c-&gt;info.name, c-&gt;tsize &gt;&gt; 20, (c-&gt;min_erase_mask + 1) &gt;&gt; 10);</a>
+<a name="664"><span class="lineNum"> 664 </span> : : </a>
+<a name="665"><span class="lineNum"> 665 </span> : : return 0;</a>
+<a name="666"><span class="lineNum"> 666 </span> : : }</a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : static int flash_set_4b(struct flash_chip *c, bool enable)</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : {</a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> : : </a>
+<a name="673"><span class="lineNum"> 673 </span> : : /* Don't have low level interface, assume all is well */</a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : return 0;</a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> : : /* Some flash chips want this */</a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Error %d enabling write for set_4b\n&quot;, rc);</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : /* Ignore the error &amp; move on (could be wrprotect chip) */</a>
+<a name="682"><span class="lineNum"> 682 </span> : : }</a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> : : /* Ignore error in case chip is write protected */</a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_wr(ct, enable ? CMD_EN4B : CMD_EX4B, false, 0, NULL, 0);</span></a>
+<a name="686"><span class="lineNum"> 686 </span> : : }</a>
+<a name="687"><span class="lineNum"> 687 </span> : : </a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : int flash_force_4b_mode(struct flash_chip *c, bool enable_4b)</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineNoCov"> 0 : int rc = FLASH_ERR_4B_NOT_SUPPORTED;</span></a>
+<a name="692"><span class="lineNum"> 692 </span> : : </a>
+<a name="693"><span class="lineNum"> 693 </span> : : /*</a>
+<a name="694"><span class="lineNum"> 694 </span> : : * We only allow force 4b if both controller and flash do 4b</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * as this is mainly used if a 3rd party tries to directly</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * access a direct mapped read region</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : if (enable_4b &amp;&amp; !((c-&gt;info.flags &amp; FL_CAN_4B) &amp;&amp; ct-&gt;set_4b))</span></a>
+<a name="699"><span class="lineNum"> 699 </span> : : return rc;</a>
+<a name="700"><span class="lineNum"> 700 </span> : : </a>
+<a name="701"><span class="lineNum"> 701 </span> : : /* Only send to flash directly on controllers that implement</a>
+<a name="702"><span class="lineNum"> 702 </span> : : * the low level callbacks</a>
+<a name="703"><span class="lineNum"> 703 </span> : : */</a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, enable_4b);</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : return rc;</a>
+<a name="708"><span class="lineNum"> 708 </span> : : }</a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> : : /* Then inform the controller */</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, enable_4b);</span></a>
+<a name="713"><span class="lineNum"> 713 </span> : : return rc;</a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> : : </a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : static int flash_configure(struct flash_chip *c)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> : : {</a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> : : /* Crop flash size if necessary */</a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineNoCov"> 0 : if (c-&gt;tsize &gt; 0x01000000 &amp;&amp; !(c-&gt;info.flags &amp; FL_CAN_4B)) {</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash chip cropped to 16M, no 4b mode\n&quot;);</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : c-&gt;tsize = 0x01000000;</span></a>
+<a name="725"><span class="lineNum"> 725 </span> : : }</a>
+<a name="726"><span class="lineNum"> 726 </span> : : </a>
+<a name="727"><span class="lineNum"> 727 </span> : : /* If flash chip &gt; 16M, enable 4b mode */</a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : if (c-&gt;tsize &gt; 0x01000000) {</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash &gt;16MB, enabling 4B mode...\n&quot;);</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> : : /* Set flash to 4b mode if we can */</a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, true);</span></a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set flash 4b mode\n&quot;);</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : }</a>
+<a name="738"><span class="lineNum"> 738 </span> : : }</a>
+<a name="739"><span class="lineNum"> 739 </span> : : </a>
+<a name="740"><span class="lineNum"> 740 </span> : : </a>
+<a name="741"><span class="lineNum"> 741 </span> : : /* Set controller to 4b mode if supported */</a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b) {</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Enabling controller 4B mode...\n&quot;);</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, true);</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set controller 4b mode\n&quot;);</span></a>
+<a name="747"><span class="lineNum"> 747 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="748"><span class="lineNum"> 748 </span> : : }</a>
+<a name="749"><span class="lineNum"> 749 </span> : : }</a>
+<a name="750"><span class="lineNum"> 750 </span> : : } else {</a>
+<a name="751"><span class="lineNum"> 751 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash &lt;=16MB, disabling 4B mode...\n&quot;);</span></a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> : : /*</a>
+<a name="754"><span class="lineNum"> 754 </span> : : * If flash chip supports 4b mode, make sure we disable</a>
+<a name="755"><span class="lineNum"> 755 </span> : : * it in case it was left over by the previous user</a>
+<a name="756"><span class="lineNum"> 756 </span> : : */</a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_CAN_4B) {</span></a>
+<a name="758"><span class="lineNum"> 758 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, false);</span></a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : &quot; clear flash 4b mode\n&quot;);</a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : }</a>
+<a name="765"><span class="lineNum"> 765 </span> : : /* Set controller to 3b mode if mode switch is supported */</a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b) {</span></a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Disabling controller 4B mode...\n&quot;);</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, false);</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : &quot; clear controller 4b mode\n&quot;);</a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="773"><span class="lineNum"> 773 </span> : : }</a>
+<a name="774"><span class="lineNum"> 774 </span> : : }</a>
+<a name="775"><span class="lineNum"> 775 </span> : : }</a>
+<a name="776"><span class="lineNum"> 776 </span> : : return 0;</a>
+<a name="777"><span class="lineNum"> 777 </span> : : }</a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : static int flash_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="780"><span class="lineNum"> 780 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="781"><span class="lineNum"> 781 </span> : : {</a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> :<span class="lineNoCov"> 0 : if (name)</span></a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineNoCov"> 0 : *name = c-&gt;info.name;</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : *total_size = c-&gt;tsize;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineNoCov"> 0 : *erase_granule = c-&gt;min_erase_mask + 1;</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : }</a>
+<a name="791"><span class="lineNum"> 791 </span> : : </a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : int flash_init(struct spi_flash_ctrl *ctrl, struct blocklevel_device **bl,</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : struct flash_chip **flash_chip)</a>
+<a name="794"><span class="lineNum"> 794 </span> : : {</a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c;</span></a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="797"><span class="lineNum"> 797 </span> : : </a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineNoCov"> 0 : if (!bl)</span></a>
+<a name="799"><span class="lineNum"> 799 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : *bl = NULL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> : : </a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineNoCov"> 0 : c = malloc(sizeof(struct flash_chip));</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineNoCov"> 0 : if (!c)</span></a>
+<a name="805"><span class="lineNum"> 805 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : memset(c, 0, sizeof(*c));</span></a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineNoCov"> 0 : c-&gt;ctrl = ctrl;</span></a>
+<a name="808"><span class="lineNum"> 808 </span> : : </a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineNoCov"> 0 : rc = flash_identify(c);</span></a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash identification failed\n&quot;);</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : }</a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineNoCov"> 0 : c-&gt;smart_buf = malloc(c-&gt;min_erase_mask + 1);</span></a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineNoCov"> 0 : if (!c-&gt;smart_buf) {</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to allocate smart buffer !\n&quot;);</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : }</a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineNoCov"> 0 : rc = flash_configure(c);</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash configuration failed\n&quot;);</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : bail:</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="825"><span class="lineNum"> 825 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="827"><span class="lineNum"> 827 </span> : : }</a>
+<a name="828"><span class="lineNum"> 828 </span> : : </a>
+<a name="829"><span class="lineNum"> 829 </span> : : /* The flash backend doesn't support reiniting it */</a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.keep_alive = true;</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.reacquire = NULL;</span></a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.release = NULL;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.read = &amp;flash_read;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.write = &amp;flash_smart_write;</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.erase = &amp;flash_erase;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.get_info = &amp;flash_get_info;</span></a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.erase_mask = c-&gt;min_erase_mask;</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : </a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineNoCov"> 0 : *bl = &amp;(c-&gt;bl);</span></a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineNoCov"> 0 : if (flash_chip)</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineNoCov"> 0 : *flash_chip = c;</span></a>
+<a name="843"><span class="lineNum"> 843 </span> : : </a>
+<a name="844"><span class="lineNum"> 844 </span> : : return 0;</a>
+<a name="845"><span class="lineNum"> 845 </span> : : }</a>
+<a name="846"><span class="lineNum"> 846 </span> : : </a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineNoCov"> 0 : void flash_exit(struct blocklevel_device *bl)</span></a>
+<a name="848"><span class="lineNum"> 848 </span> : : {</a>
+<a name="849"><span class="lineNum"> 849 </span> : : /* XXX Make sure we are idle etc... */</a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineNoCov"> 0 : if (bl) {</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineNoCov"> 0 : free(c-&gt;smart_buf);</span></a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="854"><span class="lineNum"> 854 </span> : : }</a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="856"><span class="lineNum"> 856 </span> : : </a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : void flash_exit_close(struct blocklevel_device *bl, void (*close)(struct spi_flash_ctrl *ctrl))</span></a>
+<a name="858"><span class="lineNum"> 858 </span> : : {</a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineNoCov"> 0 : if (bl) {</span></a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : close(c-&gt;ctrl);</span></a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : }</a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/endian/endian.h.func-sort-c.html b/coverage-report/external/pflash/ccan/endian/endian.h.func-sort-c.html
new file mode 100644
index 0000000..d0224d4
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/endian/endian.h.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/pflash/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="endian.h.func.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/endian/endian.h.func.html b/coverage-report/external/pflash/ccan/endian/endian.h.func.html
new file mode 100644
index 0000000..2f03811
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/endian/endian.h.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/endian/endian.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/pflash/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (<a href="endian.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="endian.h.func-sort-c.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#314">be64_to_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="endian.h.gcov.html#287">cpu_to_be64</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/endian/endian.h.gcov.html b/coverage-report/external/pflash/ccan/endian/endian.h.gcov.html
new file mode 100644
index 0000000..79f2888
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/endian/endian.h.gcov.html
@@ -0,0 +1,440 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/endian/endian.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/pflash/ccan/endian</a> - endian.h<span style="font-size: 80%;"> (source / <a href="endian.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* CC0 (Public domain) - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #ifndef CCAN_ENDIAN_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #define CCAN_ENDIAN_H</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;config.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : /**</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * BSWAP_16 - reverse bytes in a constant uint16_t value.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : *</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * Example:</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * struct mystruct {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * char buf[BSWAP_16(0x1234)];</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define BSWAP_16(val) \</a>
+<a name="19"><span class="lineNum"> 19 </span> : : ((((uint16_t)(val) &amp; 0x00ff) &lt;&lt; 8) \</a>
+<a name="20"><span class="lineNum"> 20 </span> : : | (((uint16_t)(val) &amp; 0xff00) &gt;&gt; 8))</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : /**</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * BSWAP_32 - reverse bytes in a constant uint32_t value.</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * @val: constant value whose bytes to swap.</a>
+<a name="25"><span class="lineNum"> 25 </span> : : *</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="27"><span class="lineNum"> 27 </span> : : *</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Example:</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * struct mystruct {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * char buf[BSWAP_32(0xff000000)];</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #define BSWAP_32(val) \</a>
+<a name="34"><span class="lineNum"> 34 </span> : : ((((uint32_t)(val) &amp; 0x000000ff) &lt;&lt; 24) \</a>
+<a name="35"><span class="lineNum"> 35 </span> : : | (((uint32_t)(val) &amp; 0x0000ff00) &lt;&lt; 8) \</a>
+<a name="36"><span class="lineNum"> 36 </span> : : | (((uint32_t)(val) &amp; 0x00ff0000) &gt;&gt; 8) \</a>
+<a name="37"><span class="lineNum"> 37 </span> : : | (((uint32_t)(val) &amp; 0xff000000) &gt;&gt; 24))</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /**</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * BSWAP_64 - reverse bytes in a constant uint64_t value.</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * @val: constantvalue whose bytes to swap.</a>
+<a name="42"><span class="lineNum"> 42 </span> : : *</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Designed to be usable in constant-requiring initializers.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * Example:</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * struct mystruct {</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * char buf[BSWAP_64(0xff00000000000000ULL)];</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * };</a>
+<a name="49"><span class="lineNum"> 49 </span> : : */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #define BSWAP_64(val) \</a>
+<a name="51"><span class="lineNum"> 51 </span> : : ((((uint64_t)(val) &amp; 0x00000000000000ffULL) &lt;&lt; 56) \</a>
+<a name="52"><span class="lineNum"> 52 </span> : : | (((uint64_t)(val) &amp; 0x000000000000ff00ULL) &lt;&lt; 40) \</a>
+<a name="53"><span class="lineNum"> 53 </span> : : | (((uint64_t)(val) &amp; 0x0000000000ff0000ULL) &lt;&lt; 24) \</a>
+<a name="54"><span class="lineNum"> 54 </span> : : | (((uint64_t)(val) &amp; 0x00000000ff000000ULL) &lt;&lt; 8) \</a>
+<a name="55"><span class="lineNum"> 55 </span> : : | (((uint64_t)(val) &amp; 0x000000ff00000000ULL) &gt;&gt; 8) \</a>
+<a name="56"><span class="lineNum"> 56 </span> : : | (((uint64_t)(val) &amp; 0x0000ff0000000000ULL) &gt;&gt; 24) \</a>
+<a name="57"><span class="lineNum"> 57 </span> : : | (((uint64_t)(val) &amp; 0x00ff000000000000ULL) &gt;&gt; 40) \</a>
+<a name="58"><span class="lineNum"> 58 </span> : : | (((uint64_t)(val) &amp; 0xff00000000000000ULL) &gt;&gt; 56))</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : #if HAVE_BYTESWAP_H</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #include &lt;byteswap.h&gt;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #else</a>
+<a name="63"><span class="lineNum"> 63 </span> : : /**</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * bswap_16 - reverse bytes in a uint16_t value.</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * @val: value whose bytes to swap.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * Example:</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * // Output contains &quot;1024 is 4 as two bytes reversed&quot;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * printf(&quot;1024 is %u as two bytes reversed\n&quot;, bswap_16(1024));</a>
+<a name="70"><span class="lineNum"> 70 </span> : : */</a>
+<a name="71"><span class="lineNum"> 71 </span> : : static inline uint16_t bswap_16(uint16_t val)</a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> : : return BSWAP_16(val);</a>
+<a name="74"><span class="lineNum"> 74 </span> : : }</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : /**</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * bswap_32 - reverse bytes in a uint32_t value.</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * @val: value whose bytes to swap.</a>
+<a name="79"><span class="lineNum"> 79 </span> : : *</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * Example:</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * // Output contains &quot;1024 is 262144 as four bytes reversed&quot;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * printf(&quot;1024 is %u as four bytes reversed\n&quot;, bswap_32(1024));</a>
+<a name="83"><span class="lineNum"> 83 </span> : : */</a>
+<a name="84"><span class="lineNum"> 84 </span> : : static inline uint32_t bswap_32(uint32_t val)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> : : return BSWAP_32(val);</a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : #endif /* !HAVE_BYTESWAP_H */</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : #if !HAVE_BSWAP_64</a>
+<a name="91"><span class="lineNum"> 91 </span> : : /**</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * bswap_64 - reverse bytes in a uint64_t value.</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * @val: value whose bytes to swap.</a>
+<a name="94"><span class="lineNum"> 94 </span> : : *</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * Example:</a>
+<a name="96"><span class="lineNum"> 96 </span> : : * // Output contains &quot;1024 is 1125899906842624 as eight bytes reversed&quot;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * printf(&quot;1024 is %llu as eight bytes reversed\n&quot;,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : * (unsigned long long)bswap_64(1024));</a>
+<a name="99"><span class="lineNum"> 99 </span> : : */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : static inline uint64_t bswap_64(uint64_t val)</a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : return BSWAP_64(val);</a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : #endif</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : /* Needed for Glibc like endiness check */</a>
+<a name="107"><span class="lineNum"> 107 </span> : : #define __LITTLE_ENDIAN 1234</a>
+<a name="108"><span class="lineNum"> 108 </span> : : #define __BIG_ENDIAN 4321</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* Sanity check the defines. We don't handle weird endianness. */</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #if !HAVE_LITTLE_ENDIAN &amp;&amp; !HAVE_BIG_ENDIAN</a>
+<a name="112"><span class="lineNum"> 112 </span> : : #error &quot;Unknown endian&quot;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : #elif HAVE_LITTLE_ENDIAN &amp;&amp; HAVE_BIG_ENDIAN</a>
+<a name="114"><span class="lineNum"> 114 </span> : : #error &quot;Can't compile for both big and little endian.&quot;</a>
+<a name="115"><span class="lineNum"> 115 </span> : : #elif HAVE_LITTLE_ENDIAN</a>
+<a name="116"><span class="lineNum"> 116 </span> : : #define __BYTE_ORDER __LITTLE_ENDIAN</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #elif HAVE_BIG_ENDIAN</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #define __BYTE_ORDER __BIG_ENDIAN</a>
+<a name="119"><span class="lineNum"> 119 </span> : : #endif</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : #ifdef __CHECKER__</a>
+<a name="123"><span class="lineNum"> 123 </span> : : /* sparse needs forcing to remove bitwise attribute from ccan/short_types */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : #define ENDIAN_CAST __attribute__((force))</a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define ENDIAN_TYPE __attribute__((bitwise))</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #else</a>
+<a name="127"><span class="lineNum"> 127 </span> : : #define ENDIAN_CAST</a>
+<a name="128"><span class="lineNum"> 128 </span> : : #define ENDIAN_TYPE</a>
+<a name="129"><span class="lineNum"> 129 </span> : : #endif</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : typedef uint64_t ENDIAN_TYPE leint64_t;</a>
+<a name="132"><span class="lineNum"> 132 </span> : : typedef uint64_t ENDIAN_TYPE beint64_t;</a>
+<a name="133"><span class="lineNum"> 133 </span> : : typedef uint32_t ENDIAN_TYPE leint32_t;</a>
+<a name="134"><span class="lineNum"> 134 </span> : : typedef uint32_t ENDIAN_TYPE beint32_t;</a>
+<a name="135"><span class="lineNum"> 135 </span> : : typedef uint16_t ENDIAN_TYPE leint16_t;</a>
+<a name="136"><span class="lineNum"> 136 </span> : : typedef uint16_t ENDIAN_TYPE beint16_t;</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : #if HAVE_LITTLE_ENDIAN</a>
+<a name="139"><span class="lineNum"> 139 </span> : : /**</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * CPU_TO_LE64 - convert a constant uint64_t value to little-endian</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * @native: constant to convert</a>
+<a name="142"><span class="lineNum"> 142 </span> : : */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)(native))</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /**</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * CPU_TO_LE32 - convert a constant uint32_t value to little-endian</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * @native: constant to convert</a>
+<a name="148"><span class="lineNum"> 148 </span> : : */</a>
+<a name="149"><span class="lineNum"> 149 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)(native))</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /**</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * CPU_TO_LE16 - convert a constant uint16_t value to little-endian</a>
+<a name="153"><span class="lineNum"> 153 </span> : : * @native: constant to convert</a>
+<a name="154"><span class="lineNum"> 154 </span> : : */</a>
+<a name="155"><span class="lineNum"> 155 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)(native))</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /**</a>
+<a name="158"><span class="lineNum"> 158 </span> : : * LE64_TO_CPU - convert a little-endian uint64_t constant</a>
+<a name="159"><span class="lineNum"> 159 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="160"><span class="lineNum"> 160 </span> : : */</a>
+<a name="161"><span class="lineNum"> 161 </span> : : #define LE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : /**</a>
+<a name="164"><span class="lineNum"> 164 </span> : : * LE32_TO_CPU - convert a little-endian uint32_t constant</a>
+<a name="165"><span class="lineNum"> 165 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="166"><span class="lineNum"> 166 </span> : : */</a>
+<a name="167"><span class="lineNum"> 167 </span> : : #define LE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : /**</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * LE16_TO_CPU - convert a little-endian uint16_t constant</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * @le_val: little-endian constant to convert</a>
+<a name="172"><span class="lineNum"> 172 </span> : : */</a>
+<a name="173"><span class="lineNum"> 173 </span> : : #define LE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> : : #else /* ... HAVE_BIG_ENDIAN */</a>
+<a name="176"><span class="lineNum"> 176 </span> : : #define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)BSWAP_64(native))</a>
+<a name="177"><span class="lineNum"> 177 </span> : : #define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)BSWAP_32(native))</a>
+<a name="178"><span class="lineNum"> 178 </span> : : #define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)BSWAP_16(native))</a>
+<a name="179"><span class="lineNum"> 179 </span> : : #define LE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="180"><span class="lineNum"> 180 </span> : : #define LE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="181"><span class="lineNum"> 181 </span> : : #define LE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="182"><span class="lineNum"> 182 </span> : : #endif /* HAVE_BIG_ENDIAN */</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : #if HAVE_BIG_ENDIAN</a>
+<a name="185"><span class="lineNum"> 185 </span> : : /**</a>
+<a name="186"><span class="lineNum"> 186 </span> : : * CPU_TO_BE64 - convert a constant uint64_t value to big-endian</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * @native: constant to convert</a>
+<a name="188"><span class="lineNum"> 188 </span> : : */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)(native))</a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> : : /**</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * CPU_TO_BE32 - convert a constant uint32_t value to big-endian</a>
+<a name="193"><span class="lineNum"> 193 </span> : : * @native: constant to convert</a>
+<a name="194"><span class="lineNum"> 194 </span> : : */</a>
+<a name="195"><span class="lineNum"> 195 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)(native))</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> : : /**</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * CPU_TO_BE16 - convert a constant uint16_t value to big-endian</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @native: constant to convert</a>
+<a name="200"><span class="lineNum"> 200 </span> : : */</a>
+<a name="201"><span class="lineNum"> 201 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)(native))</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : /**</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * BE64_TO_CPU - convert a big-endian uint64_t constant</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> : : #define BE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val))</a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> : : /**</a>
+<a name="210"><span class="lineNum"> 210 </span> : : * BE32_TO_CPU - convert a big-endian uint32_t constant</a>
+<a name="211"><span class="lineNum"> 211 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="212"><span class="lineNum"> 212 </span> : : */</a>
+<a name="213"><span class="lineNum"> 213 </span> : : #define BE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val))</a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> : : /**</a>
+<a name="216"><span class="lineNum"> 216 </span> : : * BE16_TO_CPU - convert a big-endian uint16_t constant</a>
+<a name="217"><span class="lineNum"> 217 </span> : : * @le_val: big-endian constant to convert</a>
+<a name="218"><span class="lineNum"> 218 </span> : : */</a>
+<a name="219"><span class="lineNum"> 219 </span> : : #define BE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val))</a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : #else /* ... HAVE_LITTLE_ENDIAN */</a>
+<a name="222"><span class="lineNum"> 222 </span> : : #define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)BSWAP_64(native))</a>
+<a name="223"><span class="lineNum"> 223 </span> : : #define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)BSWAP_32(native))</a>
+<a name="224"><span class="lineNum"> 224 </span> : : #define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)BSWAP_16(native))</a>
+<a name="225"><span class="lineNum"> 225 </span> : : #define BE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val)</a>
+<a name="226"><span class="lineNum"> 226 </span> : : #define BE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val)</a>
+<a name="227"><span class="lineNum"> 227 </span> : : #define BE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val)</a>
+<a name="228"><span class="lineNum"> 228 </span> : : #endif /* HAVE_LITTE_ENDIAN */</a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * cpu_to_le64 - convert a uint64_t value to little-endian</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * @native: value to convert</a>
+<a name="234"><span class="lineNum"> 234 </span> : : */</a>
+<a name="235"><span class="lineNum"> 235 </span> : : static inline leint64_t cpu_to_le64(uint64_t native)</a>
+<a name="236"><span class="lineNum"> 236 </span> : : {</a>
+<a name="237"><span class="lineNum"> 237 </span> : : return CPU_TO_LE64(native);</a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /**</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * cpu_to_le32 - convert a uint32_t value to little-endian</a>
+<a name="242"><span class="lineNum"> 242 </span> : : * @native: value to convert</a>
+<a name="243"><span class="lineNum"> 243 </span> : : */</a>
+<a name="244"><span class="lineNum"> 244 </span> : : static inline leint32_t cpu_to_le32(uint32_t native)</a>
+<a name="245"><span class="lineNum"> 245 </span> : : {</a>
+<a name="246"><span class="lineNum"> 246 </span> : : return CPU_TO_LE32(native);</a>
+<a name="247"><span class="lineNum"> 247 </span> : : }</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> : : /**</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * cpu_to_le16 - convert a uint16_t value to little-endian</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * @native: value to convert</a>
+<a name="252"><span class="lineNum"> 252 </span> : : */</a>
+<a name="253"><span class="lineNum"> 253 </span> : : static inline leint16_t cpu_to_le16(uint16_t native)</a>
+<a name="254"><span class="lineNum"> 254 </span> : : {</a>
+<a name="255"><span class="lineNum"> 255 </span> : : return CPU_TO_LE16(native);</a>
+<a name="256"><span class="lineNum"> 256 </span> : : }</a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> : : /**</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * le64_to_cpu - convert a little-endian uint64_t value</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @le_val: little-endian value to convert</a>
+<a name="261"><span class="lineNum"> 261 </span> : : */</a>
+<a name="262"><span class="lineNum"> 262 </span> : : static inline uint64_t le64_to_cpu(leint64_t le_val)</a>
+<a name="263"><span class="lineNum"> 263 </span> : : {</a>
+<a name="264"><span class="lineNum"> 264 </span> : : return LE64_TO_CPU(le_val);</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : /**</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * le32_to_cpu - convert a little-endian uint32_t value</a>
+<a name="269"><span class="lineNum"> 269 </span> : : * @le_val: little-endian value to convert</a>
+<a name="270"><span class="lineNum"> 270 </span> : : */</a>
+<a name="271"><span class="lineNum"> 271 </span> : : static inline uint32_t le32_to_cpu(leint32_t le_val)</a>
+<a name="272"><span class="lineNum"> 272 </span> : : {</a>
+<a name="273"><span class="lineNum"> 273 </span> : : return LE32_TO_CPU(le_val);</a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /**</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * le16_to_cpu - convert a little-endian uint16_t value</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * @le_val: little-endian value to convert</a>
+<a name="279"><span class="lineNum"> 279 </span> : : */</a>
+<a name="280"><span class="lineNum"> 280 </span> : : static inline uint16_t le16_to_cpu(leint16_t le_val)</a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : return LE16_TO_CPU(le_val);</a>
+<a name="283"><span class="lineNum"> 283 </span> : : }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> : : /**</a>
+<a name="286"><span class="lineNum"> 286 </span> : : * cpu_to_be64 - convert a uint64_t value to big endian.</a>
+<a name="287"><span class="lineNum"> 287 </span> : : * @native: value to convert</a>
+<a name="288"><span class="lineNum"> 288 </span> : : */</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineNoCov"> 0 : static inline beint64_t cpu_to_be64(uint64_t native)</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : {</a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : return CPU_TO_BE64(native);</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : }</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : /**</a>
+<a name="295"><span class="lineNum"> 295 </span> : : * cpu_to_be32 - convert a uint32_t value to big endian.</a>
+<a name="296"><span class="lineNum"> 296 </span> : : * @native: value to convert</a>
+<a name="297"><span class="lineNum"> 297 </span> : : */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 1 : static inline beint32_t cpu_to_be32(uint32_t native)</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : {</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 1 : return CPU_TO_BE32(native);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : }</a>
+<a name="302"><span class="lineNum"> 302 </span> : : </a>
+<a name="303"><span class="lineNum"> 303 </span> : : /**</a>
+<a name="304"><span class="lineNum"> 304 </span> : : * cpu_to_be16 - convert a uint16_t value to big endian.</a>
+<a name="305"><span class="lineNum"> 305 </span> : : * @native: value to convert</a>
+<a name="306"><span class="lineNum"> 306 </span> : : */</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 1 : static inline beint16_t cpu_to_be16(uint16_t native)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : {</a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 1 : return CPU_TO_BE16(native);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> : : /**</a>
+<a name="313"><span class="lineNum"> 313 </span> : : * be64_to_cpu - convert a big-endian uint64_t value</a>
+<a name="314"><span class="lineNum"> 314 </span> : : * @be_val: big-endian value to convert</a>
+<a name="315"><span class="lineNum"> 315 </span> : : */</a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineNoCov"> 0 : static inline uint64_t be64_to_cpu(beint64_t be_val)</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : return BE64_TO_CPU(be_val);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /**</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * be32_to_cpu - convert a big-endian uint32_t value</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * @be_val: big-endian value to convert</a>
+<a name="324"><span class="lineNum"> 324 </span> : : */</a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 104 : static inline uint32_t be32_to_cpu(beint32_t be_val)</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 77 : return BE32_TO_CPU(be_val);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : }</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> : : /**</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * be16_to_cpu - convert a big-endian uint16_t value</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * @be_val: big-endian value to convert</a>
+<a name="333"><span class="lineNum"> 333 </span> : : */</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 59 : static inline uint16_t be16_to_cpu(beint16_t be_val)</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : {</a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 59 : return BE16_TO_CPU(be_val);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : }</a>
+<a name="338"><span class="lineNum"> 338 </span> : : </a>
+<a name="339"><span class="lineNum"> 339 </span> : : /* Whichever they include first, they get these definitions. */</a>
+<a name="340"><span class="lineNum"> 340 </span> : : #ifdef CCAN_SHORT_TYPES_H</a>
+<a name="341"><span class="lineNum"> 341 </span> : : /**</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * be64/be32/be16 - 64/32/16 bit big-endian representation.</a>
+<a name="343"><span class="lineNum"> 343 </span> : : */</a>
+<a name="344"><span class="lineNum"> 344 </span> : : typedef beint64_t be64;</a>
+<a name="345"><span class="lineNum"> 345 </span> : : typedef beint32_t be32;</a>
+<a name="346"><span class="lineNum"> 346 </span> : : typedef beint16_t be16;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /**</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * le64/le32/le16 - 64/32/16 bit little-endian representation.</a>
+<a name="350"><span class="lineNum"> 350 </span> : : */</a>
+<a name="351"><span class="lineNum"> 351 </span> : : typedef leint64_t le64;</a>
+<a name="352"><span class="lineNum"> 352 </span> : : typedef leint32_t le32;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : typedef leint16_t le16;</a>
+<a name="354"><span class="lineNum"> 354 </span> : : #endif</a>
+<a name="355"><span class="lineNum"> 355 </span> : : #endif /* CCAN_ENDIAN_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/endian/index-sort-b.html b/coverage-report/external/pflash/ccan/endian/index-sort-b.html
new file mode 100644
index 0000000..0b9b0a3
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/endian/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=67 height=10 alt="66.7%"><img src="../../../../snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/endian/index-sort-f.html b/coverage-report/external/pflash/ccan/endian/index-sort-f.html
new file mode 100644
index 0000000..22ba606
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/endian/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=67 height=10 alt="66.7%"><img src="../../../../snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/endian/index-sort-l.html b/coverage-report/external/pflash/ccan/endian/index-sort-l.html
new file mode 100644
index 0000000..ab6c249
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/endian/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=67 height=10 alt="66.7%"><img src="../../../../snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/endian/index.html b/coverage-report/external/pflash/ccan/endian/index.html
new file mode 100644
index 0000000..e193097
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/endian/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/endian</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/endian</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="endian.h.gcov.html">endian.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../ruby.png" width=67 height=10 alt="66.7%"><img src="../../../../snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/list/index-sort-b.html b/coverage-report/external/pflash/ccan/list/index-sort-b.html
new file mode 100644
index 0000000..fc2cca1
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/list/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/list/index-sort-f.html b/coverage-report/external/pflash/ccan/list/index-sort-f.html
new file mode 100644
index 0000000..f92111a
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/list/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/list/index-sort-l.html b/coverage-report/external/pflash/ccan/list/index-sort-l.html
new file mode 100644
index 0000000..416eeda
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/list/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/list/index.html b/coverage-report/external/pflash/ccan/list/index.html
new file mode 100644
index 0000000..034bfd0
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/list/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/list</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - external/pflash/ccan/list</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/list/list.c.func-sort-c.html b/coverage-report/external/pflash/ccan/list/list.c.func-sort-c.html
new file mode 100644
index 0000000..b312517
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/list/list.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/list/list.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/pflash/ccan/list</a> - list.c<span style="font-size: 80%;"> (<a href="list.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="list.c.func.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#4">corrupt</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#36">list_check</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#18">list_check_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/list/list.c.func.html b/coverage-report/external/pflash/ccan/list/list.c.func.html
new file mode 100644
index 0000000..c49f01f
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/list/list.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/list/list.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/pflash/ccan/list</a> - list.c<span style="font-size: 80%;"> (<a href="list.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="list.c.func-sort-c.html"><img src="../../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#4">corrupt</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#36">list_check</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="list.c.gcov.html#18">list_check_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/ccan/list/list.c.gcov.html b/coverage-report/external/pflash/ccan/list/list.c.gcov.html
new file mode 100644
index 0000000..1d8bebf
--- /dev/null
+++ b/coverage-report/external/pflash/ccan/list/list.c.gcov.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/ccan/list/list.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../../index.html">top level</a> - <a href="index.html">external/pflash/ccan/list</a> - list.c<span style="font-size: 80%;"> (source / <a href="list.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Licensed under BSD-MIT - see LICENSE file for details */</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;list.h&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> :<span class="lineNoCov"> 0 : static void *corrupt(const char *abortstr,</span></a>
+<a name="7"><span class="lineNum"> 7 </span> : : const struct list_node *head,</a>
+<a name="8"><span class="lineNum"> 8 </span> : : const struct list_node *node,</a>
+<a name="9"><span class="lineNum"> 9 </span> : : unsigned int count)</a>
+<a name="10"><span class="lineNum"> 10 </span> : : {</a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineNoCov"> 0 : if (abortstr) {</span></a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineNoCov"> 0 : fprintf(stderr,</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : &quot;%s: prev corrupt in node %p (%u) of %p\n&quot;,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : abortstr, node, count, head);</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : }</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineNoCov"> 0 : struct list_node *list_check_node(const struct list_node *node,</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : const char *abortstr)</a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : const struct list_node *p, *n;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : int count = 0;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : for (p = node, n = node-&gt;next; n != node; p = n, n = n-&gt;next) {</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : count++;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : if (n-&gt;prev != p)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : return corrupt(abortstr, node, n, count);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* Check prev on head node. */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : if (node-&gt;prev != p)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : return corrupt(abortstr, node, node, 0);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : return (struct list_node *)node;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : struct list_head *list_check(const struct list_head *h, const char *abortstr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : if (!list_check_node(&amp;h-&gt;n, abortstr))</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : return (struct list_head *)h;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/arch_flash_common.c.func-sort-c.html b/coverage-report/external/pflash/common/arch_flash_common.c.func-sort-c.html
new file mode 100644
index 0000000..8c8c7b0
--- /dev/null
+++ b/coverage-report/external/pflash/common/arch_flash_common.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common/arch_flash_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (<a href="arch_flash_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="arch_flash_common.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#29">arch_flash_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#36">arch_flash_access</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#17">arch_flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#43">arch_flash_set_wrprotect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/arch_flash_common.c.func.html b/coverage-report/external/pflash/common/arch_flash_common.c.func.html
new file mode 100644
index 0000000..aa4ffb0
--- /dev/null
+++ b/coverage-report/external/pflash/common/arch_flash_common.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common/arch_flash_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (<a href="arch_flash_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="arch_flash_common.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#29">arch_flash_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#36">arch_flash_access</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#17">arch_flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_common.c.gcov.html#43">arch_flash_set_wrprotect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/arch_flash_common.c.gcov.html b/coverage-report/external/pflash/common/arch_flash_common.c.gcov.html
new file mode 100644
index 0000000..515d11b
--- /dev/null
+++ b/coverage-report/external/pflash/common/arch_flash_common.c.gcov.html
@@ -0,0 +1,135 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common/arch_flash_common.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/common</a> - arch_flash_common.c<span style="font-size: 80%;"> (source / <a href="arch_flash_common.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Default implementations</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2015-2017 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;arch_flash.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : /*</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * This just assumes that an erase from zero to total size is</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * 'correct'.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * An erase from zero to total size is the correct approach for</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * powerpc and x86. ARM has it own function which also includes a call</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * to the flash driver.</a>
+<a name="18"><span class="lineNum"> 18 </span> : : */</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak)) arch_flash_erase_chip(struct blocklevel_device *bl)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : uint64_t total_size;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, &amp;total_size, NULL);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : return rc;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return blocklevel_erase(bl, 0, total_size);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak,const)) arch_flash_4b_mode(struct blocklevel_device *bl, int set_4b)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : {</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : (void)set_4b;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : enum flash_access __attribute__((weak,const)) arch_flash_access(struct blocklevel_device *bl, enum flash_access access)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : (void)access;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : return ACCESS_INVAL;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : int __attribute__((weak,const)) arch_flash_set_wrprotect(struct blocklevel_device *bl, int set)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : (void)bl;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : (void)set;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/arch_flash_unknown.c.func-sort-c.html b/coverage-report/external/pflash/common/arch_flash_unknown.c.func-sort-c.html
new file mode 100644
index 0000000..86605f7
--- /dev/null
+++ b/coverage-report/external/pflash/common/arch_flash_unknown.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common/arch_flash_unknown.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (<a href="arch_flash_unknown.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="arch_flash_unknown.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#36">arch_flash_close</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#17">arch_flash_init</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/arch_flash_unknown.c.func.html b/coverage-report/external/pflash/common/arch_flash_unknown.c.func.html
new file mode 100644
index 0000000..9f7fe9c
--- /dev/null
+++ b/coverage-report/external/pflash/common/arch_flash_unknown.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common/arch_flash_unknown.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (<a href="arch_flash_unknown.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="arch_flash_unknown.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#36">arch_flash_close</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="arch_flash_unknown.c.gcov.html#17">arch_flash_init</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/arch_flash_unknown.c.gcov.html b/coverage-report/external/pflash/common/arch_flash_unknown.c.gcov.html
new file mode 100644
index 0000000..f6f0571
--- /dev/null
+++ b/coverage-report/external/pflash/common/arch_flash_unknown.c.gcov.html
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common/arch_flash_unknown.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/common</a> - arch_flash_unknown.c<span style="font-size: 80%;"> (source / <a href="arch_flash_unknown.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp.</a>
+<a name="3"><span class="lineNum"> 3 </span> : : */</a>
+<a name="4"><span class="lineNum"> 4 </span> : : </a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;limits.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;dirent.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;libflash/file.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;arch_flash.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 22 : int arch_flash_init(struct blocklevel_device **r_bl, const char *file, bool keep_alive)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 22 : int rc;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 22 : struct blocklevel_device *new_bl;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : /* Must have passed through a file to operate on */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 22 : if (!file) {</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Cannot operate without a file\n&quot;);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 22 : rc = file_init_path(file, NULL, keep_alive, &amp;new_bl);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 22 : if (rc)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : return -1;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 22 : *r_bl = new_bl;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 22 : return 0;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 22 : void arch_flash_close(struct blocklevel_device *bl, const char *file)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 22 : (void)file;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 22 : file_exit_close(bl);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 22 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/index-sort-b.html b/coverage-report/external/pflash/common/index-sort-b.html
new file mode 100644
index 0000000..b53255d
--- /dev/null
+++ b/coverage-report/external/pflash/common/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/index-sort-f.html b/coverage-report/external/pflash/common/index-sort-f.html
new file mode 100644
index 0000000..ff44148
--- /dev/null
+++ b/coverage-report/external/pflash/common/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/index-sort-l.html b/coverage-report/external/pflash/common/index-sort-l.html
new file mode 100644
index 0000000..d6c29d1
--- /dev/null
+++ b/coverage-report/external/pflash/common/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/common/index.html b/coverage-report/external/pflash/common/index.html
new file mode 100644
index 0000000..64bab8a
--- /dev/null
+++ b/coverage-report/external/pflash/common/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/common</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/common</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_common.c.gcov.html">arch_flash_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 18</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="arch_flash_unknown.c.gcov.html">arch_flash_unknown.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=86 height=10 alt="85.7%"><img src="../../../snow.png" width=14 height=10 alt="85.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">12 / 14</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/index-sort-b.html b/coverage-report/external/pflash/index-sort-b.html
new file mode 100644
index 0000000..2612593
--- /dev/null
+++ b/coverage-report/external/pflash/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/pflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">485</td>
+ <td class="headerCovTableEntry">807</td>
+ <td class="headerCovTableEntryLo">60.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryMed">78.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pflash.c.gcov.html">pflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=59 height=10 alt="59.1%"><img src="../../snow.png" width=41 height=10 alt="59.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.1&nbsp;%</td>
+ <td class="coverNumLo">450 / 761</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 16</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="progress.c.gcov.html">progress.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=76 height=10 alt="76.1%"><img src="../../snow.png" width=24 height=10 alt="76.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.1&nbsp;%</td>
+ <td class="coverNumMed">35 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/index-sort-f.html b/coverage-report/external/pflash/index-sort-f.html
new file mode 100644
index 0000000..2055674
--- /dev/null
+++ b/coverage-report/external/pflash/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/pflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">485</td>
+ <td class="headerCovTableEntry">807</td>
+ <td class="headerCovTableEntryLo">60.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryMed">78.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pflash.c.gcov.html">pflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=59 height=10 alt="59.1%"><img src="../../snow.png" width=41 height=10 alt="59.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.1&nbsp;%</td>
+ <td class="coverNumLo">450 / 761</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 16</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="progress.c.gcov.html">progress.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=76 height=10 alt="76.1%"><img src="../../snow.png" width=24 height=10 alt="76.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.1&nbsp;%</td>
+ <td class="coverNumMed">35 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/index-sort-l.html b/coverage-report/external/pflash/index-sort-l.html
new file mode 100644
index 0000000..a34ca7d
--- /dev/null
+++ b/coverage-report/external/pflash/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/pflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">485</td>
+ <td class="headerCovTableEntry">807</td>
+ <td class="headerCovTableEntryLo">60.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryMed">78.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pflash.c.gcov.html">pflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=59 height=10 alt="59.1%"><img src="../../snow.png" width=41 height=10 alt="59.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.1&nbsp;%</td>
+ <td class="coverNumLo">450 / 761</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 16</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="progress.c.gcov.html">progress.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=76 height=10 alt="76.1%"><img src="../../snow.png" width=24 height=10 alt="76.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.1&nbsp;%</td>
+ <td class="coverNumMed">35 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/index.html b/coverage-report/external/pflash/index.html
new file mode 100644
index 0000000..5552b43
--- /dev/null
+++ b/coverage-report/external/pflash/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/pflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">485</td>
+ <td class="headerCovTableEntry">807</td>
+ <td class="headerCovTableEntryLo">60.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryMed">78.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pflash.c.gcov.html">pflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=59 height=10 alt="59.1%"><img src="../../snow.png" width=41 height=10 alt="59.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.1&nbsp;%</td>
+ <td class="coverNumLo">450 / 761</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">12 / 16</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="progress.c.gcov.html">progress.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=76 height=10 alt="76.1%"><img src="../../snow.png" width=24 height=10 alt="76.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.1&nbsp;%</td>
+ <td class="coverNumMed">35 / 46</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/blocklevel.c.func-sort-c.html b/coverage-report/external/pflash/libflash/blocklevel.c.func-sort-c.html
new file mode 100644
index 0000000..2c0bf20
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/blocklevel.c.func-sort-c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">24.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">78.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="blocklevel.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnHi">768</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">3328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">3369</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">3369</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/blocklevel.c.func.html b/coverage-report/external/pflash/libflash/blocklevel.c.func.html
new file mode 100644
index 0000000..542fc1e
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/blocklevel.c.func.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">24.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">78.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="blocklevel.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">3328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnHi">768</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">3369</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">3369</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/blocklevel.c.gcov.html b/coverage-report/external/pflash/libflash/blocklevel.c.gcov.html
new file mode 100644
index 0000000..f903dfb
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/blocklevel.c.gcov.html
@@ -0,0 +1,826 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/blocklevel.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - blocklevel.c<span style="font-size: 80%;"> (source / <a href="blocklevel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntry">382</td>
+ <td class="headerCovTableEntryLo">24.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryMed">78.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;errno.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;libflash/errors.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define PROT_REALLOC_NUM 25</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* This function returns tristate values.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * 1 - The region is ECC protected</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * 0 - The region is not ECC protected</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * -1 - Partially protected</a>
+<a name="24"><span class="lineNum"> 24 </span> : : */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 21 : static int ecc_protected(struct blocklevel_device *bl, uint64_t pos, uint64_t len, uint64_t *start)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : {</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 21 : int i;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Length of 0 is nonsensical so add 1 */</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 21 : if (len == 0)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : len = 1;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 21 : for (i = 0; i &lt; bl-&gt;ecc_prot.n_prot; i++) {</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* Fits entirely within the range */</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : if (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt;= pos + len) {</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : if (start)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /*</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Even if ranges are merged we can't currently guarantee two</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * contiguous regions are sanely ECC protected so a partial fit</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * is no good.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : if ((bl-&gt;ecc_prot.prot[i].start &gt;= pos &amp;&amp; bl-&gt;ecc_prot.prot[i].start &lt; pos + len) ||</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt; pos)) {</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : if (start)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : return 0;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : static uint64_t with_ecc_pos(uint64_t ecc_start, uint64_t pos)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : return pos + ((pos - ecc_start) / (BYTES_PER_ECC));</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 3369 : static int reacquire(struct blocklevel_device *bl)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 3369 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;reacquire)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : return bl-&gt;reacquire(bl);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : return 0;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 3369 : static int release(struct blocklevel_device *bl)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 3369 : int rc = 0;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 3369 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;release) {</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* This is the error return path a lot, preserve errno */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : int err = errno;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;release(bl);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 3369 : return rc;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 18 : int blocklevel_raw_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 18 : int rc;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 18 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 18 : if (!bl || !bl-&gt;read || !buf) {</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 18 : rc = reacquire(bl);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 18 : if (rc)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : return rc;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 18 : rc = bl-&gt;read(bl, pos, buf, len);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 18 : release(bl);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 18 : return rc;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 18 : int blocklevel_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 18 : int rc, ecc_protection;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 18 : struct ecc64 *buffer;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 18 : uint64_t ecc_pos, ecc_start, ecc_diff, ecc_len;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 18 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 18 : if (!bl || !buf) {</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : }</a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 18 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 18 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="119"><span class="lineNum"> 119 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 18 : if (!ecc_protection)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 18 : return blocklevel_raw_read(bl, pos, buf, len);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /*</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * The region we're reading to has both ecc protection and not.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="127"><span class="lineNum"> 127 </span> : : */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : if (ecc_protection == -1) {</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="142"><span class="lineNum"> 142 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : buffer = malloc(ecc_len);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : if (!buffer) {</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, ecc_len);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> : : /*</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * Could optimise and simply call memcpy_from_ecc() if ecc_diff</a>
+<a name="156"><span class="lineNum"> 156 </span> : : * == 0 but _unaligned checks and bascially does that for us</a>
+<a name="157"><span class="lineNum"> 157 </span> : : */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : if (memcpy_from_ecc_unaligned(buf, buffer, len, ecc_diff)) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : free(buffer);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 3 : int blocklevel_raw_write(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : const void *buf, uint64_t len)</a>
+<a name="170"><span class="lineNum"> 170 </span> : : {</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 3 : int rc;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 3 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 3 : if (!bl || !bl-&gt;write || !buf) {</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 3 : rc = reacquire(bl);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : return rc;</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 3 : rc = bl-&gt;write(bl, pos, buf, len);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 3 : release(bl);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 3 : return rc;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : }</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 3 : int blocklevel_write(struct blocklevel_device *bl, uint64_t pos, const void *buf,</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : uint64_t len)</a>
+<a name="192"><span class="lineNum"> 192 </span> : : {</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 3 : int rc, ecc_protection;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 3 : struct ecc64 *buffer;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 3 : uint64_t ecc_len;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 3 : uint64_t ecc_start, ecc_pos, ecc_diff;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 3 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 3 : if (!bl || !buf) {</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : }</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 3 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 3 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="208"><span class="lineNum"> 208 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 3 : if (!ecc_protection)</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 3 : return blocklevel_raw_write(bl, pos, buf, len);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /*</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * The region we're writing to has both ecc protection and not.</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="216"><span class="lineNum"> 216 </span> : : */</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : if (ecc_protection == -1) {</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : }</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="231"><span class="lineNum"> 231 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : buffer = malloc(ecc_len);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : if (!buffer) {</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineNoCov"> 0 : if (ecc_diff) {</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : uint64_t start_chunk = ecc_diff;</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : uint64_t end_chunk = BYTES_PER_ECC - ecc_diff;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : uint64_t end_len = ecc_len - end_chunk;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /*</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * Read the start bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * to calculate the first ecc byte</a>
+<a name="248"><span class="lineNum"> 248 </span> : : */</a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, start_chunk);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> : : /*</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * Read the end bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * to calculate the last ecc byte</a>
+<a name="259"><span class="lineNum"> 259 </span> : : */</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_read(bl, ecc_pos + end_len, ((char *)buffer) + end_len,</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : end_chunk);</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : if (memcpy_to_ecc_unaligned(buffer, buf, len, ecc_diff)) {</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : } else {</a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineNoCov"> 0 : if (memcpy_to_ecc(buffer, buf, len)) {</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : }</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_raw_write(bl, pos, buffer, ecc_len);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : </a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : free(buffer);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 3328 : int blocklevel_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : {</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 3328 : int rc;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 3328 : if (!bl || !bl-&gt;erase) {</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 3328 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /* Programmer may be making a horrible mistake without knowing it */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 3328 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_erase: pos (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : pos, bl-&gt;erase_mask + 1);</a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : }</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 3328 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_erase: len (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : len, bl-&gt;erase_mask + 1);</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : }</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 3328 : rc = reacquire(bl);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 3328 : if (rc)</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : return rc;</a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 3328 : rc = bl-&gt;erase(bl, pos, len);</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 3328 : release(bl);</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 3328 : return rc;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 20 : int blocklevel_get_info(struct blocklevel_device *bl, const char **name, uint64_t *total_size,</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : uint32_t *erase_granule)</a>
+<a name="323"><span class="lineNum"> 323 </span> : : {</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 20 : int rc;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 20 : if (!bl || !bl-&gt;get_info) {</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : }</a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 20 : rc = reacquire(bl);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 20 : if (rc)</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : return rc;</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 20 : rc = bl-&gt;get_info(bl, name, total_size, erase_granule);</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : </a>
+<a name="337"><span class="lineNum"> 337 </span> : : /* Check the validity of what we are being told */</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 20 : if (erase_granule &amp;&amp; *erase_granule != bl-&gt;erase_mask + 1)</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_get_info: WARNING: erase_granule (0x%08x) and erase_mask&quot;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : &quot; (0x%08x) don't match\n&quot;, *erase_granule, bl-&gt;erase_mask + 1);</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 20 : release(bl);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 20 : return rc;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : }</a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+<a name="347"><span class="lineNum"> 347 </span> : : /*</a>
+<a name="348"><span class="lineNum"> 348 </span> : : * Compare flash and memory to determine if:</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * a) Erase must happen before write</a>
+<a name="350"><span class="lineNum"> 350 </span> : : * b) Flash and memory are identical</a>
+<a name="351"><span class="lineNum"> 351 </span> : : * c) Flash can simply be written to</a>
+<a name="352"><span class="lineNum"> 352 </span> : : *</a>
+<a name="353"><span class="lineNum"> 353 </span> : : * returns -1 for a</a>
+<a name="354"><span class="lineNum"> 354 </span> : : * returns 0 for b</a>
+<a name="355"><span class="lineNum"> 355 </span> : : * returns 1 for c</a>
+<a name="356"><span class="lineNum"> 356 </span> : : */</a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : static int blocklevel_flashcmp(const void *flash_buf, const void *mem_buf, uint64_t len)</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : {</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : uint64_t i;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : int same = true;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : const uint8_t *f_buf, *m_buf;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : f_buf = flash_buf;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : m_buf = mem_buf;</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : if (m_buf[i] &amp; ~f_buf[i])</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : return -1;</a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : if (same &amp;&amp; (m_buf[i] != f_buf[i]))</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : same = false;</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : }</a>
+<a name="372"><span class="lineNum"> 372 </span> : : </a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : return same ? 0 : 1;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : }</a>
+<a name="375"><span class="lineNum"> 375 </span> : : </a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 768 : int blocklevel_smart_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : {</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 768 : uint64_t block_size;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 768 : void *erase_buf;</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 768 : int rc;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> : : </a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 768 : if (!bl) {</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 768 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> : : /* Nothing smart needs to be done, pos and len are aligned */</a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 768 : if ((pos &amp; bl-&gt;erase_mask) == 0 &amp;&amp; (len &amp; bl-&gt;erase_mask) == 0) {</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 768 : FL_DBG(&quot;%s: Skipping smarts everything is aligned 0x%&quot; PRIx64 &quot; 0x%&quot; PRIx64</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : &quot;to 0x%08x\n&quot;, __func__, pos, len, bl-&gt;erase_mask);</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 768 : return blocklevel_erase(bl, pos, len);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : }</a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : block_size = bl-&gt;erase_mask + 1;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : erase_buf = malloc(block_size);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : if (!erase_buf) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : }</a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : }</a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : /*</a>
+<a name="410"><span class="lineNum"> 410 </span> : : * base_pos and base_len are the values in the first erase</a>
+<a name="411"><span class="lineNum"> 411 </span> : : * block that we need to preserve: the region up to pos.</a>
+<a name="412"><span class="lineNum"> 412 </span> : : */</a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : uint64_t base_pos = pos &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : uint64_t base_len = pos - base_pos;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : __func__, base_pos, base_pos + base_len);</a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> : : /*</a>
+<a name="420"><span class="lineNum"> 420 </span> : : * Read the entire block in case this is the ONLY block we're</a>
+<a name="421"><span class="lineNum"> 421 </span> : : * modifying, we may need the end chunk of it later</a>
+<a name="422"><span class="lineNum"> 422 </span> : : */</a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, base_pos, erase_buf, block_size);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, base_pos, block_size);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, base_pos, erase_buf, base_len);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /*</a>
+<a name="436"><span class="lineNum"> 436 </span> : : * The requested erase fits entirely into this erase block and</a>
+<a name="437"><span class="lineNum"> 437 </span> : : * so we need to write back the chunk at the end of the block</a>
+<a name="438"><span class="lineNum"> 438 </span> : : */</a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : if (base_pos + base_len + len &lt; base_pos + block_size) {</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, pos + len, erase_buf + base_len + len,</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : block_size - base_len - len);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: Early exit, everything was in one erase block\n&quot;,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : __func__);</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : pos += block_size - base_len;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : len -= block_size - base_len;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* Now we should be aligned, best to double check */</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s:pos 0x%&quot; PRIx64 &quot; isn't erase_mask 0x%08x aligned\n&quot;,</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : __func__, pos, bl-&gt;erase_mask);</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : }</a>
+<a name="458"><span class="lineNum"> 458 </span> : : </a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : if (len &amp; ~(bl-&gt;erase_mask)) {</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, pos, len &amp; ~(bl-&gt;erase_mask));</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : </a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : pos += len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineNoCov"> 0 : len -= len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : }</a>
+<a name="467"><span class="lineNum"> 467 </span> : : </a>
+<a name="468"><span class="lineNum"> 468 </span> : : /* Length should be less than a block now */</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : if (len &gt; block_size) {</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: len 0x%&quot; PRIx64 &quot; is still exceeds block_size 0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : __func__, len, block_size);</a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : }</a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : /*</a>
+<a name="478"><span class="lineNum"> 478 </span> : : * top_pos is the first byte that must be preserved and</a>
+<a name="479"><span class="lineNum"> 479 </span> : : * top_len is the length from top_pos to the end of the erase</a>
+<a name="480"><span class="lineNum"> 480 </span> : : * block: the region that must be preserved</a>
+<a name="481"><span class="lineNum"> 481 </span> : : */</a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineNoCov"> 0 : uint64_t top_pos = pos + len;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineNoCov"> 0 : uint64_t top_len = block_size - len;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : __func__, top_pos, top_pos + top_len);</a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;erase(bl, pos, block_size);</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> : : </a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="499"><span class="lineNum"> 499 </span> : : }</a>
+<a name="500"><span class="lineNum"> 500 </span> : : </a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 1 : int blocklevel_smart_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len)</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : {</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 1 : void *ecc_buf = NULL;</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 1 : uint64_t ecc_start;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 1 : int ecc_protection;</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 1 : void *erase_buf = NULL;</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 1 : uint32_t erase_size;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : </a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineCov"> 1 : const void *write_buf;</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 1 : uint64_t write_len;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineCov"> 1 : uint64_t write_pos;</span></a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 1 : int rc = 0;</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 1 : if (!buf || !bl) {</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : </a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 1 : if (!(bl-&gt;flags &amp; WRITE_NEED_ERASE)) {</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;%s: backend doesn't need erase\n&quot;, __func__);</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 1 : return blocklevel_write(bl, pos, buf, len);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, NULL, &amp;erase_size);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="536"><span class="lineNum"> 536 </span> : : return rc;</a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (ecc_protection == -1) {</span></a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : }</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : if (ecc_protection) {</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : uint64_t ecc_pos, ecc_align, ecc_diff, ecc_len;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : </a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region has ECC\n&quot;, __func__);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : ecc_pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : ecc_align = ecc_buffer_align(ecc_start, ecc_pos);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : ecc_diff = ecc_pos - ecc_align;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : ecc_buf = malloc(ecc_len);</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : if (!ecc_buf) {</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> : : }</a>
+<a name="560"><span class="lineNum"> 560 </span> : : </a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : if (ecc_diff) {</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, ecc_align, ecc_buf, ecc_diff);</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : }</a>
+<a name="569"><span class="lineNum"> 569 </span> : : </a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc_unaligned(ecc_buf, buf, len, ecc_diff);</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ECC_INVALID;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : }</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> : : write_buf = ecc_buf;</a>
+<a name="578"><span class="lineNum"> 578 </span> : : write_len = ecc_len;</a>
+<a name="579"><span class="lineNum"> 579 </span> : : write_pos = ecc_pos;</a>
+<a name="580"><span class="lineNum"> 580 </span> : : } else {</a>
+<a name="581"><span class="lineNum"> 581 </span> : : write_buf = buf;</a>
+<a name="582"><span class="lineNum"> 582 </span> : : write_len = len;</a>
+<a name="583"><span class="lineNum"> 583 </span> : : write_pos = pos;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : }</a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : erase_buf = malloc(erase_size);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : if (!erase_buf) {</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : }</a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : </a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineNoCov"> 0 : while (write_len &gt; 0) {</span></a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : uint32_t erase_block = write_pos &amp; ~(erase_size - 1);</span></a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineNoCov"> 0 : uint32_t block_offset = write_pos &amp; (erase_size - 1);</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : uint32_t chunk_size = erase_size &gt; write_len ?</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : write_len : erase_size;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : int cmp;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : </a>
+<a name="604"><span class="lineNum"> 604 </span> : : /* Write crosses an erase boundary, shrink the write to the boundary */</a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : if (erase_size &lt; block_offset + chunk_size) {</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : chunk_size = erase_size - block_offset;</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : }</a>
+<a name="608"><span class="lineNum"> 608 </span> : : </a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : cmp = blocklevel_flashcmp(erase_buf + block_offset, write_buf,</span></a>
+<a name="614"><span class="lineNum"> 614 </span> : : chunk_size);</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region 0x%08x..0x%08x &quot;, __func__,</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : erase_block, erase_size);</a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : if (cmp != 0) {</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;needs &quot;);</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : if (cmp == -1) {</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;erase and &quot;);</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : bl-&gt;erase(bl, erase_block, erase_size);</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : }</a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;write\n&quot;);</span></a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : memcpy(erase_buf + block_offset, write_buf, chunk_size);</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : } else {</a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;clean\n&quot;);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : write_len -= chunk_size;</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : write_pos += chunk_size;</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : write_buf += chunk_size;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : }</a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : out_free:</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="643"><span class="lineNum"> 643 </span> : : }</a>
+<a name="644"><span class="lineNum"> 644 </span> : : </a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineNoCov"> 0 : static bool insert_bl_prot_range(struct blocklevel_range *ranges, struct bl_prot_range range)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : {</a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineNoCov"> 0 : uint32_t pos, len;</span></a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineNoCov"> 0 : struct bl_prot_range *prot = ranges-&gt;prot;</span></a>
+<a name="650"><span class="lineNum"> 650 </span> : : </a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineNoCov"> 0 : pos = range.start;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : len = range.len;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : if (len == 0)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : return true;</a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* Check for overflow */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : if (pos + len &lt; len)</span></a>
+<a name="659"><span class="lineNum"> 659 </span> : : return false;</a>
+<a name="660"><span class="lineNum"> 660 </span> : : </a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; ranges-&gt;n_prot &amp;&amp; len &gt; 0; i++) {</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : if (prot[i].start &lt;= pos &amp;&amp; prot[i].start + prot[i].len &gt;= pos + len) {</span></a>
+<a name="663"><span class="lineNum"> 663 </span> : : len = 0;</a>
+<a name="664"><span class="lineNum"> 664 </span> : : break; /* Might as well, the next two conditions can't be true */</a>
+<a name="665"><span class="lineNum"> 665 </span> : : }</a>
+<a name="666"><span class="lineNum"> 666 </span> : : </a>
+<a name="667"><span class="lineNum"> 667 </span> : : /* Can easily extend this down just by adjusting start */</a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : if (pos &lt;= prot[i].start &amp;&amp; pos + len &gt;= prot[i].start) {</span></a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: extending start down\n&quot;, __func__);</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : prot[i].len += prot[i].start - pos;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : prot[i].start = pos;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : pos += prot[i].len;</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : if (prot[i].len &gt;= len)</span></a>
+<a name="674"><span class="lineNum"> 674 </span> : : len = 0;</a>
+<a name="675"><span class="lineNum"> 675 </span> : : else</a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineNoCov"> 0 : len -= prot[i].len;</span></a>
+<a name="677"><span class="lineNum"> 677 </span> : : }</a>
+<a name="678"><span class="lineNum"> 678 </span> : : </a>
+<a name="679"><span class="lineNum"> 679 </span> : : /*</a>
+<a name="680"><span class="lineNum"> 680 </span> : : * Jump over this range but the new range might be so big that</a>
+<a name="681"><span class="lineNum"> 681 </span> : : * theres a chunk after</a>
+<a name="682"><span class="lineNum"> 682 </span> : : */</a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : if (pos &gt;= prot[i].start &amp;&amp; pos &lt; prot[i].start + prot[i].len) {</span></a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: fits within current range &quot;, __func__);</span></a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : if (prot[i].start + prot[i].len - pos &gt; len) {</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;but there is some extra at the end\n&quot;);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : len -= prot[i].start + prot[i].len - pos;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : pos = prot[i].start + prot[i].len;</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : } else {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;\n&quot;);</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : len = 0;</a>
+<a name="692"><span class="lineNum"> 692 </span> : : }</a>
+<a name="693"><span class="lineNum"> 693 </span> : : }</a>
+<a name="694"><span class="lineNum"> 694 </span> : : /*</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * This condition will be true if the range is smaller than</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * the current range, therefore it should go here!</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : if (pos &lt; prot[i].start &amp;&amp; pos + len &lt;= prot[i].start)</span></a>
+<a name="699"><span class="lineNum"> 699 </span> : : break;</a>
+<a name="700"><span class="lineNum"> 700 </span> : : }</a>
+<a name="701"><span class="lineNum"> 701 </span> : : </a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineNoCov"> 0 : if (len) {</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : int insert_pos = i;</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineNoCov"> 0 : struct bl_prot_range *new_ranges = ranges-&gt;prot;</span></a>
+<a name="705"><span class="lineNum"> 705 </span> : : </a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: adding 0x%08x..0x%08x\n&quot;, __func__, pos, pos + len);</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineNoCov"> 0 : if (ranges-&gt;n_prot == ranges-&gt;total_prot) {</span></a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineNoCov"> 0 : new_ranges = realloc(ranges-&gt;prot,</span></a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineNoCov"> 0 : sizeof(range) * ((ranges-&gt;n_prot) + PROT_REALLOC_NUM));</span></a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (!new_ranges)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : return false;</a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineNoCov"> 0 : ranges-&gt;total_prot += PROT_REALLOC_NUM;</span></a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineNoCov"> 0 : if (insert_pos != ranges-&gt;n_prot)</span></a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : for (i = ranges-&gt;n_prot; i &gt; insert_pos; i--)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;new_ranges[i], &amp;new_ranges[i - 1], sizeof(range));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : range.start = pos;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineNoCov"> 0 : range.len = len;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;new_ranges[insert_pos], &amp;range, sizeof(range));</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineNoCov"> 0 : ranges-&gt;prot = new_ranges;</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineNoCov"> 0 : ranges-&gt;n_prot++;</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : prot = new_ranges;</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : }</a>
+<a name="725"><span class="lineNum"> 725 </span> : : </a>
+<a name="726"><span class="lineNum"> 726 </span> : : return true;</a>
+<a name="727"><span class="lineNum"> 727 </span> : : }</a>
+<a name="728"><span class="lineNum"> 728 </span> : : </a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : int blocklevel_ecc_protect(struct blocklevel_device *bl, uint32_t start, uint32_t len)</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : {</a>
+<a name="731"><span class="lineNum"> 731 </span> : : /*</a>
+<a name="732"><span class="lineNum"> 732 </span> : : * Could implement this at hardware level by having an accessor to the</a>
+<a name="733"><span class="lineNum"> 733 </span> : : * backend in struct blocklevel_device and as a result do nothing at</a>
+<a name="734"><span class="lineNum"> 734 </span> : : * this level (although probably not for ecc!)</a>
+<a name="735"><span class="lineNum"> 735 </span> : : */</a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : struct bl_prot_range range = { .start = start, .len = len };</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : </a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineNoCov"> 0 : if (len &lt; BYTES_PER_ECC)</span></a>
+<a name="739"><span class="lineNum"> 739 </span> : : return -1;</a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineNoCov"> 0 : return !insert_bl_prot_range(&amp;bl-&gt;ecc_prot, range);</span></a>
+<a name="741"><span class="lineNum"> 741 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/ecc.c.func-sort-c.html b/coverage-report/external/pflash/libflash/ecc.c.func-sort-c.html
new file mode 100644
index 0000000..103e783
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/ecc.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/ecc.c.func.html b/coverage-report/external/pflash/libflash/ecc.c.func.html
new file mode 100644
index 0000000..916a60b
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/ecc.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/ecc.c.gcov.html b/coverage-report/external/pflash/libflash/ecc.c.gcov.html
new file mode 100644
index 0000000..e456e0b
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/ecc.c.gcov.html
@@ -0,0 +1,534 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/ecc.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - ecc.c<span style="font-size: 80%;"> (source / <a href="ecc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">106</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : /* Bit field identifiers for syndrome calculations. */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : enum eccbitfields</a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : GD = 0xff, //&lt; Good, ECC matches.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : UE = 0xfe, //&lt; Uncorrectable.</a>
+<a name="22"><span class="lineNum"> 22 </span> : : E0 = 71, //&lt; Error in ECC bit 0</a>
+<a name="23"><span class="lineNum"> 23 </span> : : E1 = 70, //&lt; Error in ECC bit 1</a>
+<a name="24"><span class="lineNum"> 24 </span> : : E2 = 69, //&lt; Error in ECC bit 2</a>
+<a name="25"><span class="lineNum"> 25 </span> : : E3 = 68, //&lt; Error in ECC bit 3</a>
+<a name="26"><span class="lineNum"> 26 </span> : : E4 = 67, //&lt; Error in ECC bit 4</a>
+<a name="27"><span class="lineNum"> 27 </span> : : E5 = 66, //&lt; Error in ECC bit 5</a>
+<a name="28"><span class="lineNum"> 28 </span> : : E6 = 65, //&lt; Error in ECC bit 6</a>
+<a name="29"><span class="lineNum"> 29 </span> : : E7 = 64 //&lt; Error in ECC bit 7</a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* 0-63 Correctable bit in byte */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /*</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * Matrix used for ECC calculation.</a>
+<a name="35"><span class="lineNum"> 35 </span> : : *</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * Each row of this is the set of data word bits that are used for</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * the calculation of the corresponding ECC bit. The parity of the</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * bitset is the value of the ECC bit.</a>
+<a name="39"><span class="lineNum"> 39 </span> : : *</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * ie. ECC[n] = eccMatrix[n] &amp; data</a>
+<a name="41"><span class="lineNum"> 41 </span> : : *</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * Note: To make the math easier (and less shifts in resulting code),</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * row0 = ECC7. HW numbering is MSB, order here is LSB.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * These values come from the HW design of the ECC algorithm.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : static uint64_t eccmatrix[] = {</a>
+<a name="48"><span class="lineNum"> 48 </span> : : 0x0000e8423c0f99ffull,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : 0x00e8423c0f99ff00ull,</a>
+<a name="50"><span class="lineNum"> 50 </span> : : 0xe8423c0f99ff0000ull,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : 0x423c0f99ff0000e8ull,</a>
+<a name="52"><span class="lineNum"> 52 </span> : : 0x3c0f99ff0000e842ull,</a>
+<a name="53"><span class="lineNum"> 53 </span> : : 0x0f99ff0000e8423cull,</a>
+<a name="54"><span class="lineNum"> 54 </span> : : 0x99ff0000e8423c0full,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : 0xff0000e8423c0f99ull</a>
+<a name="56"><span class="lineNum"> 56 </span> : : };</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : /**</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * Syndrome calculation matrix.</a>
+<a name="60"><span class="lineNum"> 60 </span> : : *</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * Maps syndrome to flipped bit.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : *</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * To perform ECC correction, this matrix is a look-up of the bit</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * that is bad based on the binary difference of the good and bad</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * ECC. This difference is called the &quot;syndrome&quot;.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * When a particular bit is on in the data, it cause a column from</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * eccMatrix being XOR'd into the ECC field. This column is the</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * &quot;effect&quot; of each bit. If a bit is flipped in the data then its</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * &quot;effect&quot; is missing from the ECC. You can calculate ECC on unknown</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * quality data and compare the ECC field between the calculated</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * value and the stored value. If the difference is zero, then the</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * data is clean. If the difference is non-zero, you look up the</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * difference in the syndrome table to identify the &quot;effect&quot; that</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * is missing, which is the bit that is flipped.</a>
+<a name="76"><span class="lineNum"> 76 </span> : : *</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * Notice that ECC bit flips are recorded by a single &quot;effect&quot;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * bit (ie. 0x1, 0x2, 0x4, 0x8 ...) and double bit flips are identified</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * by the UE status in the table.</a>
+<a name="80"><span class="lineNum"> 80 </span> : : *</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * Bits are in MSB order.</a>
+<a name="82"><span class="lineNum"> 82 </span> : : */</a>
+<a name="83"><span class="lineNum"> 83 </span> : : static enum eccbitfields syndromematrix[] = {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : GD, E7, E6, UE, E5, UE, UE, 47, E4, UE, UE, 37, UE, 35, 39, UE,</a>
+<a name="85"><span class="lineNum"> 85 </span> : : E3, UE, UE, 48, UE, 30, 29, UE, UE, 57, 27, UE, 31, UE, UE, UE,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : E2, UE, UE, 17, UE, 18, 40, UE, UE, 58, 22, UE, 21, UE, UE, UE,</a>
+<a name="87"><span class="lineNum"> 87 </span> : : UE, 16, 49, UE, 19, UE, UE, UE, 23, UE, UE, UE, UE, 20, UE, UE,</a>
+<a name="88"><span class="lineNum"> 88 </span> : : E1, UE, UE, 51, UE, 46, 9, UE, UE, 34, 10, UE, 32, UE, UE, 36,</a>
+<a name="89"><span class="lineNum"> 89 </span> : : UE, 62, 50, UE, 14, UE, UE, UE, 13, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : UE, 61, 8, UE, 41, UE, UE, UE, 11, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : 15, UE, UE, UE, UE, UE, UE, UE, UE, UE, 12, UE, UE, UE, UE, UE,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : E0, UE, UE, 55, UE, 45, 43, UE, UE, 56, 38, UE, 1, UE, UE, UE,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : UE, 25, 26, UE, 2, UE, UE, UE, 24, UE, UE, UE, UE, UE, 28, UE,</a>
+<a name="94"><span class="lineNum"> 94 </span> : : UE, 59, 54, UE, 42, UE, UE, 44, 6, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="95"><span class="lineNum"> 95 </span> : : 5, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : UE, 63, 53, UE, 0, UE, UE, UE, 33, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : 3, UE, UE, 52, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : 7, UE, UE, UE, UE, UE, UE, UE, UE, 60, UE, UE, UE, UE, UE, UE,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : UE, UE, UE, UE, 4, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : };</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /**</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Create the ECC field corresponding to a 8-byte data field</a>
+<a name="104"><span class="lineNum"> 104 </span> : : *</a>
+<a name="105"><span class="lineNum"> 105 </span> : : * @data: The 8 byte data to generate ECC for.</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * @return: The 1 byte ECC corresponding to the data.</a>
+<a name="107"><span class="lineNum"> 107 </span> : : */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : static uint8_t eccgenerate(uint64_t data)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : uint8_t result = 0;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 8; i++)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : result |= __builtin_parityll(eccmatrix[i] &amp; data) &lt;&lt; i;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : return result;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : /**</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * Verify the data and ECC match or indicate how they are wrong.</a>
+<a name="121"><span class="lineNum"> 121 </span> : : *</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * @data: The data to check ECC on.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * @ecc: The [supposed] ECC for the data.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : *</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * @return: eccBitfield or 0-64.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : *</a>
+<a name="127"><span class="lineNum"> 127 </span> : : * @retval GD - Indicates the data is good (matches ECC).</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * @retval UE - Indicates the data is uncorrectable.</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * @retval all others - Indication of which bit is incorrect.</a>
+<a name="130"><span class="lineNum"> 130 </span> : : */</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : static enum eccbitfields eccverify(uint64_t data, uint8_t ecc)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : {</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : return syndromematrix[eccgenerate(data) ^ ecc];</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /* IBM bit ordering */</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : static inline uint64_t eccflipbit(uint64_t data, uint8_t bit)</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : {</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : if (bit &gt; 63)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : return data;</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : return data ^ (1ul &lt;&lt; (63 - bit));</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : static int eccbyte(beint64_t *dst, struct ecc64 *src)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : {</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : uint8_t ecc, badbit;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : uint64_t data;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : data = be64_to_cpu(src-&gt;data);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : ecc = src-&gt;ecc;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : badbit = eccverify(data, ecc);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : if (badbit == UE) {</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;ECC: uncorrectable error: %016llx %02x\n&quot;, (unsigned long long int)data, ecc);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : return badbit;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : }</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : if (badbit &lt;= UE)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : FL_INF(&quot;ECC: correctable error: %i\n&quot;, badbit);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : if (badbit &lt; 64)</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : *dst = cpu_to_be64(eccflipbit(data, badbit));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : else</a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : *dst = cpu_to_be64(data);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : return 0;</a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : static beint64_t *inc_beint64_by(const void *p, uint64_t i)</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : {</a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return (beint64_t *)(((char *)p) + i);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : static uint64_t *inc_uint64_by(const void *p, uint64_t i)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : {</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : return (uint64_t *)(((char *)p) + i);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : static struct ecc64 *inc_ecc64_by(struct ecc64 *p, uint64_t i)</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : {</a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : return (struct ecc64 *)(((char *)p) + i);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : }</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : static uint64_t whole_ecc_bytes(uint64_t i)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : {</a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : return i &amp; ~(BYTES_PER_ECC - 1);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : static uint64_t whole_ecc_structs(uint64_t i)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : {</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return whole_ecc_bytes(i) &gt;&gt; 3;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : /**</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * Correct it along the way and check for errors.</a>
+<a name="196"><span class="lineNum"> 196 </span> : : *</a>
+<a name="197"><span class="lineNum"> 197 </span> : : * @dst: destination buffer without ECC</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * @src: source buffer with ECC</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="200"><span class="lineNum"> 200 </span> : : * Must be 8 byte aligned.</a>
+<a name="201"><span class="lineNum"> 201 </span> : : *</a>
+<a name="202"><span class="lineNum"> 202 </span> : : * @return: Success or error</a>
+<a name="203"><span class="lineNum"> 203 </span> : : *</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * @retval: 0 - success</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @retfal: other - fail</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len)</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : uint32_t i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : if (len &amp; 0x7) {</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* TODO: we could probably handle this */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;ECC data length must be 8 byte aligned length:%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : len);</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : len &gt;&gt;= 3;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : rc = eccbyte(dst, src + i);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : dst++;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> : : return 0;</a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * Correct it along the way and check for errors.</a>
+<a name="234"><span class="lineNum"> 234 </span> : : *</a>
+<a name="235"><span class="lineNum"> 235 </span> : : * Unlike memcmp_from_ecc() which requires that the first byte into</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * dst be the first byte in src (which must also be aligned to a</a>
+<a name="237"><span class="lineNum"> 237 </span> : : * struct ecc64 struct boundary) this function can cope with the first</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * byte in dst not being the first byte in src.</a>
+<a name="239"><span class="lineNum"> 239 </span> : : *</a>
+<a name="240"><span class="lineNum"> 240 </span> : : * Note: src MUST still be aligned to a struct ecc64 otherwise ECC</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * calculations are impossible.</a>
+<a name="242"><span class="lineNum"> 242 </span> : : *</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * The alignment parameter species the number of bytes present at the</a>
+<a name="244"><span class="lineNum"> 244 </span> : : * start of src that should be skipped and not written to dst. Once</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * again, these bytes must be in src otherwise the ECC cannot be</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * checked.</a>
+<a name="247"><span class="lineNum"> 247 </span> : : *</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * len also doesn't have any value limitation for this function. Of</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * course src must contain an exact multiple of struct ecc64 otherwise</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * ECC calculation cannot be performed but this function won't copy</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * the entirety of the last src data word if len is not mutiple of 8</a>
+<a name="252"><span class="lineNum"> 252 </span> : : *</a>
+<a name="253"><span class="lineNum"> 253 </span> : : * @dst: destination buffer without ECC</a>
+<a name="254"><span class="lineNum"> 254 </span> : : * @src: source buffer with ECC</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * @alignment: number of leading bytes in src which shouldn't be</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * copied to dst</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * @return: Success or error</a>
+<a name="259"><span class="lineNum"> 259 </span> : : *</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @retval: 0 - success</a>
+<a name="261"><span class="lineNum"> 261 </span> : : * @retfal: other - fail</a>
+<a name="262"><span class="lineNum"> 262 </span> : : */</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src,</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="265"><span class="lineNum"> 265 </span> : : {</a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : char data[BYTES_PER_ECC];</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : uint8_t bytes_wanted;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : if (alignment &gt; 8)</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : return -1;</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /*</a>
+<a name="276"><span class="lineNum"> 276 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * required - otherwise jump straight to memcpy_from_ecc()</a>
+<a name="278"><span class="lineNum"> 278 </span> : : */</a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : if (alignment) {</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : return rc;</a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : memcpy(dst, &amp;data[alignment], bytes_wanted);</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : src = inc_ecc64_by(src, sizeof(struct ecc64));</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : dst = inc_beint64_by(dst, bytes_wanted);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : len -= bytes_wanted;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : }</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : rc = memcpy_from_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : return rc;</a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> : : /*</a>
+<a name="297"><span class="lineNum"> 297 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * here, (dst and src are different types)</a>
+<a name="299"><span class="lineNum"> 299 </span> : : */</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : dst += whole_ecc_structs(len);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : src += whole_ecc_structs(len);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : len -= whole_ecc_bytes(len);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : if (len) {</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineNoCov"> 0 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : return rc;</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : memcpy(dst, data, len);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : }</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> : : return 0;</a>
+<a name="314"><span class="lineNum"> 314 </span> : : }</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> : : /**</a>
+<a name="317"><span class="lineNum"> 317 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="318"><span class="lineNum"> 318 </span> : : *</a>
+<a name="319"><span class="lineNum"> 319 </span> : : * @dst: destination buffer with ECC</a>
+<a name="320"><span class="lineNum"> 320 </span> : : * @src: source buffer without ECC</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * Must be 8 byte aligned.</a>
+<a name="324"><span class="lineNum"> 324 </span> : : *</a>
+<a name="325"><span class="lineNum"> 325 </span> : : * @return: success or failure</a>
+<a name="326"><span class="lineNum"> 326 </span> : : *</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * @retval: 0 - success</a>
+<a name="328"><span class="lineNum"> 328 </span> : : * @retfal: other - fail</a>
+<a name="329"><span class="lineNum"> 329 </span> : : */</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : {</a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : struct ecc64 ecc_word;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineNoCov"> 0 : uint64_t i;</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineNoCov"> 0 : if (len &amp; 0x7) {</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : /* TODO: we could probably handle this */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;Data to add ECC bytes to must be 8 byte aligned length: %&quot;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : PRIx64 &quot;\n&quot;, len);</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineNoCov"> 0 : len &gt;&gt;= 3;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : ecc_word.ecc = eccgenerate(be64_to_cpu(*(src + i)));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : ecc_word.data = *(src + i);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : </a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineNoCov"> 0 : *(dst + i) = ecc_word;</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : }</a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : return 0;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : }</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> : : /**</a>
+<a name="356"><span class="lineNum"> 356 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="357"><span class="lineNum"> 357 </span> : : *</a>
+<a name="358"><span class="lineNum"> 358 </span> : : * Unlike memcmp_to_ecc() which requires that the first byte in src be</a>
+<a name="359"><span class="lineNum"> 359 </span> : : * the first byte of a struct ecc64 structure this function does not</a>
+<a name="360"><span class="lineNum"> 360 </span> : : * have this requirement.</a>
+<a name="361"><span class="lineNum"> 361 </span> : : *</a>
+<a name="362"><span class="lineNum"> 362 </span> : : * Like memcpy_to_ecc_unaligned() the alignment parameter specfies the</a>
+<a name="363"><span class="lineNum"> 363 </span> : : * number of bytes in the first src word that are missing and would be</a>
+<a name="364"><span class="lineNum"> 364 </span> : : * required to form a struct ecc64 structure.</a>
+<a name="365"><span class="lineNum"> 365 </span> : : *</a>
+<a name="366"><span class="lineNum"> 366 </span> : : * It must be noted here that extra work IN THE CALLER must be done</a>
+<a name="367"><span class="lineNum"> 367 </span> : : * if your data is unaligned. In order to peform ECC calculations</a>
+<a name="368"><span class="lineNum"> 368 </span> : : * whatever portions of the ecc words are missing in src must be in</a>
+<a name="369"><span class="lineNum"> 369 </span> : : * dst.</a>
+<a name="370"><span class="lineNum"> 370 </span> : : *</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * For example, if there is an alignment value of 1 then this means</a>
+<a name="372"><span class="lineNum"> 372 </span> : : * there is 1 byte (of the total of 8 bytes) missing in src which is</a>
+<a name="373"><span class="lineNum"> 373 </span> : : * needed to calculate the first ECC byte. Therefore the first byte of</a>
+<a name="374"><span class="lineNum"> 374 </span> : : * dst MUST CONTAIN IT!</a>
+<a name="375"><span class="lineNum"> 375 </span> : : *</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * The same problem exists for the end of the buffer where src may not</a>
+<a name="377"><span class="lineNum"> 377 </span> : : * end exactly aligned, if this is the case dst must contain the</a>
+<a name="378"><span class="lineNum"> 378 </span> : : * required bytes to calculate the last ECC byte - they should be in</a>
+<a name="379"><span class="lineNum"> 379 </span> : : * dst where they would normally be found if src did contain those</a>
+<a name="380"><span class="lineNum"> 380 </span> : : * bytes.</a>
+<a name="381"><span class="lineNum"> 381 </span> : : *</a>
+<a name="382"><span class="lineNum"> 382 </span> : : * @dst: destination buffer with ECC</a>
+<a name="383"><span class="lineNum"> 383 </span> : : * @src: source buffer without ECC</a>
+<a name="384"><span class="lineNum"> 384 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="385"><span class="lineNum"> 385 </span> : : * @alignment: The number of bytes 'missing' from the start of src to</a>
+<a name="386"><span class="lineNum"> 386 </span> : : * be struct ecc64 aligned</a>
+<a name="387"><span class="lineNum"> 387 </span> : : *</a>
+<a name="388"><span class="lineNum"> 388 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="389"><span class="lineNum"> 389 </span> : : * Must be 8 byte aligned.</a>
+<a name="390"><span class="lineNum"> 390 </span> : : *</a>
+<a name="391"><span class="lineNum"> 391 </span> : : * @return: success or failure</a>
+<a name="392"><span class="lineNum"> 392 </span> : : *</a>
+<a name="393"><span class="lineNum"> 393 </span> : : * @retval: 0 - success</a>
+<a name="394"><span class="lineNum"> 394 </span> : : * @retfal: other - fail</a>
+<a name="395"><span class="lineNum"> 395 </span> : : */</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src,</span></a>
+<a name="398"><span class="lineNum"> 398 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="399"><span class="lineNum"> 399 </span> : : {</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : struct ecc64 ecc_word;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : uint8_t bytes_wanted;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> : : /*</a>
+<a name="407"><span class="lineNum"> 407 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="408"><span class="lineNum"> 408 </span> : : * required - otherwise jump straight to memcpy_to_ecc()</a>
+<a name="409"><span class="lineNum"> 409 </span> : : */</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : if (alignment) {</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : ecc_word.data = dst-&gt;data;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : memcpy(inc_uint64_by(&amp;ecc_word.data, alignment), src, bytes_wanted);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : memcpy(dst, inc_ecc64_by(&amp;ecc_word, alignment),</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : sizeof(struct ecc64) - alignment);</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : dst = inc_ecc64_by(dst, sizeof(struct ecc64) - alignment);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : src = inc_beint64_by(src, bytes_wanted);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : len -= bytes_wanted;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : return rc;</a>
+<a name="427"><span class="lineNum"> 427 </span> : : </a>
+<a name="428"><span class="lineNum"> 428 </span> : : /*</a>
+<a name="429"><span class="lineNum"> 429 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="430"><span class="lineNum"> 430 </span> : : * here, (dst and src are different types)</a>
+<a name="431"><span class="lineNum"> 431 </span> : : */</a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : dst += whole_ecc_structs(len);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : src += whole_ecc_structs(len);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineNoCov"> 0 : len -= whole_ecc_bytes(len);</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : if (len) {</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineNoCov"> 0 : bytes_wanted = BYTES_PER_ECC - len;</span></a>
+<a name="439"><span class="lineNum"> 439 </span> : : </a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : ecc_word.data = *src;</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : memcpy(inc_uint64_by(&amp;ecc_word.data, len), inc_ecc64_by(dst, len),</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : bytes_wanted);</a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineNoCov"> 0 : *dst = ecc_word;</span></a>
+<a name="446"><span class="lineNum"> 446 </span> : : }</a>
+<a name="447"><span class="lineNum"> 447 </span> : : </a>
+<a name="448"><span class="lineNum"> 448 </span> : : return 0;</a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/ecc.h.func-sort-c.html b/coverage-report/external/pflash/libflash/ecc.h.func-sort-c.html
new file mode 100644
index 0000000..bbbd4fe
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/ecc.h.func-sort-c.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.h.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/ecc.h.func.html b/coverage-report/external/pflash/libflash/ecc.h.func.html
new file mode 100644
index 0000000..a88d297
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/ecc.h.func.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.h.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/ecc.h.gcov.html b/coverage-report/external/pflash/libflash/ecc.h.gcov.html
new file mode 100644
index 0000000..df2e8d8
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/ecc.h.gcov.html
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/ecc.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - ecc.h<span style="font-size: 80%;"> (source / <a href="ecc.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #ifndef __ECC_H</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #define __ECC_H</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct ecc64 {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : beint64_t data;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : uint8_t ecc;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : } __attribute__((__packed__));</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : extern int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len);</a>
+<a name="20"><span class="lineNum"> 20 </span> : : extern int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src, uint64_t len,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint8_t alignment);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : extern int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src, uint64_t len,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : uint8_t alignment);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /*</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Calculate the size of a buffer if ECC is added</a>
+<a name="29"><span class="lineNum"> 29 </span> : : *</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * We add 1 byte of ecc for every 8 bytes of data. So we need to round up to 8</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * bytes length and then add 1/8</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #ifndef ALIGN_UP</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define ALIGN_UP(_v, _a) (((_v) + (_a) - 1) &amp; ~((_a) - 1))</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #endif</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define BYTES_PER_ECC 8</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : static inline uint64_t ecc_size(uint64_t len)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : return ALIGN_UP(len, BYTES_PER_ECC) &gt;&gt; 3;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : static inline uint64_t ecc_buffer_size(uint64_t len)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : return ALIGN_UP(len, BYTES_PER_ECC) + ecc_size(len);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : static inline int ecc_buffer_size_check(uint64_t len)</a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> : : return len % (BYTES_PER_ECC + 1);</a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : static inline uint64_t ecc_buffer_size_minus_ecc(uint64_t len)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : return len * BYTES_PER_ECC / (BYTES_PER_ECC + 1);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : }</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : static inline uint64_t ecc_buffer_align(uint64_t start, uint64_t pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineNoCov"> 0 : return pos - ((pos - start) % (BYTES_PER_ECC + 1));</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : }</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : #endif</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/file.c.func-sort-c.html b/coverage-report/external/pflash/libflash/file.c.func-sort-c.html
new file mode 100644
index 0000000..7675223
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/file.c.func-sort-c.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">108</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">58.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="file.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">3328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">3331</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/file.c.func.html b/coverage-report/external/pflash/libflash/file.c.func.html
new file mode 100644
index 0000000..22ef5fc
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/file.c.func.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">108</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">58.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="file.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">3328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">3331</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/file.c.gcov.html b/coverage-report/external/pflash/libflash/file.c.gcov.html
new file mode 100644
index 0000000..7715c67
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/file.c.gcov.html
@@ -0,0 +1,471 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/file.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - file.c<span style="font-size: 80%;"> (source / <a href="file.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">108</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">58.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define _GNU_SOURCE</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;errno.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/ioctl.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;limits.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;mtd/mtd-abi.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;libflash/file.h&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct file_data {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : int fd;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : char *name;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : char *path;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct blocklevel_device bl;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : };</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : static int file_release(struct blocklevel_device *bl)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : close(file_data-&gt;fd);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = -1;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : static int file_reacquire(struct blocklevel_device *bl)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : int fd;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : fd = open(file_data-&gt;path, O_RDWR);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : if (fd == -1)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = fd;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 18 : static int file_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 18 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 18 : int rc, count = 0;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 18 : rc = lseek(file_data-&gt;fd, pos, SEEK_SET);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : /* errno should remain set */</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 18 : if (rc != pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 36 : while (count &lt; len) {</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 18 : rc = read(file_data-&gt;fd, buf, len - count);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* errno should remain set */</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 18 : if (rc == -1 || rc == 0)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 18 : buf += rc;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 18 : count += rc;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : return 0;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 3331 : static int file_write(struct blocklevel_device *bl, uint64_t dst, const void *src,</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : uint64_t len)</a>
+<a name="77"><span class="lineNum"> 77 </span> : : {</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 3331 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 3331 : int rc, count = 0;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 3331 : rc = lseek(file_data-&gt;fd, dst, SEEK_SET);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* errno should remain set */</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 3331 : if (rc != dst)</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 6662 : while (count &lt; len) {</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 3331 : rc = write(file_data-&gt;fd, src, len - count);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* errno should remain set */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 3331 : if (rc == -1)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 3331 : src += rc;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 3331 : count += rc;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : }</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : return 0;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /*</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * Due to to the fact these interfaces are ultimately supposed to deal with</a>
+<a name="101"><span class="lineNum"> 101 </span> : : * flash, an erase function must be implemented even when the flash images</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * are backed by regular files.</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Also, erasing flash leaves all the bits set to 1. This may be expected</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * by higher level functions so this function should also emulate that</a>
+<a name="105"><span class="lineNum"> 105 </span> : : */</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 3328 : static int file_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 3328 : static char buf[4096];</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 3328 : int i = 0;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 3328 : int rc;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 3328 : memset(buf, ~0, sizeof(buf));</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 6656 : while (len - i &gt; 0) {</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 3328 : rc = file_write(bl, dst + i, buf, len - i &gt; sizeof(buf) ? sizeof(buf) : len - i);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 3328 : if (rc)</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 3328 : i += (len - i &gt; sizeof(buf)) ? sizeof(buf) : len - i;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : return 0;</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : static int mtd_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : {</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : int err;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: dst: 0x%&quot; PRIx64 &quot;, len: 0x%&quot; PRIx64 &quot;\n&quot;, __func__, dst, len);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : /*</a>
+<a name="132"><span class="lineNum"> 132 </span> : : * Some kernels that pflash supports do not know about the 64bit</a>
+<a name="133"><span class="lineNum"> 133 </span> : : * version of the ioctl() therefore we'll just use the 32bit (which</a>
+<a name="134"><span class="lineNum"> 134 </span> : : * should always be supported...) unless we MUST use the 64bit and</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * then lets just hope the kernel knows how to deal with it. If it</a>
+<a name="136"><span class="lineNum"> 136 </span> : : * is unsupported the ioctl() will fail and we'll report that -</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * there is no other option.</a>
+<a name="138"><span class="lineNum"> 138 </span> : : *</a>
+<a name="139"><span class="lineNum"> 139 </span> : : * Furthermore, even very recent MTD layers and drivers aren't</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * particularly good at not blocking in the kernel. This creates</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * unexpected behaviour in userspace tools using these functions.</a>
+<a name="142"><span class="lineNum"> 142 </span> : : * In the absence of significant work inside the kernel, we'll just</a>
+<a name="143"><span class="lineNum"> 143 </span> : : * split stuff up here for convenience.</a>
+<a name="144"><span class="lineNum"> 144 </span> : : * We can assume everything is aligned here.</a>
+<a name="145"><span class="lineNum"> 145 </span> : : */</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : while (len) {</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : if (dst &gt; UINT_MAX || len &gt; UINT_MAX) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : struct erase_info_user64 erase_info = {</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : .start = dst,</a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : };</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE64, &amp;erase_info) == -1) {</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : if (err == 25) /* Kernel doesn't do 64bit MTD erase ioctl() */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Attempted a 64bit erase on a kernel which doesn't support it\n&quot;);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : } else {</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : struct erase_info_user erase_info = {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : .start = dst,</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : };</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE, &amp;erase_info) == -1) {</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : dst += file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : len -= file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : }</a>
+<a name="176"><span class="lineNum"> 176 </span> : : return 0;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 11 : static int get_info_name(struct file_data *file_data, char **name)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : {</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 11 : char *path, *lpath;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 11 : int len;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 11 : struct stat st;</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 11 : if (asprintf(&amp;path, &quot;/proc/self/fd/%d&quot;, file_data-&gt;fd) == -1)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 11 : if (lstat(path, &amp;st)) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 11 : lpath = malloc(st.st_size + 1);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 11 : if (!lpath) {</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : }</a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 11 : len = readlink(path, lpath, st.st_size +1);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 11 : if (len == -1) {</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : free(lpath);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 11 : lpath[len] = '\0';</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 11 : *name = lpath;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 11 : free(path);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 11 : return 0;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : static int mtd_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : struct mtd_info_user mtd_info;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : rc = ioctl(file_data-&gt;fd, MEMGETINFO, &amp;mtd_info);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : if (rc == -1)</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : *total_size = mtd_info.size;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : *erase_granule = mtd_info.erasesize;</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : if (name) {</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : return rc;</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : *name = file_data-&gt;name;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : }</a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : return 0;</a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 20 : static int file_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="243"><span class="lineNum"> 243 </span> : : {</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 20 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 20 : struct stat st;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 20 : int rc;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 20 : if (fstat(file_data-&gt;fd, &amp;st))</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 20 : if (total_size)</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 20 : *total_size = st.st_size;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 20 : if (erase_granule)</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 11 : *erase_granule = 1;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 20 : if (name) {</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 11 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : return rc;</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 11 : *name = file_data-&gt;name;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : return 0;</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 11 : int file_init(int fd, struct blocklevel_device **bl)</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : {</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 11 : struct file_data *file_data;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 11 : struct stat sbuf;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 11 : if (!bl)</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 11 : *bl = NULL;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 11 : file_data = calloc(1, sizeof(struct file_data));</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 11 : if (!file_data)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 11 : file_data-&gt;fd = fd;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.reacquire = &amp;file_reacquire;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.release = &amp;file_release;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.read = &amp;file_read;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.write = &amp;file_write;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.erase = &amp;file_erase;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.get_info = &amp;file_get_info;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.erase_mask = 0;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> : : /*</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * If the blocklevel_device is only inited with file_init() then keep</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * alive is assumed, as fd will change otherwise and this may break</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * callers assumptions.</a>
+<a name="294"><span class="lineNum"> 294 </span> : : */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.keep_alive = 1;</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /*</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * Unfortunately not all file descriptors are created equal...</a>
+<a name="299"><span class="lineNum"> 299 </span> : : * Here we check to see if the file descriptor is to an MTD device, in</a>
+<a name="300"><span class="lineNum"> 300 </span> : : * which case we have to erase and get the size of it differently.</a>
+<a name="301"><span class="lineNum"> 301 </span> : : */</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 11 : if (fstat(file_data-&gt;fd, &amp;sbuf) == -1)</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : /* Won't be able to handle other than MTD devices for now */</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 11 : if (S_ISCHR(sbuf.st_mode)) {</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase = &amp;mtd_erase;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.get_info = &amp;mtd_get_info;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : mtd_get_info(&amp;file_data-&gt;bl, NULL, NULL, &amp;(file_data-&gt;bl.erase_mask));</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase_mask--;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 11 : } else if (!S_ISREG(sbuf.st_mode)) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : /* If not a char device or a regular file something went wrong */</a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : }</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 11 : *bl = &amp;(file_data-&gt;bl);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 11 : return 0;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : free(file_data);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : }</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 11 : int file_init_path(const char *path, int *r_fd, bool keep_alive,</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : struct blocklevel_device **bl)</a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 11 : int fd, rc;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 11 : char *path_ptr = NULL;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 11 : struct file_data *file_data;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 11 : if (!path || !bl)</span></a>
+<a name="332"><span class="lineNum"> 332 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 11 : fd = open(path, O_RDWR);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 11 : if (fd == -1)</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : /*</a>
+<a name="339"><span class="lineNum"> 339 </span> : : * strdup() first so don't have to deal with malloc failure after</a>
+<a name="340"><span class="lineNum"> 340 </span> : : * file_init()</a>
+<a name="341"><span class="lineNum"> 341 </span> : : */</a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 11 : path_ptr = strdup(path);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 11 : if (!path_ptr) {</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : }</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 11 : rc = file_init(fd, bl);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 11 : file_data = container_of(*bl, struct file_data, bl);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 11 : file_data-&gt;bl.keep_alive = keep_alive;</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 11 : file_data-&gt;path = path_ptr;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 11 : if (r_fd)</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : *r_fd = fd;</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : </a>
+<a name="359"><span class="lineNum"> 359 </span> : : return rc;</a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : free(path_ptr);</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : close(fd);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : }</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 11 : void file_exit(struct blocklevel_device *bl)</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : {</a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 11 : struct file_data *file_data;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 11 : if (bl) {</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 11 : free(bl-&gt;ecc_prot.prot);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 11 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 11 : free(file_data-&gt;name);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 11 : free(file_data-&gt;path);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 11 : free(file_data);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> : : }</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 11 : }</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : </a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 11 : void file_exit_close(struct blocklevel_device *bl)</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : {</a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 11 : struct file_data *file_data;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 11 : if (bl) {</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 11 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 11 : close(file_data-&gt;fd);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 11 : file_exit(bl);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 11 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/index-sort-b.html b/coverage-report/external/pflash/libflash/index-sort-b.html
new file mode 100644
index 0000000..bec0f13
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/index-sort-b.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">409</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">26.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">43.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=59 height=10 alt="58.7%"><img src="../../../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 106</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.3%"><img src="../../../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=24 height=10 alt="24.3%"><img src="../../../snow.png" width=76 height=10 alt="24.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">24.3&nbsp;%</td>
+ <td class="coverNumLo">93 / 382</td>
+ <td class="coverPerMed">78.6&nbsp;%</td>
+ <td class="coverNumMed">11 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/index-sort-f.html b/coverage-report/external/pflash/libflash/index-sort-f.html
new file mode 100644
index 0000000..10f7495
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/index-sort-f.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">409</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">26.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">43.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 106</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.3%"><img src="../../../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=59 height=10 alt="58.7%"><img src="../../../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=24 height=10 alt="24.3%"><img src="../../../snow.png" width=76 height=10 alt="24.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">24.3&nbsp;%</td>
+ <td class="coverNumLo">93 / 382</td>
+ <td class="coverPerMed">78.6&nbsp;%</td>
+ <td class="coverNumMed">11 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/index-sort-l.html b/coverage-report/external/pflash/libflash/index-sort-l.html
new file mode 100644
index 0000000..6758871
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/index-sort-l.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">409</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">26.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">43.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 106</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=24 height=10 alt="24.3%"><img src="../../../snow.png" width=76 height=10 alt="24.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">24.3&nbsp;%</td>
+ <td class="coverNumLo">93 / 382</td>
+ <td class="coverPerMed">78.6&nbsp;%</td>
+ <td class="coverNumMed">11 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.3%"><img src="../../../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=59 height=10 alt="58.7%"><img src="../../../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/index.html b/coverage-report/external/pflash/libflash/index.html
new file mode 100644
index 0000000..4d737ba
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/index.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - external/pflash/libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">409</td>
+ <td class="headerCovTableEntry">1530</td>
+ <td class="headerCovTableEntryLo">26.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntry">85</td>
+ <td class="headerCovTableEntryLo">43.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=24 height=10 alt="24.3%"><img src="../../../snow.png" width=76 height=10 alt="24.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">24.3&nbsp;%</td>
+ <td class="coverNumLo">93 / 382</td>
+ <td class="coverPerMed">78.6&nbsp;%</td>
+ <td class="coverNumMed">11 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 106</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=59 height=10 alt="58.7%"><img src="../../../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.3%"><img src="../../../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 419</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/libffs.c.func-sort-c.html b/coverage-report/external/pflash/libflash/libffs.c.func-sort-c.html
new file mode 100644
index 0000000..0013f9e
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/libffs.c.func-sort-c.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">208</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">48.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">60.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libffs.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/libffs.c.func.html b/coverage-report/external/pflash/libflash/libffs.c.func.html
new file mode 100644
index 0000000..19bee5a
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/libffs.c.func.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">208</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">48.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">60.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libffs.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/libffs.c.gcov.html b/coverage-report/external/pflash/libflash/libffs.c.gcov.html
new file mode 100644
index 0000000..5ef3c03
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/libffs.c.gcov.html
@@ -0,0 +1,927 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/libffs.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - libffs.c<span style="font-size: 80%;"> (source / <a href="libffs.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">208</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">48.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">60.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;limits.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #ifndef __SKIBOOT__</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #endif</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;ffs.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define __unused __attribute__((unused))</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define HDR_ENTRIES_NUM 30</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct ffs_handle {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : struct ffs_hdr hdr; /* Converted header */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint32_t toc_offset;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : uint32_t max_size;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : /* The converted header knows how big this is */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct __ffs_hdr *cache;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct blocklevel_device *bl;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : };</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 59 : static uint32_t ffs_checksum(void* data, size_t size)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : {</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 59 : uint32_t i, csum = 0;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1947 : for (i = csum = 0; i &lt; (size/4); i++)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 2028 : csum ^= ((uint32_t *)data)[i];</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 69 : return csum;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : /* Helper functions for typesafety and size safety */</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : static uint32_t ffs_hdr_checksum(struct __ffs_hdr *hdr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : return ffs_checksum(hdr, sizeof(struct __ffs_hdr));</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 60 : static uint32_t ffs_entry_checksum(struct __ffs_entry *ent)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 33 : return ffs_checksum(ent, sizeof(struct __ffs_entry));</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 2 : static size_t ffs_hdr_raw_size(int num_entries)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : {</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 2 : return sizeof(struct __ffs_hdr) + num_entries * sizeof(struct __ffs_entry);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : static int ffs_num_entries(struct ffs_hdr *hdr)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == 0)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s returned zero!\n&quot;, __func__);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : return hdr-&gt;count;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 9 : static int ffs_check_convert_header(struct ffs_hdr *dst, struct __ffs_hdr *src)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 9 : if (be32_to_cpu(src-&gt;magic) != FFS_MAGIC)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : return FFS_ERR_BAD_MAGIC;</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 9 : dst-&gt;version = be32_to_cpu(src-&gt;version);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 9 : if (dst-&gt;version != FFS_VERSION_1)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FFS_ERR_BAD_VERSION;</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 117 : if (ffs_hdr_checksum(src) != 0)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 9 : if (be32_to_cpu(src-&gt;entry_size) != sizeof(struct __ffs_entry))</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 9 : if ((be32_to_cpu(src-&gt;entry_size) * be32_to_cpu(src-&gt;entry_count)) &gt;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 9 : (be32_to_cpu(src-&gt;block_size) * be32_to_cpu(src-&gt;size)))</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 9 : dst-&gt;block_size = be32_to_cpu(src-&gt;block_size);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 9 : dst-&gt;size = be32_to_cpu(src-&gt;size) * dst-&gt;block_size;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 9 : dst-&gt;block_count = be32_to_cpu(src-&gt;block_count);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 9 : dst-&gt;entries_size = be32_to_cpu(src-&gt;entry_count);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 9 : return 0;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : }</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : static int ffs_entry_user_to_flash(struct ffs_hdr *hdr __unused,</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : struct __ffs_entry_user *dst, struct ffs_entry_user *src)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : memset(dst, 0, sizeof(struct __ffs_entry_user));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : dst-&gt;datainteg = cpu_to_be16(src-&gt;datainteg);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 59 : static int ffs_entry_user_to_cpu(struct ffs_hdr *hdr __unused,</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : struct ffs_entry_user *dst, struct __ffs_entry_user *src)</a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 59 : memset(dst, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 59 : dst-&gt;datainteg = be16_to_cpu(src-&gt;datainteg);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 59 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 59 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 59 : return 0;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : static int ffs_entry_to_flash(struct ffs_hdr *hdr,</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : struct __ffs_entry *dst, struct ffs_entry *src)</a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : int rc, index;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : if (!hdr || !dst || !src)</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : return -1;</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 2 : for (index = 0; index &lt; hdr-&gt;count &amp;&amp; hdr-&gt;entries[index] != src; index++);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : if (index == hdr-&gt;count)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : index++; /* On flash indexes start at 1 */</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : /*</a>
+<a name="119"><span class="lineNum"> 119 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * dst-&gt;checksum must be zero before calling ffs_entry_checksum()</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * appears the reserved fields are always zero.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : */</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : memset(dst, 0, sizeof(*dst));</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : dst-&gt;base = cpu_to_be32(src-&gt;base / hdr-&gt;block_size);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : dst-&gt;size = cpu_to_be32(src-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : dst-&gt;pid = cpu_to_be32(src-&gt;pid);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : dst-&gt;id = cpu_to_be32(index);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : dst-&gt;type = cpu_to_be32(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 1 : dst-&gt;flags = cpu_to_be32(src-&gt;flags);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : dst-&gt;actual = cpu_to_be32(src-&gt;actual);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : rc = ffs_entry_user_to_flash(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : dst-&gt;checksum = ffs_entry_checksum(dst);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 59 : static int ffs_entry_to_cpu(struct ffs_hdr *hdr,</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : struct ffs_entry *dst, struct __ffs_entry *src)</a>
+<a name="143"><span class="lineNum"> 143 </span> : : {</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 59 : int rc;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 118 : if (ffs_entry_checksum(src) != 0)</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 59 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 59 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 59 : dst-&gt;base = be32_to_cpu(src-&gt;base) * hdr-&gt;block_size;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 59 : dst-&gt;size = be32_to_cpu(src-&gt;size) * hdr-&gt;block_size;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 59 : dst-&gt;actual = be32_to_cpu(src-&gt;actual);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 59 : dst-&gt;pid = be32_to_cpu(src-&gt;pid);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 59 : dst-&gt;type = be32_to_cpu(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 59 : dst-&gt;flags = be32_to_cpu(src-&gt;flags);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 59 : rc = ffs_entry_user_to_cpu(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 59 : return rc;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 7 : char *ffs_entry_user_to_string(struct ffs_entry_user *user)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : {</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 7 : char *ret;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 7 : if (!user)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : return NULL;</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 7 : ret = strdup(&quot;----------&quot;);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 7 : if (!ret)</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : return NULL;</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 7 : if (user-&gt;datainteg &amp; FFS_ENRY_INTEG_ECC)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 4 : ret[0] = 'E';</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 7 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512V)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 1 : ret[1] = 'L';</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 7 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512EC)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : ret[2] = 'I';</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_PRESERVED)</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : ret[3] = 'P';</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_READONLY)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : ret[4] = 'R';</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_BACKUP)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : ret[5] = 'B';</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_REPROVISION)</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 3 : ret[6] = 'F';</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_GOLDEN)</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : ret[7] = 'G';</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_CLEARECC)</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 1 : ret[8] = 'C';</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_VOLATILE)</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 1 : ret[9] = 'V';</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : return ret;</a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : int ffs_string_to_entry_user(const char *flags, int nflags,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : struct ffs_entry_user *user)</a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : if (!user || !flags)</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : memset(user, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; nflags; i++) {</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : switch (flags[i]) {</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : case 'E':</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : user-&gt;datainteg |= FFS_ENRY_INTEG_ECC;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : case 'L':</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : user-&gt;vercheck |= FFS_VERCHECK_SHA512V;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : case 'I':</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : user-&gt;vercheck |= FFS_VERCHECK_SHA512EC;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : case 'P':</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_PRESERVED;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : case 'R':</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_READONLY;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : case 'B':</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_BACKUP;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : case 'F':</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_REPROVISION;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : case 'G':</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_GOLDEN;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : case 'C':</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_CLEARECC;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : case 'V':</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_VOLATILE;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Unknown flag '%c'\n&quot;, flags[i]);</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : }</a>
+<a name="251"><span class="lineNum"> 251 </span> : : }</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> : : return 0;</a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 36 : bool has_flag(struct ffs_entry *ent, uint16_t flag)</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 36 : return ((ent-&gt;user.miscflags &amp; flag) != 0);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : }</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 40 : static struct ffs_entry *__ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : {</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 40 : if (index &gt;= ffs-&gt;hdr.count)</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : return NULL;</a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 39 : return ffs-&gt;hdr.entries[index];</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 16 : struct ffs_entry *ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 16 : struct ffs_entry *ret = __ffs_entry_get(ffs, index);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 16 : if (ret)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 16 : ret-&gt;ref++;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 16 : return ret;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 72 : struct ffs_entry *ffs_entry_put(struct ffs_entry *ent)</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : {</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 72 : if (!ent)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return NULL;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 72 : ent-&gt;ref--;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 72 : if (ent-&gt;ref == 0) {</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 57 : free(ent);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 57 : ent = NULL;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> : : return ent;</a>
+<a name="288"><span class="lineNum"> 288 </span> : : }</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 14 : bool has_ecc(struct ffs_entry *ent)</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : {</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 14 : return ((ent-&gt;user.datainteg &amp; FFS_ENRY_INTEG_ECC) != 0);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 9 : int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : struct ffs_handle **ffs, bool mark_ecc)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 9 : struct __ffs_hdr blank_hdr;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 9 : struct __ffs_hdr raw_hdr;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 9 : struct ffs_handle *f;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 9 : uint64_t total_size;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 9 : int rc, i;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 9 : if (!ffs || !bl)</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 9 : *ffs = NULL;</span></a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 9 : rc = blocklevel_get_info(bl, NULL, &amp;total_size, NULL);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d retrieving flash info\n&quot;, rc);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : }</a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 9 : if (total_size &gt; UINT_MAX)</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 9 : if ((offset + max_size) &lt; offset)</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 9 : if ((max_size &gt; total_size))</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Read flash header */</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 9 : rc = blocklevel_read(bl, offset, &amp;raw_hdr, sizeof(raw_hdr));</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash header\n&quot;, rc);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /*</a>
+<a name="329"><span class="lineNum"> 329 </span> : : * Flash controllers can get deconfigured or otherwise upset, when this</a>
+<a name="330"><span class="lineNum"> 330 </span> : : * happens they return all 0xFF bytes.</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * An __ffs_hdr consisting of all 0xFF cannot be valid and it would be</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * nice to drop a hint to the user to help with debugging. This will</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * help quickly differentiate between flash corruption and standard</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * type 'reading from the wrong place' errors vs controller errors or</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * reading erased data.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 9 : memset(&amp;blank_hdr, UINT_MAX, sizeof(struct __ffs_hdr));</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 9 : if (memcmp(&amp;blank_hdr, &amp;raw_hdr, sizeof(struct __ffs_hdr)) == 0) {</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Reading the flash has returned all 0xFF.\n&quot;);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Are you reading erased flash?\n&quot;);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Is something else using the flash controller?\n&quot;);</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_BAD_READ;</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : }</a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> : : /* Allocate ffs_handle structure and start populating */</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 9 : f = calloc(1, sizeof(*f));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 9 : if (!f)</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 9 : f-&gt;toc_offset = offset;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 9 : f-&gt;max_size = max_size;</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 9 : f-&gt;bl = bl;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : </a>
+<a name="354"><span class="lineNum"> 354 </span> : : /* Convert and check flash header */</a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 9 : rc = ffs_check_convert_header(&amp;f-&gt;hdr, &amp;raw_hdr);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : FL_INF(&quot;FFS: Flash header not found. Code: %d\n&quot;, rc);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> : : }</a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Check header is sane */</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 9 : if ((f-&gt;hdr.block_count * f-&gt;hdr.block_size) &gt; max_size) {</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Flash header exceeds max flash size\n&quot;);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : }</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 9 : f-&gt;hdr.entries = calloc(f-&gt;hdr.entries_size, sizeof(struct ffs_entry *));</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> : : /*</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * Grab the entire partition header</a>
+<a name="372"><span class="lineNum"> 372 </span> : : */</a>
+<a name="373"><span class="lineNum"> 373 </span> : : /* Check for overflow or a silly size */</a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 9 : if (!f-&gt;hdr.size || f-&gt;hdr.size % f-&gt;hdr.block_size != 0) {</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Cache size overflow (0x%x * 0x%x)\n&quot;,</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : f-&gt;hdr.block_size, f-&gt;hdr.size);</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : }</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 9 : FL_DBG(&quot;FFS: Partition map size: 0x%x\n&quot;, f-&gt;hdr.size);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> : : /* Allocate cache */</a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 9 : f-&gt;cache = malloc(f-&gt;hdr.size);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 9 : if (!f-&gt;cache) {</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> : : /* Read the cached map */</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 9 : rc = blocklevel_read(bl, offset, f-&gt;cache, f-&gt;hdr.size);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash partition map\n&quot;, rc);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 68 : for (i = 0; i &lt; f-&gt;hdr.entries_size; i++) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 59 : struct ffs_entry *ent = calloc(1, sizeof(struct ffs_entry));</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineCov"> 59 : if (!ent) {</span></a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : }</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 59 : f-&gt;hdr.entries[f-&gt;hdr.count++] = ent;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 59 : ent-&gt;ref = 1;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 59 : rc = ffs_entry_to_cpu(&amp;f-&gt;hdr, ent, &amp;f-&gt;cache-&gt;entries[i]);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineCov"> 59 : if (rc) {</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Failed checksum for partition %s\n&quot;,</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : f-&gt;cache-&gt;entries[i].name);</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : }</a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 59 : if (mark_ecc &amp;&amp; has_ecc(ent)) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_ecc_protect(bl, ent-&gt;base, ent-&gt;size);</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;Failed to blocklevel_ecc_protect(0x%08x, 0x%08x)\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : ent-&gt;base, ent-&gt;size);</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : }</a>
+<a name="420"><span class="lineNum"> 420 </span> : : }</a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 9 : out:</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 9 : if (rc == 0)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 9 : *ffs = f;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : else</a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : ffs_close(f);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : return rc;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : }</a>
+<a name="431"><span class="lineNum"> 431 </span> : : </a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 9 : static void __hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> : : {</a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 9 : int i;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineCov"> 9 : if (!hdr)</span></a>
+<a name="437"><span class="lineNum"> 437 </span> : : return;</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 68 : for (i = 0; i &lt; hdr-&gt;count; i++)</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 59 : ffs_entry_put(hdr-&gt;entries[i]);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 9 : free(hdr-&gt;entries);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : }</a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : void ffs_hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : __hdr_free(hdr);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : free(hdr);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineCov"> 9 : void ffs_close(struct ffs_handle *ffs)</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : {</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 9 : __hdr_free(&amp;ffs-&gt;hdr);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> : : </a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 9 : if (ffs-&gt;cache)</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 9 : free(ffs-&gt;cache);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : </a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 9 : free(ffs);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 9 : }</span></a>
+<a name="459"><span class="lineNum"> 459 </span> : : </a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 2 : int ffs_lookup_part(struct ffs_handle *ffs, const char *name,</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : uint32_t *part_idx)</a>
+<a name="462"><span class="lineNum"> 462 </span> : : {</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 2 : struct ffs_entry **ents = ffs-&gt;hdr.entries;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 2 : int i;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 2 : for (i = 0;</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 4 : i &lt; ffs-&gt;hdr.count &amp;&amp;</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 4 : strncmp(name, ents[i]-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 2 : i++);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 2 : if (i == ffs-&gt;hdr.count)</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 2 : if (part_idx)</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineCov"> 2 : *part_idx = i;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> : : return 0;</a>
+<a name="477"><span class="lineNum"> 477 </span> : : }</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineCov"> 22 : int ffs_part_info(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : char **name, uint32_t *start,</a>
+<a name="481"><span class="lineNum"> 481 </span> : : uint32_t *total_size, uint32_t *act_size, bool *ecc)</a>
+<a name="482"><span class="lineNum"> 482 </span> : : {</a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 22 : struct ffs_entry *ent;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 22 : char *n;</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineCov"> 22 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 21 : if (!ent)</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 21 : if (start)</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 21 : *start = ent-&gt;base;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 21 : if (total_size)</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 21 : *total_size = ent-&gt;size;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 21 : if (act_size)</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineCov"> 21 : *act_size = ent-&gt;actual;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 21 : if (ecc)</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 8 : *ecc = has_ecc(ent);</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 21 : if (name) {</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineCov"> 13 : n = calloc(1, FFS_PART_NAME_MAX + 1);</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 13 : if (!n)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 13 : memcpy(n, ent-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 13 : *name = n;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : return 0;</a>
+<a name="507"><span class="lineNum"> 507 </span> : : }</a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> : : /*</a>
+<a name="510"><span class="lineNum"> 510 </span> : : * There are quite a few ways one might consider two ffs_handles to be the</a>
+<a name="511"><span class="lineNum"> 511 </span> : : * same. For the purposes of this function we are trying to detect a fairly</a>
+<a name="512"><span class="lineNum"> 512 </span> : : * specific scenario:</a>
+<a name="513"><span class="lineNum"> 513 </span> : : * Consecutive calls to ffs_next_side() may succeed but have gone circular.</a>
+<a name="514"><span class="lineNum"> 514 </span> : : * It is possible that the OTHER_SIDE partition in one TOC actually points</a>
+<a name="515"><span class="lineNum"> 515 </span> : : * back to the TOC to first ffs_handle.</a>
+<a name="516"><span class="lineNum"> 516 </span> : : * This function compares for this case, therefore the requirements are</a>
+<a name="517"><span class="lineNum"> 517 </span> : : * simple, the underlying blocklevel_devices must be the same along with</a>
+<a name="518"><span class="lineNum"> 518 </span> : : * the toc_offset and the max_size.</a>
+<a name="519"><span class="lineNum"> 519 </span> : : */</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : bool ffs_equal(struct ffs_handle *one, struct ffs_handle *two)</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : {</a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : return (!one &amp;&amp; !two) || (one &amp;&amp; two &amp;&amp; one-&gt;bl == two-&gt;bl</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : &amp;&amp; one-&gt;toc_offset == two-&gt;toc_offset</a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : &amp;&amp; one-&gt;max_size == two-&gt;max_size);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : int ffs_next_side(struct ffs_handle *ffs, struct ffs_handle **new_ffs,</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : bool mark_ecc)</a>
+<a name="529"><span class="lineNum"> 529 </span> : : {</a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : uint32_t index, offset, max_size;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : </a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : if (!ffs || !new_ffs)</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : </a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : *new_ffs = NULL;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : rc = ffs_lookup_part(ffs, &quot;OTHER_SIDE&quot;, &amp;index);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : return rc;</a>
+<a name="541"><span class="lineNum"> 541 </span> : : </a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : rc = ffs_part_info(ffs, index, NULL, &amp;offset, &amp;max_size, NULL, NULL);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : return rc;</a>
+<a name="545"><span class="lineNum"> 545 </span> : : </a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : return ffs_init(offset, max_size, ffs-&gt;bl, new_ffs, mark_ecc);</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : }</a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : {</a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : const char *smallest_name;</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : uint32_t smallest_base, toc_base;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFFS: Adding '%s' at 0x%08x..0x%08x\n&quot;,</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : entry-&gt;name, entry-&gt;base, entry-&gt;base + entry-&gt;size);</a>
+<a name="557"><span class="lineNum"> 557 </span> : : </a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == 0) {</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFFS: Adding an entry to an empty header\n&quot;);</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : }</a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base + entry-&gt;size &gt; hdr-&gt;block_size * hdr-&gt;block_count)</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="564"><span class="lineNum"> 564 </span> : : </a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : smallest_base = entry-&gt;base;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : smallest_name = entry-&gt;name;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : toc_base = 0;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : /*</a>
+<a name="569"><span class="lineNum"> 569 </span> : : * TODO: This may have assumed entries was sorted</a>
+<a name="570"><span class="lineNum"> 570 </span> : : */</a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent = hdr-&gt;entries[i];</span></a>
+<a name="573"><span class="lineNum"> 573 </span> : : </a>
+<a name="574"><span class="lineNum"> 574 </span> : : /* Don't allow same names to differ only by case */</a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineNoCov"> 0 : if (strncasecmp(entry-&gt;name, ent-&gt;name, FFS_PART_NAME_MAX) == 0)</span></a>
+<a name="576"><span class="lineNum"> 576 </span> : : return FFS_ERR_BAD_PART_NAME;</a>
+<a name="577"><span class="lineNum"> 577 </span> : : </a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base &gt;= ent-&gt;base &amp;&amp; entry-&gt;base &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="579"><span class="lineNum"> 579 </span> : : return FFS_ERR_BAD_PART_BASE;</a>
+<a name="580"><span class="lineNum"> 580 </span> : : </a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base + entry-&gt;size &gt; ent-&gt;base &amp;&amp;</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : entry-&gt;base + entry-&gt;size &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="583"><span class="lineNum"> 583 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;actual &gt; entry-&gt;size)</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="587"><span class="lineNum"> 587 </span> : : </a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;pid != FFS_PID_TOPLEVEL)</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : return FFS_ERR_BAD_PART_PID;</a>
+<a name="590"><span class="lineNum"> 590 </span> : : </a>
+<a name="591"><span class="lineNum"> 591 </span> : : /* First partition is the partition table */</a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineNoCov"> 0 : if (i == 0) {</span></a>
+<a name="593"><span class="lineNum"> 593 </span> : : toc_base = ent-&gt;base;</a>
+<a name="594"><span class="lineNum"> 594 </span> : : } else {</a>
+<a name="595"><span class="lineNum"> 595 </span> : : /*</a>
+<a name="596"><span class="lineNum"> 596 </span> : : * We're looking for the partition directly</a>
+<a name="597"><span class="lineNum"> 597 </span> : : * after the toc to make sure we don't</a>
+<a name="598"><span class="lineNum"> 598 </span> : : * overflow onto it.</a>
+<a name="599"><span class="lineNum"> 599 </span> : : */</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : if (ent-&gt;base &lt; smallest_base &amp;&amp; ent-&gt;base &gt; toc_base) {</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : smallest_base = ent-&gt;base;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : smallest_name = ent-&gt;name;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : }</a>
+<a name="604"><span class="lineNum"> 604 </span> : : }</a>
+<a name="605"><span class="lineNum"> 605 </span> : : }</a>
+<a name="606"><span class="lineNum"> 606 </span> : : /* If the smallest base is before the TOC, don't worry */</a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : if (smallest_base &gt; toc_base &amp;&amp; (hdr-&gt;count + 1) * sizeof(struct __ffs_entry) +</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineNoCov"> 0 : sizeof(struct __ffs_hdr) + toc_base &gt; smallest_base) {</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Adding partition '%s' would cause partition '%s' at &quot;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : &quot;0x%08x to overlap with the header\n&quot;, entry-&gt;name, smallest_name,</a>
+<a name="611"><span class="lineNum"> 611 </span> : : smallest_base);</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_BAD_PART_BASE;</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : }</a>
+<a name="614"><span class="lineNum"> 614 </span> : : </a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == hdr-&gt;entries_size) {</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : struct ffs_entry **old = hdr-&gt;entries;</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = realloc(hdr-&gt;entries,</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : (HDR_ENTRIES_NUM + hdr-&gt;entries_size) * sizeof(struct ffs_entry *));</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : if (!hdr-&gt;entries) {</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = old;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="623"><span class="lineNum"> 623 </span> : : }</a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries_size += HDR_ENTRIES_NUM;</span></a>
+<a name="625"><span class="lineNum"> 625 </span> : : }</a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : entry-&gt;ref++;</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : int ffs_hdr_finalise(struct blocklevel_device *bl, struct ffs_hdr *hdr)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : {</a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : int num_entries, i, rc = 0;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : struct __ffs_hdr *real_hdr;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : num_entries = ffs_num_entries(hdr);</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /* A TOC shouldn't have zero partitions */</a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : if (num_entries == 0)</span></a>
+<a name="641"><span class="lineNum"> 641 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="642"><span class="lineNum"> 642 </span> : : </a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : real_hdr = malloc(ffs_hdr_raw_size(num_entries));</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : if (!real_hdr)</span></a>
+<a name="645"><span class="lineNum"> 645 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="646"><span class="lineNum"> 646 </span> : : </a>
+<a name="647"><span class="lineNum"> 647 </span> : : /*</a>
+<a name="648"><span class="lineNum"> 648 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="649"><span class="lineNum"> 649 </span> : : * real_hdr-&gt;checksum must be zero before calling ffs_hdr_checksum()</a>
+<a name="650"><span class="lineNum"> 650 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="651"><span class="lineNum"> 651 </span> : : * appears the reserved fields are always zero.</a>
+<a name="652"><span class="lineNum"> 652 </span> : : */</a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : memset(real_hdr, 0, sizeof(*real_hdr));</span></a>
+<a name="654"><span class="lineNum"> 654 </span> : : </a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : hdr-&gt;part-&gt;size = ffs_hdr_raw_size(num_entries) + hdr-&gt;block_size;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : /*</a>
+<a name="657"><span class="lineNum"> 657 </span> : : * So actual is in bytes. ffs_entry_to_flash() don't do the</a>
+<a name="658"><span class="lineNum"> 658 </span> : : * block_size division that we're relying on</a>
+<a name="659"><span class="lineNum"> 659 </span> : : */</a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineNoCov"> 0 : hdr-&gt;part-&gt;actual = (hdr-&gt;part-&gt;size / hdr-&gt;block_size) * hdr-&gt;block_size;</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;magic = cpu_to_be32(FFS_MAGIC);</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;version = cpu_to_be32(hdr-&gt;version);</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;size = cpu_to_be32(hdr-&gt;part-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;entry_size = cpu_to_be32(sizeof(struct __ffs_entry));</span></a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;entry_count = cpu_to_be32(num_entries);</span></a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;block_size = cpu_to_be32(hdr-&gt;block_size);</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;block_count = cpu_to_be32(hdr-&gt;block_count);</span></a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;checksum = ffs_hdr_checksum(real_hdr);</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : </a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_to_flash(hdr, real_hdr-&gt;entries + i, hdr-&gt;entries[i]);</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't format all entries for new TOC\n&quot;);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : }</a>
+<a name="676"><span class="lineNum"> 676 </span> : : }</a>
+<a name="677"><span class="lineNum"> 677 </span> : : </a>
+<a name="678"><span class="lineNum"> 678 </span> : : /* Don't really care if this fails */</a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : blocklevel_erase(bl, hdr-&gt;part-&gt;base, hdr-&gt;size);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_write(bl, hdr-&gt;part-&gt;base, real_hdr,</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : ffs_hdr_raw_size(num_entries));</a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="684"><span class="lineNum"> 684 </span> : : </a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : free(real_hdr);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> : : }</a>
+<a name="689"><span class="lineNum"> 689 </span> : : </a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : int ffs_entry_user_set(struct ffs_entry *ent, struct ffs_entry_user *user)</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : {</a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineNoCov"> 0 : if (!ent || !user)</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : return -1;</a>
+<a name="694"><span class="lineNum"> 694 </span> : : </a>
+<a name="695"><span class="lineNum"> 695 </span> : : /*</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * Don't allow the user to specify anything we dont't know about.</a>
+<a name="697"><span class="lineNum"> 697 </span> : : * Rationale: This is the library providing access to the FFS structures.</a>
+<a name="698"><span class="lineNum"> 698 </span> : : * If the consumer of the library knows more about FFS structures then</a>
+<a name="699"><span class="lineNum"> 699 </span> : : * questions need to be asked.</a>
+<a name="700"><span class="lineNum"> 700 </span> : : * The other possibility is that they've unknowningly supplied invalid</a>
+<a name="701"><span class="lineNum"> 701 </span> : : * flags, we should tell them.</a>
+<a name="702"><span class="lineNum"> 702 </span> : : */</a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : if (user-&gt;chip)</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : return -1;</a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : if (user-&gt;compresstype)</span></a>
+<a name="706"><span class="lineNum"> 706 </span> : : return -1;</a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineNoCov"> 0 : if (user-&gt;datainteg &amp; ~(FFS_ENRY_INTEG_ECC))</span></a>
+<a name="708"><span class="lineNum"> 708 </span> : : return -1;</a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineNoCov"> 0 : if (user-&gt;vercheck &amp; ~(FFS_VERCHECK_SHA512V | FFS_VERCHECK_SHA512EC))</span></a>
+<a name="710"><span class="lineNum"> 710 </span> : : return -1;</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; ~(FFS_MISCFLAGS_PRESERVED | FFS_MISCFLAGS_BACKUP |</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : FFS_MISCFLAGS_READONLY | FFS_MISCFLAGS_REPROVISION |</a>
+<a name="713"><span class="lineNum"> 713 </span> : : FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_GOLDEN |</a>
+<a name="714"><span class="lineNum"> 714 </span> : : FFS_MISCFLAGS_CLEARECC))</a>
+<a name="715"><span class="lineNum"> 715 </span> : : return -1;</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;ent-&gt;user, user, sizeof(*user));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> : : }</a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 10 : struct ffs_entry_user ffs_entry_user_get(struct ffs_entry *ent)</span></a>
+<a name="722"><span class="lineNum"> 722 </span> : : {</a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 10 : struct ffs_entry_user user = { 0 };</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : </a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineCov"> 10 : if (ent)</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineCov"> 10 : memcpy(&amp;user, &amp;ent-&gt;user, sizeof(user));</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : </a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineCov"> 10 : return user;</span></a>
+<a name="729"><span class="lineNum"> 729 </span> : : }</a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineNoCov"> 0 : int ffs_entry_new(const char *name, uint32_t base, uint32_t size, struct ffs_entry **r)</span></a>
+<a name="732"><span class="lineNum"> 732 </span> : : {</a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ret;</span></a>
+<a name="734"><span class="lineNum"> 734 </span> : : </a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="738"><span class="lineNum"> 738 </span> : : </a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineNoCov"> 0 : strncpy(ret-&gt;name, name, FFS_PART_NAME_MAX);</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineNoCov"> 0 : ret-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineNoCov"> 0 : ret-&gt;base = base;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : ret-&gt;size = size;</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : ret-&gt;actual = size;</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineNoCov"> 0 : ret-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineNoCov"> 0 : ret-&gt;type = FFS_TYPE_DATA;</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : ret-&gt;ref = 1;</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineNoCov"> 0 : *r = ret;</span></a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="750"><span class="lineNum"> 750 </span> : : }</a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineNoCov"> 0 : int ffs_entry_set_act_size(struct ffs_entry *ent, uint32_t actual_size)</span></a>
+<a name="753"><span class="lineNum"> 753 </span> : : {</a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineNoCov"> 0 : if (!ent)</span></a>
+<a name="755"><span class="lineNum"> 755 </span> : : return -1;</a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineNoCov"> 0 : if (actual_size &gt; ent-&gt;size)</span></a>
+<a name="758"><span class="lineNum"> 758 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="759"><span class="lineNum"> 759 </span> : : </a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineNoCov"> 0 : ent-&gt;actual = actual_size;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : </a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : </a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineNoCov"> 0 : int ffs_hdr_new(uint32_t block_size, uint32_t block_count,</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : struct ffs_entry **e, struct ffs_hdr **r)</a>
+<a name="767"><span class="lineNum"> 767 </span> : : {</a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : struct ffs_hdr *ret;</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *part_table;</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : </a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="775"><span class="lineNum"> 775 </span> : : </a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineNoCov"> 0 : ret-&gt;version = FFS_VERSION_1;</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineNoCov"> 0 : ret-&gt;block_size = block_size;</span></a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineNoCov"> 0 : ret-&gt;block_count = block_count;</span></a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries = calloc(HDR_ENTRIES_NUM, sizeof(struct ffs_entry *));</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries_size = HDR_ENTRIES_NUM;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineNoCov"> 0 : if (!e || !(*e)) {</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : /* Don't know how big it will be, ffs_hdr_finalise() will fix */</a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_new(&quot;part&quot;, 0, 0, &amp;part_table);</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : free(ret);</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="788"><span class="lineNum"> 788 </span> : : }</a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineNoCov"> 0 : if (e)</span></a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineNoCov"> 0 : *e = part_table;</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : } else {</a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : part_table = *e;</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : }</a>
+<a name="794"><span class="lineNum"> 794 </span> : : </a>
+<a name="795"><span class="lineNum"> 795 </span> : : /* If the user still holds a ref to e, then inc the refcount */</a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineNoCov"> 0 : if (e)</span></a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineNoCov"> 0 : part_table-&gt;ref++;</span></a>
+<a name="798"><span class="lineNum"> 798 </span> : : </a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : ret-&gt;part = part_table;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : part_table-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineNoCov"> 0 : part_table-&gt;type = FFS_TYPE_PARTITION;</span></a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineNoCov"> 0 : part_table-&gt;flags = FFS_FLAGS_PROTECTED;</span></a>
+<a name="804"><span class="lineNum"> 804 </span> : : </a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries[0] = part_table;</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : ret-&gt;count = 1;</span></a>
+<a name="807"><span class="lineNum"> 807 </span> : : </a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineNoCov"> 0 : *r = ret;</span></a>
+<a name="809"><span class="lineNum"> 809 </span> : : </a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="811"><span class="lineNum"> 811 </span> : : }</a>
+<a name="812"><span class="lineNum"> 812 </span> : : </a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineCov"> 2 : int ffs_update_act_size(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="814"><span class="lineNum"> 814 </span> : : uint32_t act_size)</a>
+<a name="815"><span class="lineNum"> 815 </span> : : {</a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineCov"> 2 : struct ffs_entry *ent;</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 2 : struct __ffs_entry raw_ent;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 2 : uint32_t offset;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineCov"> 2 : int rc;</span></a>
+<a name="820"><span class="lineNum"> 820 </span> : : </a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 2 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineCov"> 2 : if (!ent) {</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Entry not found\n&quot;);</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_PART_NOT_FOUND;</span></a>
+<a name="825"><span class="lineNum"> 825 </span> : : }</a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineCov"> 2 : offset = ffs-&gt;toc_offset + ffs_hdr_raw_size(part_idx);</span></a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineCov"> 2 : FL_DBG(&quot;FFS: part index %d at offset 0x%08x\n&quot;,</span></a>
+<a name="828"><span class="lineNum"> 828 </span> : : part_idx, offset);</a>
+<a name="829"><span class="lineNum"> 829 </span> : : </a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineCov"> 2 : if (ent-&gt;actual == act_size) {</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;FFS: ent-&gt;actual alrady matches: 0x%08x==0x%08x\n&quot;,</span></a>
+<a name="832"><span class="lineNum"> 832 </span> : : act_size, ent-&gt;actual);</a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> : : }</a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 1 : ent-&gt;actual = act_size;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineCov"> 1 : rc = ffs_entry_to_flash(&amp;ffs-&gt;hdr, &amp;raw_ent, ent);</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : return rc;</a>
+<a name="840"><span class="lineNum"> 840 </span> : : </a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 1 : return blocklevel_smart_write(ffs-&gt;bl, offset, &amp;raw_ent, sizeof(struct __ffs_entry));</span></a>
+<a name="842"><span class="lineNum"> 842 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/libflash.c.func-sort-c.html b/coverage-report/external/pflash/libflash/libflash.c.func-sort-c.html
new file mode 100644
index 0000000..19ab2b8
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/libflash.c.func-sort-c.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libflash.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/libflash.c.func.html b/coverage-report/external/pflash/libflash/libflash.c.func.html
new file mode 100644
index 0000000..5df2a10
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/libflash.c.func.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libflash.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/libflash/libflash.c.gcov.html b/coverage-report/external/pflash/libflash/libflash.c.gcov.html
new file mode 100644
index 0000000..7fa7d1e
--- /dev/null
+++ b/coverage-report/external/pflash/libflash/libflash.c.gcov.html
@@ -0,0 +1,949 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/libflash/libflash.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">external/pflash/libflash</a> - libflash.c<span style="font-size: 80%;"> (source / <a href="libflash.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;string.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;libflash-priv.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : static const struct flash_info flash_info[] = {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : { 0xc22018, 0x01000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL12835F&quot;},</a>
+<a name="16"><span class="lineNum"> 16 </span> : : { 0xc22019, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL25635F&quot;},</a>
+<a name="17"><span class="lineNum"> 17 </span> : : { 0xc2201a, 0x04000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL51235F&quot;},</a>
+<a name="18"><span class="lineNum"> 18 </span> : : { 0xc2201b, 0x08000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MX66L1G45G&quot;},</a>
+<a name="19"><span class="lineNum"> 19 </span> : : { 0xef4018, 0x01000000, FL_ERASE_ALL, &quot;Winbond W25Q128BV&quot; },</a>
+<a name="20"><span class="lineNum"> 20 </span> : : { 0xef4019, 0x02000000, FL_ERASE_ALL | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="21"><span class="lineNum"> 21 </span> : : FL_ERASE_BULK,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : &quot;Winbond W25Q256BV&quot;},</a>
+<a name="23"><span class="lineNum"> 23 </span> : : { 0x20ba20, 0x04000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="24"><span class="lineNum"> 24 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : &quot;Micron N25Qx512Ax&quot; },</a>
+<a name="26"><span class="lineNum"> 26 </span> : : { 0x20ba19, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="27"><span class="lineNum"> 27 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="28"><span class="lineNum"> 28 </span> : : &quot;Micron N25Q256Ax&quot; },</a>
+<a name="29"><span class="lineNum"> 29 </span> : : { 0x1940ef, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="30"><span class="lineNum"> 30 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="31"><span class="lineNum"> 31 </span> : : &quot;Micron N25Qx256Ax&quot; },</a>
+<a name="32"><span class="lineNum"> 32 </span> : : { 0x4d5444, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;File Abstraction&quot;},</a>
+<a name="33"><span class="lineNum"> 33 </span> : : { 0x55aa55, 0x00100000, FL_ERASE_ALL | FL_CAN_4B, &quot;TEST_FLASH&quot; },</a>
+<a name="34"><span class="lineNum"> 34 </span> : : { 0xaa55aa, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;EMULATED_FLASH&quot;},</a>
+<a name="35"><span class="lineNum"> 35 </span> : : };</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct flash_chip {</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct spi_flash_ctrl *ctrl; /* Controller */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct flash_info info; /* Flash info */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t tsize; /* Corrected flash size */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint32_t min_erase_mask; /* Minimum erase size */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : bool mode_4b; /* Flash currently in 4b mode */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct flash_req *cur_req; /* Current request */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : void *smart_buf; /* Buffer for smart writes */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct blocklevel_device bl;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : };</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : #ifndef __SKIBOOT__</a>
+<a name="49"><span class="lineNum"> 49 </span> : : bool libflash_debug;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #endif</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : int fl_read_stat(struct spi_flash_ctrl *ct, uint8_t *stat)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_rd(ct, CMD_RDSR, false, 0, stat, 1);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : static void fl_micron_status(struct spi_flash_ctrl *ct)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : uint8_t flst;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /*</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * After a success status on a write or erase, we</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * need to do that command or some chip variants will</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * lock</a>
+<a name="65"><span class="lineNum"> 65 </span> : : */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : ct-&gt;cmd_rd(ct, CMD_MIC_RDFLST, false, 0, &amp;flst, 1);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /* Synchronous write completion, probably need a yield hook */</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : int fl_sync_wait_idle(struct spi_flash_ctrl *ct)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /* XXX Add timeout */</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : for (;;) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : if (!(stat &amp; STAT_WIP)) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;finfo-&gt;flags &amp; FL_MICRON_BUGS)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : fl_micron_status(ct);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : /* return FLASH_ERR_WIP_TIMEOUT; */</a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* Exported for internal use */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : int fl_wren(struct spi_flash_ctrl *ct)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : int i, rc;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* Some flashes need it to be hammered */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 1000; i++) {</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_WREN, false, 0, NULL, 0);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: WREN has WIP status set !\n&quot;);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : }</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WEN)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : return 0;</a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : return FLASH_ERR_WREN_TIMEOUT;</a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : static int flash_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* XXX Add sanity/bound checking */</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /*</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * If the controller supports read and either we are in 3b mode</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * high level read.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;read)</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : return ct-&gt;read(ct, pos, buf, len);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_rd)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_rd(ct, CMD_READ, true, pos, buf, len);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : #define COPY_BUFFER_LENGTH 4096</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /*</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * This provides a wrapper around flash_read on ECCed data</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * len is length of data without ECC attached</a>
+<a name="139"><span class="lineNum"> 139 </span> : : */</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : int flash_read_corrected(struct blocklevel_device *bl, uint32_t pos, void *buf,</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : uint32_t len, bool ecc)</a>
+<a name="142"><span class="lineNum"> 142 </span> : : {</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : uint32_t copylen;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return flash_read(bl, pos, buf, len);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /* Copy the buffer in chunks */</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* What's left to copy? */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : /* Read ECCed data from flash */</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, pos, bufecc, ecc_buffer_size(copylen));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* Extract data from ECCed data */</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : ret = memcpy_from_ecc(buf, bufecc, copylen);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> : : /* Update for next copy */</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : len -= copylen;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : pos += ecc_buffer_size(copylen);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> : : rc = 0;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : static void fl_get_best_erase(struct flash_chip *c, uint32_t dst, uint32_t size,</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : uint32_t *chunk, uint8_t *cmd)</a>
+<a name="187"><span class="lineNum"> 187 </span> : : {</a>
+<a name="188"><span class="lineNum"> 188 </span> : : /* Smaller than 32k, use 4k */</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : if ((dst &amp; 0x7fff) || (size &lt; 0x8000)) {</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : *chunk = 0x1000;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_SE;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : /* Smaller than 64k and 32k is supported, use it */</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : if ((c-&gt;info.flags &amp; FL_ERASE_32K) &amp;&amp;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : ((dst &amp; 0xffff) || (size &lt; 0x10000))) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : }</a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* If 64K is not supported, use whatever smaller size is */</a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : if (!(c-&gt;info.flags &amp; FL_ERASE_64K)) {</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_32K) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : } else {</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : *chunk = 0x1000;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_SE;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* Allright, let's go for 64K */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : *chunk = 0x10000;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : static int flash_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t size)</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : {</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : uint8_t cmd;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> : : /* Some sanity checking */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /* Check boundaries fit erase blocks */</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : if ((dst | size) &amp; c-&gt;min_erase_mask)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : return FLASH_ERR_ERASE_BOUNDARY;</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Erasing 0x%&quot; PRIx64&quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : dst, dst + size);</a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> : : /* Use controller erase if supported */</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;erase)</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, dst, size);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /* Allright, loop as long as there's something to erase */</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : while(size) {</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* How big can we make it based on alignent &amp; size */</a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : fl_get_best_erase(c, dst, size, &amp;chunk, &amp;cmd);</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /* Poke write enable */</a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> : : /* Send erase command */</a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, cmd, true, dst, NULL, 0);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /* Wait for write complete */</a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> : : return 0;</a>
+<a name="264"><span class="lineNum"> 264 </span> : : }</a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : int flash_erase_chip(struct flash_chip *c)</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : {</a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : /* XXX TODO: Fallback to using normal erases */</a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : if (!(c-&gt;info.flags &amp; (FL_ERASE_CHIP|FL_ERASE_BULK)))</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : return FLASH_ERR_CHIP_ER_NOT_SUPPORTED;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Erasing chip...\n&quot;);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* Use controller erase if supported */</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;erase)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, 0, 0xffffffff);</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_CHIP)</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_CE, false, 0, NULL, 0);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : else</a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_MIC_BULK_ERASE, false, 0, NULL, 0);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : return rc;</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> : : /* Wait for write complete */</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return fl_sync_wait_idle(ct);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : static int fl_wpage(struct flash_chip *c, uint32_t dst, const void *src,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : uint32_t size)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : </a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : if (size &lt; 1 || size &gt; 0x100)</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : return FLASH_ERR_BAD_PAGE_SIZE;</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_PP, true, dst, src, size);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : return rc;</a>
+<a name="310"><span class="lineNum"> 310 </span> : : </a>
+<a name="311"><span class="lineNum"> 311 </span> : : /* Wait for write complete */</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : return fl_sync_wait_idle(ct);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : }</a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : static int flash_write(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : uint32_t size, bool verify)</a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : uint32_t todo = size;</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : uint32_t d = dst;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : const void *s = src;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : uint8_t vbuf[0x100];</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : int rc; </span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> : : /* Some sanity checking */</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Writing to 0x%08x..0%08x...\n&quot;, dst, dst + size);</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> : : /*</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * If the controller supports write and either we are in 3b mode</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * high level write.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;write) {</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;write(ct, dst, src, size);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : return rc;</a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : goto writing_done;</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : }</a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /* Iterate for each page to write */</a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineNoCov"> 0 : while(todo) {</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : /* Handle misaligned start */</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : chunk = 0x100 - (d &amp; 0xff);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : if (chunk &gt; todo)</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : chunk = todo;</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : rc = fl_wpage(c, d, s, chunk);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : d += chunk;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : s += chunk;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : todo -= chunk;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : }</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : writing_done:</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : if (!verify)</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : return 0;</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> : : /* Verify */</a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Verifying...\n&quot;);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> : : </a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineNoCov"> 0 : while(size) {</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : chunk = sizeof(vbuf);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : if (chunk &gt; size)</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : chunk = size;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, dst, vbuf, chunk);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : if (memcmp(vbuf, src, chunk)) {</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Miscompare at 0x%08x\n&quot;, dst);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_VERIFY_FAILURE;</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : }</a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : src += chunk;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="386"><span class="lineNum"> 386 </span> : : }</a>
+<a name="387"><span class="lineNum"> 387 </span> : : return 0;</a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : int flash_write_corrected(struct blocklevel_device *bl, uint32_t pos, const void *buf,</span></a>
+<a name="391"><span class="lineNum"> 391 </span> : : uint32_t len, bool verify, bool ecc)</a>
+<a name="392"><span class="lineNum"> 392 </span> : : {</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : uint32_t copylen, copylen_minus_ecc;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return flash_write(bl, pos, buf, len, verify);</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> : : /* Copy the buffer in chunks */</a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="404"><span class="lineNum"> 404 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* What's left to copy? */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineNoCov"> 0 : copylen_minus_ecc = ecc_buffer_size_minus_ecc(copylen);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : /* Add the ecc byte to the data */</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : ret = memcpy_to_ecc(bufecc, buf, copylen_minus_ecc);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : }</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> : : /* Write ECCed data to the flash */</a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, pos, bufecc, copylen, verify);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> : : /* Update for next copy */</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : len -= copylen_minus_ecc;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen_minus_ecc;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : pos += copylen;</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : }</a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : rc = 0;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : }</a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> : : enum sm_comp_res {</a>
+<a name="437"><span class="lineNum"> 437 </span> : : sm_no_change,</a>
+<a name="438"><span class="lineNum"> 438 </span> : : sm_need_write,</a>
+<a name="439"><span class="lineNum"> 439 </span> : : sm_need_erase,</a>
+<a name="440"><span class="lineNum"> 440 </span> : : };</a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : static enum sm_comp_res flash_smart_comp(struct flash_chip *c,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : const void *src,</a>
+<a name="444"><span class="lineNum"> 444 </span> : : uint32_t offset, uint32_t size)</a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : uint8_t *b = c-&gt;smart_buf + offset;</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : const uint8_t *s = src;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : bool is_same = true;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : uint32_t i;</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* SRC DEST NEED_ERASE</a>
+<a name="452"><span class="lineNum"> 452 </span> : : * 0 1 0</a>
+<a name="453"><span class="lineNum"> 453 </span> : : * 1 1 0</a>
+<a name="454"><span class="lineNum"> 454 </span> : : * 0 0 0</a>
+<a name="455"><span class="lineNum"> 455 </span> : : * 1 0 1</a>
+<a name="456"><span class="lineNum"> 456 </span> : : */</a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; size; i++) {</span></a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* Any bit need to be set, need erase */</a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : if (s[i] &amp; ~b[i])</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : return sm_need_erase;</a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : if (is_same &amp;&amp; (b[i] != s[i]))</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : is_same = false;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : }</a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : return is_same ? sm_no_change : sm_need_write;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : }</a>
+<a name="466"><span class="lineNum"> 466 </span> : : </a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : static int flash_smart_write(struct blocklevel_device *bl, uint64_t dst, const void *src, uint64_t size)</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : {</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : uint32_t er_size = c-&gt;min_erase_mask + 1;</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : uint32_t end = dst + size;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> : : /* Some sanity checking */</a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : if (end &lt;= dst || !size || end &gt; c-&gt;tsize) {</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Smart write param error\n&quot;);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="478"><span class="lineNum"> 478 </span> : : }</a>
+<a name="479"><span class="lineNum"> 479 </span> : : </a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Smart writing to 0x%&quot; PRIx64 &quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="481"><span class="lineNum"> 481 </span> : : dst, dst + size);</a>
+<a name="482"><span class="lineNum"> 482 </span> : : </a>
+<a name="483"><span class="lineNum"> 483 </span> : : /* As long as we have something to write ... */</a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : while(dst &lt; end) {</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : uint32_t page, off, chunk;</span></a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : enum sm_comp_res sr;</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> : : /* Figure out which erase page we are in and read it */</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : page = dst &amp; ~c-&gt;min_erase_mask;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : off = dst &amp; c-&gt;min_erase_mask;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: reading page 0x%08x..0x%08x...\n&quot;,</span></a>
+<a name="492"><span class="lineNum"> 492 </span> : : page, page + er_size);</a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, page, c-&gt;smart_buf, er_size);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...error %d!\n&quot;, rc);</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> : : }</a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> : : /* Locate the chunk of data we are working on */</a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : chunk = er_size - off;</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : if (size &lt; chunk)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : chunk = size;</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> : : /* Compare against what we are writing and ff */</a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : sr = flash_smart_comp(c, src, off, chunk);</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : switch(sr) {</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : case sm_no_change:</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : /* Identical, skip it */</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...same !\n&quot;);</span></a>
+<a name="510"><span class="lineNum"> 510 </span> : : break;</a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : case sm_need_write:</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : /* Just needs writing over */</a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...need write !\n&quot;);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, dst, src, chunk, true);</span></a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Write error %d !\n&quot;, rc);</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : }</a>
+<a name="519"><span class="lineNum"> 519 </span> : : break;</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : case sm_need_erase:</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...need erase !\n&quot;);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : rc = flash_erase(bl, page, er_size);</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: erase error %d !\n&quot;, rc);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="526"><span class="lineNum"> 526 </span> : : }</a>
+<a name="527"><span class="lineNum"> 527 </span> : : /* Then update the portion of the buffer and write the block */</a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : memcpy(c-&gt;smart_buf + off, src, chunk);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, page, c-&gt;smart_buf, er_size, true);</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: write error %d !\n&quot;, rc);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="533"><span class="lineNum"> 533 </span> : : }</a>
+<a name="534"><span class="lineNum"> 534 </span> : : break;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : }</a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : dst += chunk;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineNoCov"> 0 : src += chunk;</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : size -= chunk;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : }</a>
+<a name="540"><span class="lineNum"> 540 </span> : : return 0;</a>
+<a name="541"><span class="lineNum"> 541 </span> : : }</a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : int flash_smart_write_corrected(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : uint32_t size, bool ecc)</a>
+<a name="545"><span class="lineNum"> 545 </span> : : {</a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : struct ecc64 *buf;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : return flash_smart_write(bl, dst, src, size);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : buf = malloc(ecc_buffer_size(size));</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : if (!buf)</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="555"><span class="lineNum"> 555 </span> : : </a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc(buf, src, size);</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : }</a>
+<a name="561"><span class="lineNum"> 561 </span> : : </a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : rc = flash_smart_write(bl, dst, buf, ecc_buffer_size(size));</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : </a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : free(buf);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : </a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineNoCov"> 0 : static int fl_chip_id(struct spi_flash_ctrl *ct, uint8_t *id_buf,</span></a>
+<a name="570"><span class="lineNum"> 570 </span> : : uint32_t *id_size)</a>
+<a name="571"><span class="lineNum"> 571 </span> : : {</a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : </a>
+<a name="575"><span class="lineNum"> 575 </span> : : /* Check initial status */</a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineNoCov"> 0 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="578"><span class="lineNum"> 578 </span> : : return rc;</a>
+<a name="579"><span class="lineNum"> 579 </span> : : </a>
+<a name="580"><span class="lineNum"> 580 </span> : : /* If stuck writing, wait for idle */</a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash in writing state ! Waiting...\n&quot;);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="585"><span class="lineNum"> 585 </span> : : return rc;</a>
+<a name="586"><span class="lineNum"> 586 </span> : : } else</a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Init status: %02x\n&quot;, stat);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : </a>
+<a name="589"><span class="lineNum"> 589 </span> : : /* Fallback to get ID manually */</a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_rd(ct, CMD_RDID, false, 0, id_buf, 3);</span></a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="592"><span class="lineNum"> 592 </span> : : return rc;</a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : *id_size = 3;</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : </a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : }</a>
+<a name="597"><span class="lineNum"> 597 </span> : : </a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : static int flash_identify(struct flash_chip *c)</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : {</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : const struct flash_info *info = NULL;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : uint32_t iid, id_size;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : #define MAX_ID_SIZE 16</a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineNoCov"> 0 : uint8_t id[MAX_ID_SIZE];</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : int rc, i;</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;chip_id) {</span></a>
+<a name="608"><span class="lineNum"> 608 </span> : : /* High level controller interface */</a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : id_size = MAX_ID_SIZE;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;chip_id(ct, id, &amp;id_size);</span></a>
+<a name="611"><span class="lineNum"> 611 </span> : : } else</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : rc = fl_chip_id(ct, id, &amp;id_size);</span></a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="614"><span class="lineNum"> 614 </span> : : return rc;</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : if (id_size &lt; 3)</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : return FLASH_ERR_CHIP_UNKNOWN;</a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> : : /* Convert to a dword for lookup */</a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : iid = id[0];</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : iid = (iid &lt;&lt; 8) | id[1];</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : iid = (iid &lt;&lt; 8) | id[2];</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash ID: %02x.%02x.%02x (%06x)\n&quot;,</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : id[0], id[1], id[2], iid);</a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> : : /* Lookup in flash_info */</a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; ARRAY_SIZE(flash_info); i++) {</span></a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineNoCov"> 0 : info = &amp;flash_info[i];</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : if (info-&gt;id == iid)</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : break; </a>
+<a name="631"><span class="lineNum"> 631 </span> : : }</a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : if (!info || info-&gt;id != iid)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : return FLASH_ERR_CHIP_UNKNOWN;</a>
+<a name="634"><span class="lineNum"> 634 </span> : : </a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : c-&gt;info = *info;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineNoCov"> 0 : c-&gt;tsize = info-&gt;size;</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : ct-&gt;finfo = &amp;c-&gt;info;</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /*</a>
+<a name="640"><span class="lineNum"> 640 </span> : : * Let controller know about our settings and possibly</a>
+<a name="641"><span class="lineNum"> 641 </span> : : * override them</a>
+<a name="642"><span class="lineNum"> 642 </span> : : */</a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;setup) {</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;setup(ct, &amp;c-&gt;tsize);</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : return rc;</a>
+<a name="647"><span class="lineNum"> 647 </span> : : }</a>
+<a name="648"><span class="lineNum"> 648 </span> : : </a>
+<a name="649"><span class="lineNum"> 649 </span> : : /* Calculate min erase granularity */</a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_4K)</span></a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0xfff;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_32K)</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0x7fff;</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_64K)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0xffff;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : else {</a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* No erase size ? oops ... */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: No erase sizes !\n&quot;);</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CTRL_CONFIG_MISMATCH;</span></a>
+<a name="660"><span class="lineNum"> 660 </span> : : }</a>
+<a name="661"><span class="lineNum"> 661 </span> : : </a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Found chip %s size %dM erase granule: %dK\n&quot;,</span></a>
+<a name="663"><span class="lineNum"> 663 </span> : : c-&gt;info.name, c-&gt;tsize &gt;&gt; 20, (c-&gt;min_erase_mask + 1) &gt;&gt; 10);</a>
+<a name="664"><span class="lineNum"> 664 </span> : : </a>
+<a name="665"><span class="lineNum"> 665 </span> : : return 0;</a>
+<a name="666"><span class="lineNum"> 666 </span> : : }</a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : static int flash_set_4b(struct flash_chip *c, bool enable)</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : {</a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> : : </a>
+<a name="673"><span class="lineNum"> 673 </span> : : /* Don't have low level interface, assume all is well */</a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : return 0;</a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> : : /* Some flash chips want this */</a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Error %d enabling write for set_4b\n&quot;, rc);</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : /* Ignore the error &amp; move on (could be wrprotect chip) */</a>
+<a name="682"><span class="lineNum"> 682 </span> : : }</a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> : : /* Ignore error in case chip is write protected */</a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_wr(ct, enable ? CMD_EN4B : CMD_EX4B, false, 0, NULL, 0);</span></a>
+<a name="686"><span class="lineNum"> 686 </span> : : }</a>
+<a name="687"><span class="lineNum"> 687 </span> : : </a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : int flash_force_4b_mode(struct flash_chip *c, bool enable_4b)</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineNoCov"> 0 : int rc = FLASH_ERR_4B_NOT_SUPPORTED;</span></a>
+<a name="692"><span class="lineNum"> 692 </span> : : </a>
+<a name="693"><span class="lineNum"> 693 </span> : : /*</a>
+<a name="694"><span class="lineNum"> 694 </span> : : * We only allow force 4b if both controller and flash do 4b</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * as this is mainly used if a 3rd party tries to directly</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * access a direct mapped read region</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : if (enable_4b &amp;&amp; !((c-&gt;info.flags &amp; FL_CAN_4B) &amp;&amp; ct-&gt;set_4b))</span></a>
+<a name="699"><span class="lineNum"> 699 </span> : : return rc;</a>
+<a name="700"><span class="lineNum"> 700 </span> : : </a>
+<a name="701"><span class="lineNum"> 701 </span> : : /* Only send to flash directly on controllers that implement</a>
+<a name="702"><span class="lineNum"> 702 </span> : : * the low level callbacks</a>
+<a name="703"><span class="lineNum"> 703 </span> : : */</a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, enable_4b);</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : return rc;</a>
+<a name="708"><span class="lineNum"> 708 </span> : : }</a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> : : /* Then inform the controller */</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, enable_4b);</span></a>
+<a name="713"><span class="lineNum"> 713 </span> : : return rc;</a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> : : </a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : static int flash_configure(struct flash_chip *c)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> : : {</a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> : : /* Crop flash size if necessary */</a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineNoCov"> 0 : if (c-&gt;tsize &gt; 0x01000000 &amp;&amp; !(c-&gt;info.flags &amp; FL_CAN_4B)) {</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash chip cropped to 16M, no 4b mode\n&quot;);</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : c-&gt;tsize = 0x01000000;</span></a>
+<a name="725"><span class="lineNum"> 725 </span> : : }</a>
+<a name="726"><span class="lineNum"> 726 </span> : : </a>
+<a name="727"><span class="lineNum"> 727 </span> : : /* If flash chip &gt; 16M, enable 4b mode */</a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : if (c-&gt;tsize &gt; 0x01000000) {</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash &gt;16MB, enabling 4B mode...\n&quot;);</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> : : /* Set flash to 4b mode if we can */</a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, true);</span></a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set flash 4b mode\n&quot;);</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : }</a>
+<a name="738"><span class="lineNum"> 738 </span> : : }</a>
+<a name="739"><span class="lineNum"> 739 </span> : : </a>
+<a name="740"><span class="lineNum"> 740 </span> : : </a>
+<a name="741"><span class="lineNum"> 741 </span> : : /* Set controller to 4b mode if supported */</a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b) {</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Enabling controller 4B mode...\n&quot;);</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, true);</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set controller 4b mode\n&quot;);</span></a>
+<a name="747"><span class="lineNum"> 747 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="748"><span class="lineNum"> 748 </span> : : }</a>
+<a name="749"><span class="lineNum"> 749 </span> : : }</a>
+<a name="750"><span class="lineNum"> 750 </span> : : } else {</a>
+<a name="751"><span class="lineNum"> 751 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash &lt;=16MB, disabling 4B mode...\n&quot;);</span></a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> : : /*</a>
+<a name="754"><span class="lineNum"> 754 </span> : : * If flash chip supports 4b mode, make sure we disable</a>
+<a name="755"><span class="lineNum"> 755 </span> : : * it in case it was left over by the previous user</a>
+<a name="756"><span class="lineNum"> 756 </span> : : */</a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_CAN_4B) {</span></a>
+<a name="758"><span class="lineNum"> 758 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, false);</span></a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : &quot; clear flash 4b mode\n&quot;);</a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : }</a>
+<a name="765"><span class="lineNum"> 765 </span> : : /* Set controller to 3b mode if mode switch is supported */</a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b) {</span></a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Disabling controller 4B mode...\n&quot;);</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, false);</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : &quot; clear controller 4b mode\n&quot;);</a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="773"><span class="lineNum"> 773 </span> : : }</a>
+<a name="774"><span class="lineNum"> 774 </span> : : }</a>
+<a name="775"><span class="lineNum"> 775 </span> : : }</a>
+<a name="776"><span class="lineNum"> 776 </span> : : return 0;</a>
+<a name="777"><span class="lineNum"> 777 </span> : : }</a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : static int flash_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="780"><span class="lineNum"> 780 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="781"><span class="lineNum"> 781 </span> : : {</a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> :<span class="lineNoCov"> 0 : if (name)</span></a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineNoCov"> 0 : *name = c-&gt;info.name;</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : *total_size = c-&gt;tsize;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineNoCov"> 0 : *erase_granule = c-&gt;min_erase_mask + 1;</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : }</a>
+<a name="791"><span class="lineNum"> 791 </span> : : </a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : int flash_init(struct spi_flash_ctrl *ctrl, struct blocklevel_device **bl,</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : struct flash_chip **flash_chip)</a>
+<a name="794"><span class="lineNum"> 794 </span> : : {</a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c;</span></a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="797"><span class="lineNum"> 797 </span> : : </a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineNoCov"> 0 : if (!bl)</span></a>
+<a name="799"><span class="lineNum"> 799 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : *bl = NULL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> : : </a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineNoCov"> 0 : c = malloc(sizeof(struct flash_chip));</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineNoCov"> 0 : if (!c)</span></a>
+<a name="805"><span class="lineNum"> 805 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : memset(c, 0, sizeof(*c));</span></a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineNoCov"> 0 : c-&gt;ctrl = ctrl;</span></a>
+<a name="808"><span class="lineNum"> 808 </span> : : </a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineNoCov"> 0 : rc = flash_identify(c);</span></a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash identification failed\n&quot;);</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : }</a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineNoCov"> 0 : c-&gt;smart_buf = malloc(c-&gt;min_erase_mask + 1);</span></a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineNoCov"> 0 : if (!c-&gt;smart_buf) {</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to allocate smart buffer !\n&quot;);</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : }</a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineNoCov"> 0 : rc = flash_configure(c);</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash configuration failed\n&quot;);</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : bail:</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="825"><span class="lineNum"> 825 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="827"><span class="lineNum"> 827 </span> : : }</a>
+<a name="828"><span class="lineNum"> 828 </span> : : </a>
+<a name="829"><span class="lineNum"> 829 </span> : : /* The flash backend doesn't support reiniting it */</a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.keep_alive = true;</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.reacquire = NULL;</span></a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.release = NULL;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.read = &amp;flash_read;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.write = &amp;flash_smart_write;</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.erase = &amp;flash_erase;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.get_info = &amp;flash_get_info;</span></a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.erase_mask = c-&gt;min_erase_mask;</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineNoCov"> 0 : c-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : </a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineNoCov"> 0 : *bl = &amp;(c-&gt;bl);</span></a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineNoCov"> 0 : if (flash_chip)</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineNoCov"> 0 : *flash_chip = c;</span></a>
+<a name="843"><span class="lineNum"> 843 </span> : : </a>
+<a name="844"><span class="lineNum"> 844 </span> : : return 0;</a>
+<a name="845"><span class="lineNum"> 845 </span> : : }</a>
+<a name="846"><span class="lineNum"> 846 </span> : : </a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineNoCov"> 0 : void flash_exit(struct blocklevel_device *bl)</span></a>
+<a name="848"><span class="lineNum"> 848 </span> : : {</a>
+<a name="849"><span class="lineNum"> 849 </span> : : /* XXX Make sure we are idle etc... */</a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineNoCov"> 0 : if (bl) {</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineNoCov"> 0 : free(c-&gt;smart_buf);</span></a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="854"><span class="lineNum"> 854 </span> : : }</a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="856"><span class="lineNum"> 856 </span> : : </a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : void flash_exit_close(struct blocklevel_device *bl, void (*close)(struct spi_flash_ctrl *ctrl))</span></a>
+<a name="858"><span class="lineNum"> 858 </span> : : {</a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineNoCov"> 0 : if (bl) {</span></a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : close(c-&gt;ctrl);</span></a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : }</a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/pflash.c.func-sort-c.html b/coverage-report/external/pflash/pflash.c.func-sort-c.html
new file mode 100644
index 0000000..2975837
--- /dev/null
+++ b/coverage-report/external/pflash/pflash.c.func-sort-c.html
@@ -0,0 +1,145 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/pflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/pflash</a> - pflash.c<span style="font-size: 80%;"> (<a href="pflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">450</td>
+ <td class="headerCovTableEntry">761</td>
+ <td class="headerCovTableEntryLo">59.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">16</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="pflash.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#557">disable_4B_addresses</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#491">do_read_file</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#539">enable_4B_addresses</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#377">set_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#250">erase_chip</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#83">print_ffs_info</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#150">print_flash_info</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#632">print_help</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#410">program_file</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#291">erase_range</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#56">check_confirm</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#575">print_partition_detail</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#225">lookup_partition_at_side</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#188">open_partition</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#131">open_ffs</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#725">main</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/pflash.c.func.html b/coverage-report/external/pflash/pflash.c.func.html
new file mode 100644
index 0000000..e364864
--- /dev/null
+++ b/coverage-report/external/pflash/pflash.c.func.html
@@ -0,0 +1,145 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/pflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/pflash</a> - pflash.c<span style="font-size: 80%;"> (<a href="pflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">450</td>
+ <td class="headerCovTableEntry">761</td>
+ <td class="headerCovTableEntryLo">59.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">16</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="pflash.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#56">check_confirm</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#557">disable_4B_addresses</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#491">do_read_file</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#539">enable_4B_addresses</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#250">erase_chip</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#291">erase_range</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#225">lookup_partition_at_side</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#725">main</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#131">open_ffs</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#188">open_partition</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#83">print_ffs_info</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#150">print_flash_info</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#632">print_help</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#575">print_partition_detail</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#410">program_file</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pflash.c.gcov.html#377">set_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/pflash.c.gcov.html b/coverage-report/external/pflash/pflash.c.gcov.html
new file mode 100644
index 0000000..6ef153a
--- /dev/null
+++ b/coverage-report/external/pflash/pflash.c.gcov.html
@@ -0,0 +1,1315 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/pflash.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/pflash</a> - pflash.c<span style="font-size: 80%;"> (source / <a href="pflash.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">450</td>
+ <td class="headerCovTableEntry">761</td>
+ <td class="headerCovTableEntryLo">59.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">16</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Display progress bars, while also writing whole or part</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * of flash.</a>
+<a name="5"><span class="lineNum"> 5 </span> : : *</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : */</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #define _GNU_SOURCE</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;sys/mman.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;byteswap.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &lt;getopt.h&gt;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &lt;limits.h&gt;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &lt;arpa/inet.h&gt;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;assert.h&gt;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &lt;libflash/libffs.h&gt;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #include &lt;libflash/ecc.h&gt;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #include &lt;common/arch_flash.h&gt;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #include &quot;progress.h&quot;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : #define __aligned(x) __attribute__((aligned(x)))</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct flash_details {</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct blocklevel_device *bl;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : int need_relock;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : const char *name;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint64_t toc;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : uint64_t total_size;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : uint32_t erase_granule;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : bool mark_ecc;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : };</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* Full pflash version number (possibly includes gitid). */</a>
+<a name="48"><span class="lineNum"> 48 </span> : : extern const char version[];</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : const char *flashfilename = NULL;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : static bool must_confirm = true;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : static bool dummy_run;</a>
+<a name="53"><span class="lineNum"> 53 </span> : : static bool bmc_flash;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : #define FILE_BUF_SIZE 0x10000</a>
+<a name="56"><span class="lineNum"> 56 </span> : : static uint8_t file_buf[FILE_BUF_SIZE] __aligned(0x1000);</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 12 : static bool check_confirm(void)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 12 : char yes[8], *p;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 12 : if (!must_confirm)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : return true;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 8 : printf(&quot;WARNING ! This will modify your %s flash chip content !\n&quot;,</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 8 : bmc_flash ? &quot;BMC&quot; : &quot;HOST&quot;);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 8 : printf(&quot;Enter \&quot;yes\&quot; to confirm:&quot;);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 8 : memset(yes, 0, sizeof(yes));</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 8 : if (!fgets(yes, 7, stdin))</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : return false;</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 8 : p = strchr(yes, 10);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 8 : if (p)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 8 : *p = 0;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 8 : p = strchr(yes, 13);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 8 : if (p)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : *p = 0;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 8 : if (strcmp(yes, &quot;yes&quot;)) {</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : printf(&quot;Operation cancelled !\n&quot;);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 8 : must_confirm = false;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 8 : return true;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 2 : static uint32_t print_ffs_info(struct ffs_handle *ffsh, uint32_t toc)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : {</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 2 : struct ffs_entry *ent;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 2 : uint32_t next_toc = toc;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 2 : int rc;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 2 : int i;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 2 : printf(&quot;\n&quot;);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 2 : printf(&quot;TOC@0x%08x Partitions:\n&quot;, toc);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 2 : printf(&quot;-----------\n&quot;);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 2 : for (i = 0;; i++) {</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 16 : uint32_t start, size, act, end;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 16 : struct ffs_entry_user user;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 16 : char *name = NULL, *flags;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 16 : rc = ffs_part_info(ffsh, i, &amp;name, &amp;start, &amp;size, &amp;act, NULL);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 16 : if (rc == FFS_ERR_PART_NOT_FOUND)</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : break;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 14 : ent = ffs_entry_get(ffsh, i);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 14 : if (rc || !ent) {</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Error %d scanning partitions\n&quot;,</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : !ent ? FFS_ERR_PART_NOT_FOUND : rc);</a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : }</a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 14 : user = ffs_entry_user_get(ent);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 14 : ffs_entry_put(ent);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 14 : flags = ffs_entry_user_to_string(&amp;user);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 14 : if (!flags)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 14 : end = start + size;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 14 : printf(&quot;ID=%02d %15s 0x%08x..0x%08x (actual=0x%08x) [%s]\n&quot;,</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : i, name, start, end, act, flags);</a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 14 : if (strcmp(name, &quot;OTHER_SIDE&quot;) == 0)</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineNoCov"> 0 : next_toc = start;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 14 : free(flags);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 14 : out:</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 14 : free(name);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : }</a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 2 : return next_toc;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : }</a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 18 : static struct ffs_handle *open_ffs(struct flash_details *flash)</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : {</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 18 : struct ffs_handle *ffsh;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 18 : int rc;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 36 : rc = ffs_init(flash-&gt;toc, flash-&gt;total_size,</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 18 : flash-&gt;bl, &amp;ffsh, flash-&gt;mark_ecc);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 18 : if (rc) {</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Error %d opening ffs !\n&quot;, rc);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : if (flash-&gt;toc) {</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;You specified 0x%&quot; PRIx64 &quot; as the libffs TOC\n&quot;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : &quot;Looks like it doesn't exist\n&quot;, flash-&gt;toc);</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : }</a>
+<a name="147"><span class="lineNum"> 147 </span> : : }</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 18 : return ffsh;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : }</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 2 : static void print_flash_info(struct flash_details *flash)</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : {</a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 2 : struct ffs_handle *ffsh;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 2 : uint32_t next_toc;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 2 : uint32_t toc;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 2 : printf(&quot;Flash info:\n&quot;);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 2 : printf(&quot;-----------\n&quot;);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 2 : printf(&quot;Name = %s\n&quot;, flash-&gt;name);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 2 : printf(&quot;Total size = %&quot; PRIu64 &quot;MB\t Flags E:ECC, P:PRESERVED, R:READONLY, &quot;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 2 : &quot;B:BACKUP\n&quot;, flash-&gt;total_size &gt;&gt; 20);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 2 : printf(&quot;Erase granule = %2d%-13sF:REPROVISION, V:VOLATILE, C:CLEARECC\n&quot;,</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 2 : flash-&gt;erase_granule &gt;&gt; 10, &quot;KB&quot;);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 2 : if (bmc_flash)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : return;</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 2 : toc = flash-&gt;toc;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 2 : ffsh = open_ffs(flash);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 2 : if (!ffsh)</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : return;</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 2 : next_toc = print_ffs_info(ffsh, toc);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 2 : ffs_close(ffsh);</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 2 : while(next_toc != toc) {</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : struct ffs_handle *next_ffsh;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : flash-&gt;toc = next_toc;</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : next_ffsh = open_ffs(flash);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : if (!next_ffsh)</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : break;</a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : next_toc = print_ffs_info(next_ffsh, next_toc);</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : ffs_close(next_ffsh);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 2 : flash-&gt;toc = toc;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : }</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 16 : static struct ffs_handle *open_partition(struct flash_details *flash,</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : const char *name, uint32_t *index)</a>
+<a name="192"><span class="lineNum"> 192 </span> : : {</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 16 : struct ffs_handle *ffsh;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 16 : int rc;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 16 : ffsh = open_ffs(flash);</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 16 : if (!ffsh)</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : return NULL;</a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 16 : if (!name)</span></a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* Just open the FFS */</a>
+<a name="202"><span class="lineNum"> 202 </span> : : return ffsh;</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> : : /* Find partition */</a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 4 : rc = ffs_lookup_part(ffsh, name, index);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 4 : if (rc == FFS_ERR_PART_NOT_FOUND) {</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Partition '%s' not found !\n&quot;, name);</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Error %d looking for partition '%s' !\n&quot;,</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : rc, name);</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : }</a>
+<a name="215"><span class="lineNum"> 215 </span> : : return ffsh;</a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : ffs_close(ffsh);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : }</a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 16 : static struct ffs_handle *lookup_partition_at_toc(struct flash_details *flash,</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : const char *name, uint32_t *index)</a>
+<a name="223"><span class="lineNum"> 223 </span> : : {</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 16 : return open_partition(flash, name, index);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : }</a>
+<a name="226"><span class="lineNum"> 226 </span> : : </a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 16 : static struct ffs_handle *lookup_partition_at_side(struct flash_details *flash,</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : int side, const char *name, uint32_t *index)</a>
+<a name="229"><span class="lineNum"> 229 </span> : : {</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 16 : uint32_t toc = 0;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 16 : int rc;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 16 : if (side == 1) {</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : struct ffs_handle *ffsh;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : uint32_t side_index;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : </a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : ffsh = open_partition(flash, &quot;OTHER_SIDE&quot;, &amp;side_index);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : if (!ffsh)</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> : : /* Just need to know where it starts */</a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : rc = ffs_part_info(ffsh, side_index, NULL, &amp;toc, NULL, NULL, NULL);</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : ffs_close(ffsh);</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : return NULL;</a>
+<a name="246"><span class="lineNum"> 246 </span> : : }</a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 16 : flash-&gt;toc = toc;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 16 : return lookup_partition_at_toc(flash, name, index);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : }</a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 2 : static int erase_chip(struct flash_details *flash)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : {</a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 2 : bool confirm;</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 2 : int rc;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 2 : uint64_t pos;</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 2 : printf(&quot;About to erase chip !\n&quot;);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 2 : confirm = check_confirm();</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 2 : if (!confirm)</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : return 1;</a>
+<a name="262"><span class="lineNum"> 262 </span> : : </a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 2 : printf(&quot;Erasing... (may take a while)\n&quot;);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 2 : fflush(stdout);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 2 : if (dummy_run) {</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : printf(&quot;skipped (dummy)\n&quot;);</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : }</a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : /*</a>
+<a name="272"><span class="lineNum"> 272 </span> : : * We could use arch_flash_erase_chip() here BUT everyone really</a>
+<a name="273"><span class="lineNum"> 273 </span> : : * likes the progress bars.</a>
+<a name="274"><span class="lineNum"> 274 </span> : : * Lets do an erase block at a time erase then...</a>
+<a name="275"><span class="lineNum"> 275 </span> : : */</a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 2 : progress_init(flash-&gt;total_size);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 5124 : for (pos = 0; pos &lt; flash-&gt;total_size; pos += flash-&gt;erase_granule) {</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 5120 : rc = blocklevel_erase(flash-&gt;bl, pos, flash-&gt;erase_granule);</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 5120 : if (rc)</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : break;</a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 5120 : progress_tick(pos);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : }</a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 2 : progress_end();</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 2 : if (rc) {</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Error %d erasing chip\n&quot;, rc);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : }</a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 2 : printf(&quot;done !\n&quot;);</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : }</a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 6 : static int erase_range(struct flash_details *flash,</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : uint32_t start, uint32_t size, bool will_program,</a>
+<a name="295"><span class="lineNum"> 295 </span> : : struct ffs_handle *ffsh, int ffs_index)</a>
+<a name="296"><span class="lineNum"> 296 </span> : : {</a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 6 : uint32_t done = 0, erase_mask = flash-&gt;erase_granule - 1;</span></a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 6 : struct ffs_entry *toc;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 6 : bool confirm;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 6 : int rc;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 6 : printf(&quot;About to erase 0x%08x..0x%08x !\n&quot;, start, start + size);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 6 : confirm = check_confirm();</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 6 : if (!confirm)</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : return 1;</a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 6 : if (dummy_run) {</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : printf(&quot;skipped (dummy)\n&quot;);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 6 : printf(&quot;Erasing...\n&quot;);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : /*</a>
+<a name="314"><span class="lineNum"> 314 </span> : : * blocklevel_smart_erase() can do the entire thing in one call</a>
+<a name="315"><span class="lineNum"> 315 </span> : : * BUT everyone really likes progress bars so break stuff up</a>
+<a name="316"><span class="lineNum"> 316 </span> : : */</a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 6 : progress_init(size);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 6 : if (start &amp; erase_mask) {</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : /*</a>
+<a name="320"><span class="lineNum"> 320 </span> : : * Align to next erase block, or just do the entire</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * thing if we fit within one erase block</a>
+<a name="322"><span class="lineNum"> 322 </span> : : */</a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : uint32_t first_size = MIN(size, (flash-&gt;erase_granule - (start &amp; erase_mask)));</span></a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_smart_erase(flash-&gt;bl, start, first_size);</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Failed to blocklevel_smart_erase(): %d\n&quot;, rc);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : }</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : size -= first_size;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : done = first_size;</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : start += first_size;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : }</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 6 : progress_tick(done);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 1542 : while (size &amp; ~(erase_mask)) {</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 1536 : rc = blocklevel_smart_erase(flash-&gt;bl, start, flash-&gt;erase_granule);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 1536 : if (rc) {</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Failed to blocklevel_smart_erase(): %d\n&quot;, rc);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 1536 : start += flash-&gt;erase_granule;</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 1536 : size -= flash-&gt;erase_granule;</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 1536 : done += flash-&gt;erase_granule;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 1536 : progress_tick(done);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : }</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 6 : if (size) {</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_smart_erase(flash-&gt;bl, start, size);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Failed to blocklevel_smart_erase(): %d\n&quot;, rc);</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : }</a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : done += size;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : progress_tick(done);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> : : }</a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 6 : progress_end();</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 6 : if (!ffsh)</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : return 0;</a>
+<a name="359"><span class="lineNum"> 359 </span> : : </a>
+<a name="360"><span class="lineNum"> 360 </span> : : /* If this is a flash partition, mark it empty if we aren't</a>
+<a name="361"><span class="lineNum"> 361 </span> : : * going to program over it as well</a>
+<a name="362"><span class="lineNum"> 362 </span> : : */</a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 4 : toc = ffs_entry_get(ffsh, 0);</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 4 : if (toc) {</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 4 : struct ffs_entry_user user;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 4 : bool rw_toc;</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 4 : user = ffs_entry_user_get(toc);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 4 : rw_toc = !(user.miscflags &amp; FFS_MISCFLAGS_READONLY);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 4 : if (ffs_index &gt;= 0 &amp;&amp; !will_program &amp;&amp; rw_toc) {</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 2 : printf(&quot;Updating actual size in partition header...\n&quot;);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 2 : ffs_update_act_size(ffsh, ffs_index, 0);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : }</a>
+<a name="374"><span class="lineNum"> 374 </span> : : }</a>
+<a name="375"><span class="lineNum"> 375 </span> : : </a>
+<a name="376"><span class="lineNum"> 376 </span> : : return 0;</a>
+<a name="377"><span class="lineNum"> 377 </span> : : }</a>
+<a name="378"><span class="lineNum"> 378 </span> : : </a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : static int set_ecc(struct flash_details *flash, uint32_t start, uint32_t size)</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : {</a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : uint32_t i = start + 8;</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineNoCov"> 0 : uint8_t ecc = 0;</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : bool confirm;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : printf(&quot;About to erase and set ECC bits in region 0x%08x to 0x%08x\n&quot;, start, start + size);</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : confirm = check_confirm();</span></a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineNoCov"> 0 : if (!confirm)</span></a>
+<a name="389"><span class="lineNum"> 389 </span> : : return 1;</a>
+<a name="390"><span class="lineNum"> 390 </span> : : </a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineNoCov"> 0 : rc = erase_range(flash, start, size, true, NULL, 0);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't erase region to mark with ECC\n&quot;);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : printf(&quot;Programming ECC bits...\n&quot;);</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : progress_init(size);</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : while (i &lt; start + size) {</span></a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_write(flash-&gt;bl, i, &amp;ecc, sizeof(ecc));</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;\nError setting ECC byte at 0x%08x\n&quot;, i);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="404"><span class="lineNum"> 404 </span> : : }</a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : i += 9;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : progress_tick(i - start);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : }</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : progress_end();</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : }</a>
+<a name="411"><span class="lineNum"> 411 </span> : : </a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 4 : static int program_file(struct blocklevel_device *bl,</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : const char *file, uint32_t start, uint32_t size,</a>
+<a name="414"><span class="lineNum"> 414 </span> : : struct ffs_handle *ffsh, int ffs_index)</a>
+<a name="415"><span class="lineNum"> 415 </span> : : {</a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 4 : uint32_t actual_size = 0;</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 4 : struct ffs_entry *toc;</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 4 : int fd, rc = 0;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineCov"> 4 : bool confirm;</span></a>
+<a name="420"><span class="lineNum"> 420 </span> : : </a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineCov"> 4 : fd = open(file, O_RDONLY);</span></a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineCov"> 4 : if (fd == -1) {</span></a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : perror(&quot;Failed to open file&quot;);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : }</a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 4 : printf(&quot;About to program \&quot;%s\&quot; at 0x%08x..0x%08x !\n&quot;,</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : file, start, start + size);</a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 4 : confirm = check_confirm();</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 4 : if (!confirm) {</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="432"><span class="lineNum"> 432 </span> : : }</a>
+<a name="433"><span class="lineNum"> 433 </span> : : </a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 4 : if (dummy_run) {</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineNoCov"> 0 : printf(&quot;skipped (dummy)\n&quot;);</span></a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="438"><span class="lineNum"> 438 </span> : : }</a>
+<a name="439"><span class="lineNum"> 439 </span> : : </a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 4 : printf(&quot;Programming &amp; Verifying...\n&quot;);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 4 : progress_init(size);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 8 : while(size) {</span></a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineCov"> 4 : ssize_t len;</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 4 : len = read(fd, file_buf, FILE_BUF_SIZE);</span></a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 4 : if (len &lt; 0) {</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : perror(&quot;Error reading file&quot;);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : }</a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineCov"> 4 : if (len == 0)</span></a>
+<a name="452"><span class="lineNum"> 452 </span> : : break;</a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 4 : if (len &gt; size)</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : len = size;</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 4 : size -= len;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineCov"> 4 : actual_size += len;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 4 : rc = blocklevel_write(bl, start, file_buf, len);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : if (rc == FLASH_ERR_VERIFY_FAILURE)</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Verification failed for&quot;</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : &quot; chunk at 0x%08x\n&quot;, start);</a>
+<a name="462"><span class="lineNum"> 462 </span> : : else</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Flash write error %d for&quot;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> : : &quot; chunk at 0x%08x\n&quot;, rc, start);</a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : }</a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 4 : start += len;</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 4 : progress_tick(actual_size);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> : : }</a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 4 : progress_end();</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 4 : if (!ffsh)</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 2 : goto out;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : </a>
+<a name="475"><span class="lineNum"> 475 </span> : : /* If this is a flash partition, adjust its size */</a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 2 : toc = ffs_entry_get(ffsh, 0);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 2 : if (toc) {</span></a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 2 : struct ffs_entry_user user;</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineCov"> 2 : bool rw_toc;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : </a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineCov"> 2 : user = ffs_entry_user_get(toc);</span></a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 2 : rw_toc = !(user.miscflags &amp; FFS_MISCFLAGS_READONLY);</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 2 : if (ffs_index &gt;= 0 &amp;&amp; rw_toc) {</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 2 : printf(&quot;Updating actual size in partition header...\n&quot;);</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineCov"> 2 : ffs_update_act_size(ffsh, ffs_index, actual_size);</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : }</a>
+<a name="487"><span class="lineNum"> 487 </span> : : }</a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 4 : close(fd);</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : }</a>
+<a name="492"><span class="lineNum"> 492 </span> : : </a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : static int do_read_file(struct blocklevel_device *bl, const char *file,</span></a>
+<a name="494"><span class="lineNum"> 494 </span> : : uint32_t start, uint32_t size, uint32_t skip_size)</a>
+<a name="495"><span class="lineNum"> 495 </span> : : {</a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : int fd, rc = 0;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : uint32_t done = 0;</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : fd = open(file, O_WRONLY | O_TRUNC | O_CREAT, 00666);</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : if (fd == -1) {</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : perror(&quot;Failed to open file&quot;);</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : }</a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : start += skip_size;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : size -= skip_size;</span></a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : printf(&quot;Reading to \&quot;%s\&quot; from 0x%08x..0x%08x !\n&quot;,</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : file, start, start + size);</a>
+<a name="509"><span class="lineNum"> 509 </span> : : </a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineNoCov"> 0 : progress_init(size);</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : while(size) {</span></a>
+<a name="512"><span class="lineNum"> 512 </span> :<span class="lineNoCov"> 0 : ssize_t len;</span></a>
+<a name="513"><span class="lineNum"> 513 </span> : : </a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : len = size &gt; FILE_BUF_SIZE ? FILE_BUF_SIZE : size;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, start, file_buf, len);</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Flash read error %d for&quot;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : &quot; chunk at 0x%08x\n&quot;, rc, start);</a>
+<a name="519"><span class="lineNum"> 519 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="520"><span class="lineNum"> 520 </span> : : }</a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : rc = write(fd, file_buf, len);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> : : /*</a>
+<a name="523"><span class="lineNum"> 523 </span> : : * zero isn't strictly an error.</a>
+<a name="524"><span class="lineNum"> 524 </span> : : * Treat it as such so we can be sure we'lre always</a>
+<a name="525"><span class="lineNum"> 525 </span> : : * making forward progress.</a>
+<a name="526"><span class="lineNum"> 526 </span> : : */</a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : if (rc &lt;= 0) {</span></a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : perror(&quot;Error writing file&quot;);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="530"><span class="lineNum"> 530 </span> : : }</a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : start += rc;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : size -= rc;</span></a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : done += rc;</span></a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : progress_tick(done);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> : : }</a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : progress_end();</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineNoCov"> 0 : close(fd);</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : return size ? rc : 0;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : }</a>
+<a name="540"><span class="lineNum"> 540 </span> : : </a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : static int enable_4B_addresses(struct blocklevel_device *bl)</span></a>
+<a name="542"><span class="lineNum"> 542 </span> : : {</a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : printf(&quot;Switching to 4-bytes address mode\n&quot;);</span></a>
+<a name="546"><span class="lineNum"> 546 </span> : : </a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : rc = arch_flash_4b_mode(bl, true);</span></a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : if (rc == -1) {</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Switching address mode not available on this architecture\n&quot;);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> : : } else {</a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Error %d enabling 4b mode\n&quot;, rc);</span></a>
+<a name="553"><span class="lineNum"> 553 </span> : : }</a>
+<a name="554"><span class="lineNum"> 554 </span> : : }</a>
+<a name="555"><span class="lineNum"> 555 </span> : : </a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="557"><span class="lineNum"> 557 </span> : : }</a>
+<a name="558"><span class="lineNum"> 558 </span> : : </a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : static int disable_4B_addresses(struct blocklevel_device *bl)</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : {</a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="562"><span class="lineNum"> 562 </span> : : </a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineNoCov"> 0 : printf(&quot;Switching to 3-bytes address mode\n&quot;);</span></a>
+<a name="564"><span class="lineNum"> 564 </span> : : </a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : rc = arch_flash_4b_mode(bl, false);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : if (rc == -1) {</span></a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Switching address mode not available on this architecture\n&quot;);</span></a>
+<a name="569"><span class="lineNum"> 569 </span> : : } else {</a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Error %d enabling 4b mode\n&quot;, rc);</span></a>
+<a name="571"><span class="lineNum"> 571 </span> : : }</a>
+<a name="572"><span class="lineNum"> 572 </span> : : }</a>
+<a name="573"><span class="lineNum"> 573 </span> : : </a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : }</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineCov"> 12 : static void print_partition_detail(struct ffs_handle *ffsh, uint32_t part_id)</span></a>
+<a name="578"><span class="lineNum"> 578 </span> : : {</a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineCov"> 12 : uint32_t start, size, act, end;</span></a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineCov"> 12 : char *ent_name = NULL, *flags;</span></a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineCov"> 12 : struct ffs_entry *ent;</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineCov"> 12 : int rc, l;</span></a>
+<a name="583"><span class="lineNum"> 583 </span> : : </a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineCov"> 12 : rc = ffs_part_info(ffsh, part_id, &amp;ent_name, &amp;start, &amp;size,</span></a>
+<a name="585"><span class="lineNum"> 585 </span> : : &amp;act, NULL);</a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 12 : if (rc) {</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Partition with ID %d doesn't exist error: %d\n&quot;,</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : part_id, rc);</a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> : : }</a>
+<a name="591"><span class="lineNum"> 591 </span> : : </a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 12 : ent = ffs_entry_get(ffsh, part_id);</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 12 : if (!ent) {</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : rc = FFS_ERR_PART_NOT_FOUND;</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't open partition entry\n&quot;);</span></a>
+<a name="596"><span class="lineNum"> 596 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="597"><span class="lineNum"> 597 </span> : : }</a>
+<a name="598"><span class="lineNum"> 598 </span> : : </a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineCov"> 12 : printf(&quot;Detailed partition information\n&quot;);</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineCov"> 12 : end = start + size;</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 12 : printf(&quot;Name:\n&quot;);</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 12 : printf(&quot;%s (ID=%02d)\n\n&quot;, ent_name, part_id);</span></a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineCov"> 12 : printf(&quot;%-10s %-10s %-10s\n&quot;, &quot;Start&quot;, &quot;End&quot;, &quot;Actual&quot;);</span></a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineCov"> 12 : printf(&quot;0x%08x 0x%08x 0x%08x\n\n&quot;, start, end, act);</span></a>
+<a name="605"><span class="lineNum"> 605 </span> : : </a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineCov"> 12 : printf(&quot;Flags:\n&quot;);</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : </a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineCov"> 94 : l = asprintf(&amp;flags, &quot;%s%s%s%s%s%s%s&quot;, has_ecc(ent) ? &quot;ECC [E]\n&quot; : &quot;&quot;,</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineCov"> 12 : has_flag(ent, FFS_MISCFLAGS_PRESERVED) ? &quot;PRESERVED [P]\n&quot; : &quot;&quot;,</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineCov"> 12 : has_flag(ent, FFS_MISCFLAGS_READONLY) ? &quot;READONLY [R]\n&quot; : &quot;&quot;,</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineCov"> 12 : has_flag(ent, FFS_MISCFLAGS_BACKUP) ? &quot;BACKUP [B]\n&quot; : &quot;&quot;,</span></a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineCov"> 12 : has_flag(ent, FFS_MISCFLAGS_REPROVISION) ?</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : &quot;REPROVISION [F]\n&quot; : &quot;&quot;,</a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 12 : has_flag(ent, FFS_MISCFLAGS_VOLATILE) ? &quot;VOLATILE [V]\n&quot; : &quot;&quot;,</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 12 : has_flag(ent, FFS_MISCFLAGS_CLEARECC) ? &quot;CLEARECC [C]\n&quot; : &quot;&quot;);</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineCov"> 12 : ffs_entry_put(ent);</span></a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineCov"> 12 : if (l &lt; 0) {</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Memory allocation failure printing flags!\n&quot;);</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="620"><span class="lineNum"> 620 </span> : : }</a>
+<a name="621"><span class="lineNum"> 621 </span> : : </a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineCov"> 12 : printf(&quot;%s&quot;, flags);</span></a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineCov"> 12 : free(flags);</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : </a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineCov"> 12 : out:</span></a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineCov"> 12 : free(ent_name);</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 12 : }</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 4 : static void print_version(void)</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : {</a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 4 : printf(&quot;Open-Power Flash tool %s\n&quot;, version);</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : </a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 4 : static void print_help(const char *pname)</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : {</a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineCov"> 4 : printf(&quot;Usage: %s [options] commands...\n\n&quot;, pname);</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineCov"> 4 : printf(&quot; Options:\n&quot;);</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineCov"> 4 : printf(&quot;\t-a address, --address=address\n&quot;);</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tSpecify the start address for erasing, reading\n&quot;);</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tor flashing\n\n&quot;);</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineCov"> 4 : printf(&quot;\t-s size, --size=size\n&quot;);</span></a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tSpecify the size in bytes for erasing, reading\n&quot;);</span></a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tor flashing\n\n&quot;);</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineCov"> 4 : printf(&quot;\t-P part_name, --partition=part_name\n&quot;);</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tSpecify the partition whose content is to be erased\n&quot;);</span></a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tprogrammed or read. This is an alternative to -a and -s\n&quot;);</span></a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tif both -P and -s are specified, the smallest of the\n&quot;);</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineCov"> 4 : printf(&quot;\t\ttwo will be used\n\n&quot;);</span></a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineCov"> 4 : printf(&quot;\t-f, --force\n&quot;);</span></a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tDon't ask for confirmation before erasing or flashing\n\n&quot;);</span></a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 4 : printf(&quot;\t-d, --dummy\n&quot;);</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tDon't write to flash\n\n&quot;);</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineCov"> 4 : printf(&quot;\t--direct\n&quot;);</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tBypass all safety provided to you by the kernel driver\n&quot;);</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tand use the flash driver built into pflash.\n&quot;);</span></a>
+<a name="656"><span class="lineNum"> 656 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tIf you have mtd devices and you use this command, the\n&quot;);</span></a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tsystem may become unstable.\n&quot;);</span></a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tIf you are reading this sentence then this flag is not\n&quot;);</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineCov"> 4 : printf(&quot;\t\twhat you want! Using this feature without knowing\n&quot;);</span></a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineCov"> 4 : printf(&quot;\t\twhat it does can and likely will result in a bricked\n&quot;);</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tmachine\n\n&quot;);</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 4 : printf(&quot;\t-b, --bmc\n&quot;);</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tTarget BMC flash instead of host flash.\n&quot;);</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tNote: This carries a high chance of bricking your BMC if you\n&quot;);</span></a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tdon't know what you're doing. Consider --mtd to be safe(r)\n\n&quot;);</span></a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineCov"> 4 : printf(&quot;\t-F filename, --flash-file filename\n&quot;);</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tTarget filename instead of actual flash.\n\n&quot;);</span></a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 4 : printf(&quot;\t-S, --side\n&quot;);</span></a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tSide of the flash on which to operate, 0 (default) or 1\n\n&quot;);</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineCov"> 4 : printf(&quot;\t--skip=N\n&quot;);</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tSkip N number of bytes from the start when reading\n\n&quot;);</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineCov"> 4 : printf(&quot;\t-T, --toc\n&quot;);</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tlibffs TOC on which to operate, defaults to 0.\n&quot;);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tleading 0x is required for interpretation of a hex value\n\n&quot;);</span></a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineCov"> 4 : printf(&quot;\t-g\n&quot;);</span></a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tEnable verbose libflash debugging\n\n&quot;);</span></a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineCov"> 4 : printf(&quot; Commands:\n&quot;);</span></a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineCov"> 4 : printf(&quot;\t-4, --enable-4B\n&quot;);</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tSwitch the flash and controller to 4-bytes address\n&quot;);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tmode (no confirmation needed).\n\n&quot;);</span></a>
+<a name="681"><span class="lineNum"> 681 </span> :<span class="lineCov"> 4 : printf(&quot;\t-3, --disable-4B\n&quot;);</span></a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tSwitch the flash and controller to 3-bytes address\n&quot;);</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tmode (no confirmation needed).\n\n&quot;);</span></a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineCov"> 4 : printf(&quot;\t-r file, --read=file\n&quot;);</span></a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tRead flash content from address into file, use -s\n&quot;);</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tto specify the size to read (or it will use the source\n&quot;);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tfile size if used in conjunction with -p and -s is not\n&quot;);</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tspecified). When using -r together with -e or -p, the\n&quot;);</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tread will be performed first\n\n&quot;);</span></a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineCov"> 4 : printf(&quot;\t-E, --erase-all\n&quot;);</span></a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tErase entire flash chip\n&quot;);</span></a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineCov"> 4 : printf(&quot;\t\t(Not supported on all chips/controllers)\n\n&quot;);</span></a>
+<a name="693"><span class="lineNum"> 693 </span> :<span class="lineCov"> 4 : printf(&quot;\t-e, --erase\n&quot;);</span></a>
+<a name="694"><span class="lineNum"> 694 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tErase the specified region. If size or address are not\n&quot;);</span></a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tspecified, but \'--program\' is used, then the file\n&quot;);</span></a>
+<a name="696"><span class="lineNum"> 696 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tsize will be used (rounded to an erase block) and the\n&quot;);</span></a>
+<a name="697"><span class="lineNum"> 697 </span> :<span class="lineCov"> 4 : printf(&quot;\t\taddress defaults to 0.\n\n&quot;);</span></a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineCov"> 4 : printf(&quot;\t-p file, --program=file\n&quot;);</span></a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tWill program the file to flash. If the address is not\n&quot;);</span></a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tspecified, it will use 0. If the size is not specified\n&quot;);</span></a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tit will use the file size. Otherwise it will limit to\n&quot;);</span></a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tthe specified size (whatever is smaller). If used in\n&quot;);</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tconjunction with any erase command, the erase will\n&quot;);</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineCov"> 4 : printf(&quot;\t\ttake place first.\n\n&quot;);</span></a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineCov"> 4 : printf(&quot;\t-t, --tune\n&quot;);</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tJust tune the flash controller &amp; access size\n&quot;);</span></a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tMust be used in conjuction with --direct\n&quot;);</span></a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 4 : printf(&quot;\t\t(Implicit for all other operations)\n\n&quot;);</span></a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineCov"> 4 : printf(&quot;\t-c --clear\n&quot;);</span></a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tUsed to ECC clear a partition of the flash\n&quot;);</span></a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tMust be used in conjunction with -P. Will erase the\n&quot;);</span></a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tpartition and then set all the ECC bits as they should be\n\n&quot;);</span></a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 4 : printf(&quot;\t-9 --ecc\n&quot;);</span></a>
+<a name="714"><span class="lineNum"> 714 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tEncode/Decode ECC where specified in the FFS header.\n&quot;);</span></a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tThis 9 byte ECC method is used for some OpenPOWER\n&quot;);</span></a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tpartitions.\n&quot;);</span></a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 4 : printf(&quot;\t-i, --info\n&quot;);</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tDisplay some information about the flash.\n\n&quot;);</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 4 : printf(&quot;\t--detail\n&quot;);</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tDisplays detailed info about a particular partition.\n&quot;);</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tAccepts a numeric partition or can be used in conjuction\n&quot;);</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 4 : printf(&quot;\t\twith the -P flag.\n\n&quot;);</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 4 : printf(&quot;\t-h, --help\n&quot;);</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineCov"> 4 : printf(&quot;\t\tThis message.\n\n&quot;);</span></a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="726"><span class="lineNum"> 726 </span> : : </a>
+<a name="727"><span class="lineNum"> 727 </span> :<span class="lineCov"> 26 : int main(int argc, char *argv[])</span></a>
+<a name="728"><span class="lineNum"> 728 </span> : : {</a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineCov"> 26 : const char *pname = argv[0];</span></a>
+<a name="730"><span class="lineNum"> 730 </span> :<span class="lineCov"> 26 : struct flash_details flash = { 0 };</span></a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineCov"> 26 : static struct ffs_handle *ffsh = NULL;</span></a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineCov"> 26 : uint32_t ffs_index;</span></a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineCov"> 26 : uint32_t address = 0, read_size = 0, detail_id = UINT_MAX;</span></a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineCov"> 26 : uint32_t write_size = 0, write_size_minus_ecc = 0;</span></a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineCov"> 26 : bool erase = false, do_clear = false;</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineCov"> 26 : bool program = false, erase_all = false, info = false, do_read = false;</span></a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineCov"> 26 : bool enable_4B = false, disable_4B = false;</span></a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineCov"> 26 : bool show_help = false, show_version = false;</span></a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineCov"> 26 : bool no_action = false, tune = false;</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 26 : char *write_file = NULL, *read_file = NULL, *part_name = NULL;</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 26 : bool ffs_toc_seen = false, direct = false, print_detail = false;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineCov"> 26 : int flash_side = 0, skip_size = 0;</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineCov"> 26 : int rc = 0;</span></a>
+<a name="744"><span class="lineNum"> 744 </span> : : </a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineCov"> 66 : while(1) {</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineCov"> 92 : struct option long_opts[] = {</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : {&quot;address&quot;, required_argument, NULL, 'a'},</a>
+<a name="748"><span class="lineNum"> 748 </span> : : {&quot;size&quot;, required_argument, NULL, 's'},</a>
+<a name="749"><span class="lineNum"> 749 </span> : : {&quot;partition&quot;, required_argument, NULL, 'P'},</a>
+<a name="750"><span class="lineNum"> 750 </span> : : {&quot;bmc&quot;, no_argument, NULL, 'b'},</a>
+<a name="751"><span class="lineNum"> 751 </span> : : {&quot;direct&quot;, no_argument, NULL, 'D'},</a>
+<a name="752"><span class="lineNum"> 752 </span> : : {&quot;enable-4B&quot;, no_argument, NULL, '4'},</a>
+<a name="753"><span class="lineNum"> 753 </span> : : {&quot;disable-4B&quot;, no_argument, NULL, '3'},</a>
+<a name="754"><span class="lineNum"> 754 </span> : : {&quot;read&quot;, required_argument, NULL, 'r'},</a>
+<a name="755"><span class="lineNum"> 755 </span> : : {&quot;erase-all&quot;, no_argument, NULL, 'E'},</a>
+<a name="756"><span class="lineNum"> 756 </span> : : {&quot;erase&quot;, no_argument, NULL, 'e'},</a>
+<a name="757"><span class="lineNum"> 757 </span> : : {&quot;program&quot;, required_argument, NULL, 'p'},</a>
+<a name="758"><span class="lineNum"> 758 </span> : : {&quot;force&quot;, no_argument, NULL, 'f'},</a>
+<a name="759"><span class="lineNum"> 759 </span> : : {&quot;flash-file&quot;, required_argument, NULL, 'F'},</a>
+<a name="760"><span class="lineNum"> 760 </span> : : {&quot;info&quot;, no_argument, NULL, 'i'},</a>
+<a name="761"><span class="lineNum"> 761 </span> : : {&quot;detail&quot;, optional_argument, NULL, 'm'},</a>
+<a name="762"><span class="lineNum"> 762 </span> : : {&quot;tune&quot;, no_argument, NULL, 't'},</a>
+<a name="763"><span class="lineNum"> 763 </span> : : {&quot;dummy&quot;, no_argument, NULL, 'd'},</a>
+<a name="764"><span class="lineNum"> 764 </span> : : {&quot;help&quot;, no_argument, NULL, 'h'},</a>
+<a name="765"><span class="lineNum"> 765 </span> : : {&quot;version&quot;, no_argument, NULL, 'v'},</a>
+<a name="766"><span class="lineNum"> 766 </span> : : {&quot;debug&quot;, no_argument, NULL, 'g'},</a>
+<a name="767"><span class="lineNum"> 767 </span> : : {&quot;side&quot;, required_argument, NULL, 'S'},</a>
+<a name="768"><span class="lineNum"> 768 </span> : : {&quot;skip&quot;, required_argument, NULL, 'k'},</a>
+<a name="769"><span class="lineNum"> 769 </span> : : {&quot;toc&quot;, required_argument, NULL, 'T'},</a>
+<a name="770"><span class="lineNum"> 770 </span> : : {&quot;clear&quot;, no_argument, NULL, 'c'},</a>
+<a name="771"><span class="lineNum"> 771 </span> : : {&quot;ecc&quot;, no_argument, NULL, '9'},</a>
+<a name="772"><span class="lineNum"> 772 </span> : : {NULL, 0, NULL, 0 }</a>
+<a name="773"><span class="lineNum"> 773 </span> : : };</a>
+<a name="774"><span class="lineNum"> 774 </span> :<span class="lineCov"> 92 : int c, oidx = 0;</span></a>
+<a name="775"><span class="lineNum"> 775 </span> : : </a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineCov"> 92 : c = getopt_long(argc, argv, &quot;+:a:s:P:r:43Eep:fdihvbtgS:T:c9F:&quot;,</span></a>
+<a name="777"><span class="lineNum"> 777 </span> : : long_opts, &amp;oidx);</a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineCov"> 92 : if (c == -1)</span></a>
+<a name="779"><span class="lineNum"> 779 </span> : : break;</a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 66 : switch(c) {</span></a>
+<a name="781"><span class="lineNum"> 781 </span> :<span class="lineCov"> 4 : char *endptr;</span></a>
+<a name="782"><span class="lineNum"> 782 </span> : : </a>
+<a name="783"><span class="lineNum"> 783 </span> :<span class="lineCov"> 4 : case 'a':</span></a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 4 : address = strtoul(optarg, &amp;endptr, 0);</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 4 : if (*endptr != '\0') {</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineCov"> 2 : rc = 1;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineCov"> 2 : no_action = true;</span></a>
+<a name="788"><span class="lineNum"> 788 </span> : : }</a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 66 : break;</span></a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineCov"> 4 : case 's':</span></a>
+<a name="791"><span class="lineNum"> 791 </span> :<span class="lineCov"> 4 : read_size = write_size = strtoul(optarg, &amp;endptr, 0);</span></a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineCov"> 4 : if (*endptr != '\0') {</span></a>
+<a name="793"><span class="lineNum"> 793 </span> :<span class="lineCov"> 2 : rc = 1;</span></a>
+<a name="794"><span class="lineNum"> 794 </span> :<span class="lineCov"> 2 : no_action = true;</span></a>
+<a name="795"><span class="lineNum"> 795 </span> : : }</a>
+<a name="796"><span class="lineNum"> 796 </span> : : break;</a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineCov"> 4 : case 'P':</span></a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineCov"> 4 : free(part_name);</span></a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineCov"> 4 : part_name = strdup(optarg);</span></a>
+<a name="800"><span class="lineNum"> 800 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="801"><span class="lineNum"> 801 </span> : : case '4':</a>
+<a name="802"><span class="lineNum"> 802 </span> : : enable_4B = true;</a>
+<a name="803"><span class="lineNum"> 803 </span> : : break;</a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineNoCov"> 0 : case '3':</span></a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : disable_4B = true;</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineNoCov"> 0 : case 'r':</span></a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineNoCov"> 0 : if (!optarg)</span></a>
+<a name="809"><span class="lineNum"> 809 </span> : : break;</a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : do_read = true;</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineNoCov"> 0 : free(read_file);</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : read_file = strdup(optarg);</span></a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineCov"> 2 : case 'E':</span></a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineCov"> 2 : erase_all = erase = true;</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 8 : case 'e':</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 8 : erase = true;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineCov"> 8 : break;</span></a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineNoCov"> 0 : case 'D':</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineNoCov"> 0 : direct = true;</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineCov"> 4 : case 'p':</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineCov"> 4 : if (!optarg)</span></a>
+<a name="825"><span class="lineNum"> 825 </span> : : break;</a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineCov"> 4 : program = true;</span></a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineCov"> 4 : free(write_file);</span></a>
+<a name="828"><span class="lineNum"> 828 </span> :<span class="lineCov"> 4 : write_file = strdup(optarg);</span></a>
+<a name="829"><span class="lineNum"> 829 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : case 'f':</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineNoCov"> 0 : must_confirm = false;</span></a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineCov"> 24 : case 'F':</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineCov"> 24 : flashfilename = optarg;</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 24 : break;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineNoCov"> 0 : case 'd':</span></a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineNoCov"> 0 : must_confirm = false;</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineNoCov"> 0 : dummy_run = true;</span></a>
+<a name="839"><span class="lineNum"> 839 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineCov"> 2 : case 'i':</span></a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 2 : info = true;</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineNoCov"> 0 : case 'b':</span></a>
+<a name="844"><span class="lineNum"> 844 </span> :<span class="lineNoCov"> 0 : bmc_flash = true;</span></a>
+<a name="845"><span class="lineNum"> 845 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="846"><span class="lineNum"> 846 </span> :<span class="lineNoCov"> 0 : case 't':</span></a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineNoCov"> 0 : tune = true;</span></a>
+<a name="848"><span class="lineNum"> 848 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="849"><span class="lineNum"> 849 </span> :<span class="lineNoCov"> 0 : case 'v':</span></a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineNoCov"> 0 : show_version = true;</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineCov"> 2 : case 'h':</span></a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineCov"> 2 : show_help = show_version = true;</span></a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineNoCov"> 0 : case 'g':</span></a>
+<a name="856"><span class="lineNum"> 856 </span> :<span class="lineNoCov"> 0 : libflash_debug = true;</span></a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="858"><span class="lineNum"> 858 </span> :<span class="lineNoCov"> 0 : case 'S':</span></a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineNoCov"> 0 : flash_side = atoi(optarg);</span></a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : case 'k':</span></a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineNoCov"> 0 : skip_size = strtoul(optarg, &amp;endptr, 0);</span></a>
+<a name="863"><span class="lineNum"> 863 </span> :<span class="lineNoCov"> 0 : if (*endptr != '\0') {</span></a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="865"><span class="lineNum"> 865 </span> :<span class="lineNoCov"> 0 : no_action = true;</span></a>
+<a name="866"><span class="lineNum"> 866 </span> : : }</a>
+<a name="867"><span class="lineNum"> 867 </span> : : break;</a>
+<a name="868"><span class="lineNum"> 868 </span> :<span class="lineNoCov"> 0 : case 'T':</span></a>
+<a name="869"><span class="lineNum"> 869 </span> :<span class="lineNoCov"> 0 : if (!optarg)</span></a>
+<a name="870"><span class="lineNum"> 870 </span> : : break;</a>
+<a name="871"><span class="lineNum"> 871 </span> :<span class="lineNoCov"> 0 : ffs_toc_seen = true;</span></a>
+<a name="872"><span class="lineNum"> 872 </span> :<span class="lineNoCov"> 0 : flash.toc = strtoul(optarg, &amp;endptr, 0);</span></a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineNoCov"> 0 : if (*endptr != '\0') {</span></a>
+<a name="874"><span class="lineNum"> 874 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="875"><span class="lineNum"> 875 </span> :<span class="lineNoCov"> 0 : no_action = true;</span></a>
+<a name="876"><span class="lineNum"> 876 </span> : : }</a>
+<a name="877"><span class="lineNum"> 877 </span> : : break;</a>
+<a name="878"><span class="lineNum"> 878 </span> :<span class="lineNoCov"> 0 : case 'c':</span></a>
+<a name="879"><span class="lineNum"> 879 </span> :<span class="lineNoCov"> 0 : do_clear = true;</span></a>
+<a name="880"><span class="lineNum"> 880 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="881"><span class="lineNum"> 881 </span> :<span class="lineCov"> 12 : case 'm':</span></a>
+<a name="882"><span class="lineNum"> 882 </span> :<span class="lineCov"> 12 : print_detail = true;</span></a>
+<a name="883"><span class="lineNum"> 883 </span> :<span class="lineCov"> 12 : if (optarg) {</span></a>
+<a name="884"><span class="lineNum"> 884 </span> :<span class="lineCov"> 12 : detail_id = strtoul(optarg, &amp;endptr, 0);</span></a>
+<a name="885"><span class="lineNum"> 885 </span> :<span class="lineCov"> 12 : if (*endptr != '\0') {</span></a>
+<a name="886"><span class="lineNum"> 886 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="887"><span class="lineNum"> 887 </span> :<span class="lineNoCov"> 0 : no_action = true;</span></a>
+<a name="888"><span class="lineNum"> 888 </span> : : }</a>
+<a name="889"><span class="lineNum"> 889 </span> : : }</a>
+<a name="890"><span class="lineNum"> 890 </span> : : break;</a>
+<a name="891"><span class="lineNum"> 891 </span> :<span class="lineNoCov"> 0 : case '9':</span></a>
+<a name="892"><span class="lineNum"> 892 </span> :<span class="lineNoCov"> 0 : flash.mark_ecc = true;</span></a>
+<a name="893"><span class="lineNum"> 893 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="894"><span class="lineNum"> 894 </span> :<span class="lineNoCov"> 0 : case ':':</span></a>
+<a name="895"><span class="lineNum"> 895 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unrecognised option \&quot;%s\&quot; to '%c'\n&quot;, optarg, optopt);</span></a>
+<a name="896"><span class="lineNum"> 896 </span> :<span class="lineNoCov"> 0 : no_action = true;</span></a>
+<a name="897"><span class="lineNum"> 897 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="898"><span class="lineNum"> 898 </span> :<span class="lineNoCov"> 0 : case '?':</span></a>
+<a name="899"><span class="lineNum"> 899 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unrecognised option '%c'\n&quot;, optopt);</span></a>
+<a name="900"><span class="lineNum"> 900 </span> :<span class="lineNoCov"> 0 : no_action = true;</span></a>
+<a name="901"><span class="lineNum"> 901 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="902"><span class="lineNum"> 902 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="903"><span class="lineNum"> 903 </span> :<span class="lineNoCov"> 0 : fprintf(stderr , &quot;Encountered unknown error parsing options\n&quot;);</span></a>
+<a name="904"><span class="lineNum"> 904 </span> :<span class="lineNoCov"> 0 : no_action = true;</span></a>
+<a name="905"><span class="lineNum"> 905 </span> : : }</a>
+<a name="906"><span class="lineNum"> 906 </span> : : }</a>
+<a name="907"><span class="lineNum"> 907 </span> : : </a>
+<a name="908"><span class="lineNum"> 908 </span> :<span class="lineCov"> 26 : if (optind &lt; argc) {</span></a>
+<a name="909"><span class="lineNum"> 909 </span> : : /*</a>
+<a name="910"><span class="lineNum"> 910 </span> : : * It appears not everything passed to pflash was an option, best to</a>
+<a name="911"><span class="lineNum"> 911 </span> : : * not continue</a>
+<a name="912"><span class="lineNum"> 912 </span> : : */</a>
+<a name="913"><span class="lineNum"> 913 </span> :<span class="lineNoCov"> 0 : while (optind &lt; argc)</span></a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unrecognised option or argument \&quot;%s\&quot;\n&quot;, argv[optind++]);</span></a>
+<a name="915"><span class="lineNum"> 915 </span> : : </a>
+<a name="916"><span class="lineNum"> 916 </span> : : no_action = true;</a>
+<a name="917"><span class="lineNum"> 917 </span> : : }</a>
+<a name="918"><span class="lineNum"> 918 </span> : : </a>
+<a name="919"><span class="lineNum"> 919 </span> : : /* Check if we need to access the flash at all (which will</a>
+<a name="920"><span class="lineNum"> 920 </span> : : * also tune them as a side effect</a>
+<a name="921"><span class="lineNum"> 921 </span> : : */</a>
+<a name="922"><span class="lineNum"> 922 </span> :<span class="lineCov"> 26 : no_action = no_action || (!erase &amp;&amp; !program &amp;&amp; !info &amp;&amp; !do_read &amp;&amp;</span></a>
+<a name="923"><span class="lineNum"> 923 </span> :<span class="lineCov"> 14 : !enable_4B &amp;&amp; !disable_4B &amp;&amp; !tune &amp;&amp; !do_clear &amp;&amp; !print_detail);</span></a>
+<a name="924"><span class="lineNum"> 924 </span> : : </a>
+<a name="925"><span class="lineNum"> 925 </span> : : /* Nothing to do, if we didn't already, print usage */</a>
+<a name="926"><span class="lineNum"> 926 </span> :<span class="lineCov"> 26 : if (no_action &amp;&amp; !show_version)</span></a>
+<a name="927"><span class="lineNum"> 927 </span> : : show_help = show_version = true;</a>
+<a name="928"><span class="lineNum"> 928 </span> : : </a>
+<a name="929"><span class="lineNum"> 929 </span> :<span class="lineCov"> 24 : if (show_version)</span></a>
+<a name="930"><span class="lineNum"> 930 </span> :<span class="lineCov"> 4 : print_version();</span></a>
+<a name="931"><span class="lineNum"> 931 </span> :<span class="lineCov"> 26 : if (show_help)</span></a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineCov"> 4 : print_help(pname);</span></a>
+<a name="933"><span class="lineNum"> 933 </span> : : </a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineCov"> 26 : if (no_action)</span></a>
+<a name="935"><span class="lineNum"> 935 </span> :<span class="lineCov"> 4 : goto out;</span></a>
+<a name="936"><span class="lineNum"> 936 </span> : : </a>
+<a name="937"><span class="lineNum"> 937 </span> : : /* --enable-4B and --disable-4B are mutually exclusive */</a>
+<a name="938"><span class="lineNum"> 938 </span> :<span class="lineCov"> 22 : if (enable_4B &amp;&amp; disable_4B) {</span></a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--enable-4B and --disable-4B are mutually&quot;</span></a>
+<a name="940"><span class="lineNum"> 940 </span> : : &quot; exclusive !\n&quot;);</a>
+<a name="941"><span class="lineNum"> 941 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="942"><span class="lineNum"> 942 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="943"><span class="lineNum"> 943 </span> : : }</a>
+<a name="944"><span class="lineNum"> 944 </span> : : </a>
+<a name="945"><span class="lineNum"> 945 </span> : : /* 4B not supported on BMC flash */</a>
+<a name="946"><span class="lineNum"> 946 </span> :<span class="lineCov"> 22 : if (enable_4B &amp;&amp; bmc_flash) {</span></a>
+<a name="947"><span class="lineNum"> 947 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--enable-4B not supported on BMC flash !\n&quot;);</span></a>
+<a name="948"><span class="lineNum"> 948 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="949"><span class="lineNum"> 949 </span> :<span class="lineNoCov"> 0 : goto out;;</span></a>
+<a name="950"><span class="lineNum"> 950 </span> : : }</a>
+<a name="951"><span class="lineNum"> 951 </span> : : </a>
+<a name="952"><span class="lineNum"> 952 </span> : : /* partitions not supported on BMC flash */</a>
+<a name="953"><span class="lineNum"> 953 </span> :<span class="lineCov"> 22 : if (part_name &amp;&amp; bmc_flash) {</span></a>
+<a name="954"><span class="lineNum"> 954 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--partition not supported on BMC flash !\n&quot;);</span></a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="956"><span class="lineNum"> 956 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="957"><span class="lineNum"> 957 </span> : : }</a>
+<a name="958"><span class="lineNum"> 958 </span> : : </a>
+<a name="959"><span class="lineNum"> 959 </span> :<span class="lineCov"> 22 : if (print_detail &amp;&amp; ((detail_id == UINT_MAX &amp;&amp; !part_name)</span></a>
+<a name="960"><span class="lineNum"> 960 </span> :<span class="lineCov"> 12 : || (detail_id != UINT_MAX &amp;&amp; part_name))) {</span></a>
+<a name="961"><span class="lineNum"> 961 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--detail requires either a partition id or\n&quot;);</span></a>
+<a name="962"><span class="lineNum"> 962 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;a partition name with -P\n&quot;);</span></a>
+<a name="963"><span class="lineNum"> 963 </span> : : }</a>
+<a name="964"><span class="lineNum"> 964 </span> : : </a>
+<a name="965"><span class="lineNum"> 965 </span> : : /* part-name and erase-all make no sense together */</a>
+<a name="966"><span class="lineNum"> 966 </span> :<span class="lineCov"> 22 : if (part_name &amp;&amp; erase_all) {</span></a>
+<a name="967"><span class="lineNum"> 967 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--partition and --erase-all are mutually&quot;</span></a>
+<a name="968"><span class="lineNum"> 968 </span> : : &quot; exclusive !\n&quot;);</a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="970"><span class="lineNum"> 970 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="971"><span class="lineNum"> 971 </span> : : }</a>
+<a name="972"><span class="lineNum"> 972 </span> : : </a>
+<a name="973"><span class="lineNum"> 973 </span> : : /* Read command should always come with a file */</a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 22 : if (do_read &amp;&amp; !read_file) {</span></a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Read with no file specified !\n&quot;);</span></a>
+<a name="976"><span class="lineNum"> 976 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="977"><span class="lineNum"> 977 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="978"><span class="lineNum"> 978 </span> : : }</a>
+<a name="979"><span class="lineNum"> 979 </span> : : </a>
+<a name="980"><span class="lineNum"> 980 </span> : : /* Skip only supported on read */</a>
+<a name="981"><span class="lineNum"> 981 </span> :<span class="lineCov"> 22 : if (skip_size &amp;&amp; !do_read) {</span></a>
+<a name="982"><span class="lineNum"> 982 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--skip requires a --read command !\n&quot;);</span></a>
+<a name="983"><span class="lineNum"> 983 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="984"><span class="lineNum"> 984 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="985"><span class="lineNum"> 985 </span> : : }</a>
+<a name="986"><span class="lineNum"> 986 </span> : : </a>
+<a name="987"><span class="lineNum"> 987 </span> : : /* Program command should always come with a file */</a>
+<a name="988"><span class="lineNum"> 988 </span> :<span class="lineCov"> 22 : if (program &amp;&amp; !write_file) {</span></a>
+<a name="989"><span class="lineNum"> 989 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Program with no file specified !\n&quot;);</span></a>
+<a name="990"><span class="lineNum"> 990 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="991"><span class="lineNum"> 991 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="992"><span class="lineNum"> 992 </span> : : }</a>
+<a name="993"><span class="lineNum"> 993 </span> : : </a>
+<a name="994"><span class="lineNum"> 994 </span> : : /* If both partition and address specified, error out */</a>
+<a name="995"><span class="lineNum"> 995 </span> :<span class="lineCov"> 22 : if (address &amp;&amp; part_name) {</span></a>
+<a name="996"><span class="lineNum"> 996 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Specify partition or address, not both !\n&quot;);</span></a>
+<a name="997"><span class="lineNum"> 997 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="998"><span class="lineNum"> 998 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="999"><span class="lineNum"> 999 </span> : : }</a>
+<a name="1000"><span class="lineNum"> 1000 </span> : : </a>
+<a name="1001"><span class="lineNum"> 1001 </span> :<span class="lineCov"> 22 : if (do_clear &amp;&amp; !part_name) {</span></a>
+<a name="1002"><span class="lineNum"> 1002 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--clear only supported on a partition name\n&quot;);</span></a>
+<a name="1003"><span class="lineNum"> 1003 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1004"><span class="lineNum"> 1004 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1005"><span class="lineNum"> 1005 </span> : : }</a>
+<a name="1006"><span class="lineNum"> 1006 </span> : : </a>
+<a name="1007"><span class="lineNum"> 1007 </span> : : /* Explicitly only support two sides */</a>
+<a name="1008"><span class="lineNum"> 1008 </span> :<span class="lineCov"> 22 : if (flash_side != 0 &amp;&amp; flash_side != 1) {</span></a>
+<a name="1009"><span class="lineNum"> 1009 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unexpected value for --side '%d'\n&quot;, flash_side);</span></a>
+<a name="1010"><span class="lineNum"> 1010 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1011"><span class="lineNum"> 1011 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1012"><span class="lineNum"> 1012 </span> : : }</a>
+<a name="1013"><span class="lineNum"> 1013 </span> : : </a>
+<a name="1014"><span class="lineNum"> 1014 </span> :<span class="lineCov"> 22 : if (ffs_toc_seen &amp;&amp; flash_side) {</span></a>
+<a name="1015"><span class="lineNum"> 1015 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;--toc and --side are exclusive&quot;);</span></a>
+<a name="1016"><span class="lineNum"> 1016 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1017"><span class="lineNum"> 1017 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1018"><span class="lineNum"> 1018 </span> : : }</a>
+<a name="1019"><span class="lineNum"> 1019 </span> : : </a>
+<a name="1020"><span class="lineNum"> 1020 </span> :<span class="lineCov"> 22 : if (flashfilename &amp;&amp; bmc_flash) {</span></a>
+<a name="1021"><span class="lineNum"> 1021 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Filename or bmc flash but not both\n&quot;);</span></a>
+<a name="1022"><span class="lineNum"> 1022 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1023"><span class="lineNum"> 1023 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1024"><span class="lineNum"> 1024 </span> : : }</a>
+<a name="1025"><span class="lineNum"> 1025 </span> : : </a>
+<a name="1026"><span class="lineNum"> 1026 </span> :<span class="lineCov"> 22 : if (flashfilename &amp;&amp; direct) {</span></a>
+<a name="1027"><span class="lineNum"> 1027 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Filename or direct access but not both\n&quot;);</span></a>
+<a name="1028"><span class="lineNum"> 1028 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1029"><span class="lineNum"> 1029 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1030"><span class="lineNum"> 1030 </span> : : }</a>
+<a name="1031"><span class="lineNum"> 1031 </span> : : </a>
+<a name="1032"><span class="lineNum"> 1032 </span> :<span class="lineCov"> 22 : if (tune &amp;&amp; !direct) {</span></a>
+<a name="1033"><span class="lineNum"> 1033 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;It doesn't make sense to --tune without --direct\n&quot;);</span></a>
+<a name="1034"><span class="lineNum"> 1034 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1035"><span class="lineNum"> 1035 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1036"><span class="lineNum"> 1036 </span> : : }</a>
+<a name="1037"><span class="lineNum"> 1037 </span> : : </a>
+<a name="1038"><span class="lineNum"> 1038 </span> :<span class="lineCov"> 22 : if (direct) {</span></a>
+<a name="1039"><span class="lineNum"> 1039 </span> : : /* If -t is passed, then print a nice message */</a>
+<a name="1040"><span class="lineNum"> 1040 </span> :<span class="lineNoCov"> 0 : if (tune)</span></a>
+<a name="1041"><span class="lineNum"> 1041 </span> :<span class="lineNoCov"> 0 : printf(&quot;Flash and controller tuned\n&quot;);</span></a>
+<a name="1042"><span class="lineNum"> 1042 </span> : : </a>
+<a name="1043"><span class="lineNum"> 1043 </span> :<span class="lineNoCov"> 0 : if (arch_flash_access(NULL, bmc_flash ? BMC_DIRECT : PNOR_DIRECT) == ACCESS_INVAL) {</span></a>
+<a name="1044"><span class="lineNum"> 1044 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Can't access %s flash directly on this architecture\n&quot;,</span></a>
+<a name="1045"><span class="lineNum"> 1045 </span> :<span class="lineNoCov"> 0 : bmc_flash ? &quot;BMC&quot; : &quot;PNOR&quot;);</span></a>
+<a name="1046"><span class="lineNum"> 1046 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1047"><span class="lineNum"> 1047 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1048"><span class="lineNum"> 1048 </span> : : }</a>
+<a name="1049"><span class="lineNum"> 1049 </span> :<span class="lineCov"> 22 : } else if (!flashfilename) {</span></a>
+<a name="1050"><span class="lineNum"> 1050 </span> :<span class="lineNoCov"> 0 : if (arch_flash_access(NULL, bmc_flash ? BMC_MTD : PNOR_MTD) == ACCESS_INVAL) {</span></a>
+<a name="1051"><span class="lineNum"> 1051 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Can't access %s flash through MTD on this system\n&quot;,</span></a>
+<a name="1052"><span class="lineNum"> 1052 </span> :<span class="lineNoCov"> 0 : bmc_flash ? &quot;BMC&quot; : &quot;PNOR&quot;);</span></a>
+<a name="1053"><span class="lineNum"> 1053 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1054"><span class="lineNum"> 1054 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1055"><span class="lineNum"> 1055 </span> : : }</a>
+<a name="1056"><span class="lineNum"> 1056 </span> : : }</a>
+<a name="1057"><span class="lineNum"> 1057 </span> : : </a>
+<a name="1058"><span class="lineNum"> 1058 </span> :<span class="lineCov"> 22 : if (arch_flash_init(&amp;flash.bl, flashfilename, true)) {</span></a>
+<a name="1059"><span class="lineNum"> 1059 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't initialise architecture flash structures\n&quot;);</span></a>
+<a name="1060"><span class="lineNum"> 1060 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1061"><span class="lineNum"> 1061 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="1062"><span class="lineNum"> 1062 </span> : : }</a>
+<a name="1063"><span class="lineNum"> 1063 </span> : : </a>
+<a name="1064"><span class="lineNum"> 1064 </span> :<span class="lineCov"> 22 : rc = blocklevel_get_info(flash.bl, &amp;flash.name,</span></a>
+<a name="1065"><span class="lineNum"> 1065 </span> : : &amp;flash.total_size, &amp;flash.erase_granule);</a>
+<a name="1066"><span class="lineNum"> 1066 </span> :<span class="lineCov"> 22 : if (rc) {</span></a>
+<a name="1067"><span class="lineNum"> 1067 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Error %d getting flash info\n&quot;, rc);</span></a>
+<a name="1068"><span class="lineNum"> 1068 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1069"><span class="lineNum"> 1069 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1070"><span class="lineNum"> 1070 </span> : : }</a>
+<a name="1071"><span class="lineNum"> 1071 </span> : : </a>
+<a name="1072"><span class="lineNum"> 1072 </span> : : /* If file specified but not size, get size from file */</a>
+<a name="1073"><span class="lineNum"> 1073 </span> :<span class="lineCov"> 22 : if (write_file &amp;&amp; !write_size) {</span></a>
+<a name="1074"><span class="lineNum"> 1074 </span> :<span class="lineCov"> 2 : struct stat stbuf;</span></a>
+<a name="1075"><span class="lineNum"> 1075 </span> : : </a>
+<a name="1076"><span class="lineNum"> 1076 </span> :<span class="lineCov"> 2 : if (stat(write_file, &amp;stbuf)) {</span></a>
+<a name="1077"><span class="lineNum"> 1077 </span> :<span class="lineNoCov"> 0 : perror(&quot;Failed to get file size&quot;);</span></a>
+<a name="1078"><span class="lineNum"> 1078 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1079"><span class="lineNum"> 1079 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1080"><span class="lineNum"> 1080 </span> : : }</a>
+<a name="1081"><span class="lineNum"> 1081 </span> :<span class="lineCov"> 2 : write_size = stbuf.st_size;</span></a>
+<a name="1082"><span class="lineNum"> 1082 </span> : : }</a>
+<a name="1083"><span class="lineNum"> 1083 </span> : : </a>
+<a name="1084"><span class="lineNum"> 1084 </span> : : /* Only take ECC into account under some conditions later */</a>
+<a name="1085"><span class="lineNum"> 1085 </span> :<span class="lineCov"> 22 : write_size_minus_ecc = write_size;</span></a>
+<a name="1086"><span class="lineNum"> 1086 </span> : : </a>
+<a name="1087"><span class="lineNum"> 1087 </span> : : /* If read specified and no read_size, use flash size */</a>
+<a name="1088"><span class="lineNum"> 1088 </span> :<span class="lineCov"> 22 : if (do_read &amp;&amp; !read_size &amp;&amp; !part_name)</span></a>
+<a name="1089"><span class="lineNum"> 1089 </span> :<span class="lineNoCov"> 0 : read_size = flash.total_size;</span></a>
+<a name="1090"><span class="lineNum"> 1090 </span> : : </a>
+<a name="1091"><span class="lineNum"> 1091 </span> : : /* We have a partition, adjust read/write size if needed */</a>
+<a name="1092"><span class="lineNum"> 1092 </span> :<span class="lineCov"> 22 : if (part_name || print_detail) {</span></a>
+<a name="1093"><span class="lineNum"> 1093 </span> :<span class="lineCov"> 16 : uint32_t pstart, pmaxsz, pactsize;</span></a>
+<a name="1094"><span class="lineNum"> 1094 </span> :<span class="lineCov"> 16 : bool ecc, confirm;</span></a>
+<a name="1095"><span class="lineNum"> 1095 </span> : : </a>
+<a name="1096"><span class="lineNum"> 1096 </span> :<span class="lineCov"> 16 : if (ffs_toc_seen)</span></a>
+<a name="1097"><span class="lineNum"> 1097 </span> :<span class="lineNoCov"> 0 : ffsh = lookup_partition_at_toc(&amp;flash,</span></a>
+<a name="1098"><span class="lineNum"> 1098 </span> : : part_name, &amp;ffs_index);</a>
+<a name="1099"><span class="lineNum"> 1099 </span> : : else</a>
+<a name="1100"><span class="lineNum"> 1100 </span> :<span class="lineCov"> 16 : ffsh = lookup_partition_at_side(&amp;flash, flash_side,</span></a>
+<a name="1101"><span class="lineNum"> 1101 </span> : : part_name, &amp;ffs_index);</a>
+<a name="1102"><span class="lineNum"> 1102 </span> :<span class="lineCov"> 16 : if (!ffsh)</span></a>
+<a name="1103"><span class="lineNum"> 1103 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1104"><span class="lineNum"> 1104 </span> : : </a>
+<a name="1105"><span class="lineNum"> 1105 </span> :<span class="lineCov"> 16 : if (!part_name)</span></a>
+<a name="1106"><span class="lineNum"> 1106 </span> :<span class="lineCov"> 12 : ffs_index = detail_id;</span></a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : </a>
+<a name="1108"><span class="lineNum"> 1108 </span> :<span class="lineCov"> 16 : rc = ffs_part_info(ffsh, ffs_index, NULL,</span></a>
+<a name="1109"><span class="lineNum"> 1109 </span> : : &amp;pstart, &amp;pmaxsz, &amp;pactsize, &amp;ecc);</a>
+<a name="1110"><span class="lineNum"> 1110 </span> :<span class="lineCov"> 16 : if (rc) {</span></a>
+<a name="1111"><span class="lineNum"> 1111 </span> :<span class="lineNoCov"> 0 : fprintf(stderr,&quot;Failed to get partition info\n&quot;);</span></a>
+<a name="1112"><span class="lineNum"> 1112 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1113"><span class="lineNum"> 1113 </span> : : }</a>
+<a name="1114"><span class="lineNum"> 1114 </span> : : </a>
+<a name="1115"><span class="lineNum"> 1115 </span> :<span class="lineCov"> 16 : if (!ecc &amp;&amp; do_clear) {</span></a>
+<a name="1116"><span class="lineNum"> 1116 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;The partition on which to do --clear &quot;</span></a>
+<a name="1117"><span class="lineNum"> 1117 </span> : : &quot;does not have ECC, are you sure?\n&quot;);</a>
+<a name="1118"><span class="lineNum"> 1118 </span> :<span class="lineNoCov"> 0 : confirm = check_confirm();</span></a>
+<a name="1119"><span class="lineNum"> 1119 </span> :<span class="lineNoCov"> 0 : if (!confirm) {</span></a>
+<a name="1120"><span class="lineNum"> 1120 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="1121"><span class="lineNum"> 1121 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1122"><span class="lineNum"> 1122 </span> : : }</a>
+<a name="1123"><span class="lineNum"> 1123 </span> : : /* Still confirm later on */</a>
+<a name="1124"><span class="lineNum"> 1124 </span> :<span class="lineNoCov"> 0 : must_confirm = true;</span></a>
+<a name="1125"><span class="lineNum"> 1125 </span> : : }</a>
+<a name="1126"><span class="lineNum"> 1126 </span> : : </a>
+<a name="1127"><span class="lineNum"> 1127 </span> : : /* Read size is obtained from partition &quot;actual&quot; size */</a>
+<a name="1128"><span class="lineNum"> 1128 </span> :<span class="lineCov"> 16 : if (!read_size)</span></a>
+<a name="1129"><span class="lineNum"> 1129 </span> :<span class="lineCov"> 16 : read_size = pactsize;</span></a>
+<a name="1130"><span class="lineNum"> 1130 </span> : : /* If we're decoding ecc and partition is ECC'd, then adjust */</a>
+<a name="1131"><span class="lineNum"> 1131 </span> :<span class="lineCov"> 16 : if (ecc &amp;&amp; flash.mark_ecc)</span></a>
+<a name="1132"><span class="lineNum"> 1132 </span> :<span class="lineNoCov"> 0 : read_size = ecc_buffer_size_minus_ecc(read_size);</span></a>
+<a name="1133"><span class="lineNum"> 1133 </span> : : </a>
+<a name="1134"><span class="lineNum"> 1134 </span> : : /* Write size is max size of partition */</a>
+<a name="1135"><span class="lineNum"> 1135 </span> :<span class="lineCov"> 16 : if (!write_size)</span></a>
+<a name="1136"><span class="lineNum"> 1136 </span> :<span class="lineCov"> 14 : write_size = pmaxsz;</span></a>
+<a name="1137"><span class="lineNum"> 1137 </span> : : </a>
+<a name="1138"><span class="lineNum"> 1138 </span> : : /* But write size can take into account ECC as well */</a>
+<a name="1139"><span class="lineNum"> 1139 </span> :<span class="lineCov"> 16 : if (ecc &amp;&amp; flash.mark_ecc)</span></a>
+<a name="1140"><span class="lineNum"> 1140 </span> :<span class="lineNoCov"> 0 : write_size_minus_ecc = ecc_buffer_size_minus_ecc(write_size);</span></a>
+<a name="1141"><span class="lineNum"> 1141 </span> : : else</a>
+<a name="1142"><span class="lineNum"> 1142 </span> : : write_size_minus_ecc = write_size;</a>
+<a name="1143"><span class="lineNum"> 1143 </span> : : </a>
+<a name="1144"><span class="lineNum"> 1144 </span> : : /* Crop write size to partition size if --force was passed */</a>
+<a name="1145"><span class="lineNum"> 1145 </span> :<span class="lineCov"> 16 : if ((write_size_minus_ecc &gt; pmaxsz) &amp;&amp; !must_confirm) {</span></a>
+<a name="1146"><span class="lineNum"> 1146 </span> :<span class="lineNoCov"> 0 : printf(&quot;WARNING: Size (%d bytes) larger than partition&quot;</span></a>
+<a name="1147"><span class="lineNum"> 1147 </span> : : &quot; (%d bytes), cropping to fit\n&quot;,</a>
+<a name="1148"><span class="lineNum"> 1148 </span> : : write_size, pmaxsz);</a>
+<a name="1149"><span class="lineNum"> 1149 </span> :<span class="lineNoCov"> 0 : write_size = pmaxsz;</span></a>
+<a name="1150"><span class="lineNum"> 1150 </span> :<span class="lineCov"> 16 : } else if (write_size_minus_ecc &gt; pmaxsz) {</span></a>
+<a name="1151"><span class="lineNum"> 1151 </span> :<span class="lineNoCov"> 0 : printf(&quot;ERROR: Size (%d bytes) larger than partition&quot;</span></a>
+<a name="1152"><span class="lineNum"> 1152 </span> : : &quot; (%d bytes). Use --force to force\n&quot;,</a>
+<a name="1153"><span class="lineNum"> 1153 </span> : : write_size, pmaxsz);</a>
+<a name="1154"><span class="lineNum"> 1154 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1155"><span class="lineNum"> 1155 </span> : : }</a>
+<a name="1156"><span class="lineNum"> 1156 </span> : : </a>
+<a name="1157"><span class="lineNum"> 1157 </span> : : /* Set address */</a>
+<a name="1158"><span class="lineNum"> 1158 </span> :<span class="lineCov"> 16 : address = pstart;</span></a>
+<a name="1159"><span class="lineNum"> 1159 </span> :<span class="lineCov"> 6 : } else if (erase) {</span></a>
+<a name="1160"><span class="lineNum"> 1160 </span> :<span class="lineCov"> 4 : if ((address | write_size) &amp; (flash.erase_granule - 1)) {</span></a>
+<a name="1161"><span class="lineNum"> 1161 </span> :<span class="lineNoCov"> 0 : if (must_confirm) {</span></a>
+<a name="1162"><span class="lineNum"> 1162 </span> :<span class="lineNoCov"> 0 : printf(&quot;ERROR: Erase at 0x%08x for 0x%08x isn't erase block aligned\n&quot;,</span></a>
+<a name="1163"><span class="lineNum"> 1163 </span> : : address, write_size);</a>
+<a name="1164"><span class="lineNum"> 1164 </span> :<span class="lineNoCov"> 0 : printf(&quot;Use --force to force\n&quot;);</span></a>
+<a name="1165"><span class="lineNum"> 1165 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1166"><span class="lineNum"> 1166 </span> : : } else {</a>
+<a name="1167"><span class="lineNum"> 1167 </span> :<span class="lineNoCov"> 0 : printf(&quot;WARNING: Erase at 0x%08x for 0x%08x isn't erase block aligned\n&quot;,</span></a>
+<a name="1168"><span class="lineNum"> 1168 </span> : : address, write_size);</a>
+<a name="1169"><span class="lineNum"> 1169 </span> : : }</a>
+<a name="1170"><span class="lineNum"> 1170 </span> : : }</a>
+<a name="1171"><span class="lineNum"> 1171 </span> : : }</a>
+<a name="1172"><span class="lineNum"> 1172 </span> : : </a>
+<a name="1173"><span class="lineNum"> 1173 </span> : : /* Process commands */</a>
+<a name="1174"><span class="lineNum"> 1174 </span> : : </a>
+<a name="1175"><span class="lineNum"> 1175 </span> : : /* Both enable and disable can't be set (we've checked) */</a>
+<a name="1176"><span class="lineNum"> 1176 </span> :<span class="lineCov"> 22 : if (enable_4B)</span></a>
+<a name="1177"><span class="lineNum"> 1177 </span> :<span class="lineNoCov"> 0 : rc = enable_4B_addresses(flash.bl);</span></a>
+<a name="1178"><span class="lineNum"> 1178 </span> :<span class="lineCov"> 22 : if (disable_4B)</span></a>
+<a name="1179"><span class="lineNum"> 1179 </span> :<span class="lineNoCov"> 0 : rc = disable_4B_addresses(flash.bl);</span></a>
+<a name="1180"><span class="lineNum"> 1180 </span> :<span class="lineCov"> 22 : if (rc)</span></a>
+<a name="1181"><span class="lineNum"> 1181 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1182"><span class="lineNum"> 1182 </span> : : </a>
+<a name="1183"><span class="lineNum"> 1183 </span> :<span class="lineCov"> 22 : if (info) {</span></a>
+<a name="1184"><span class="lineNum"> 1184 </span> : : /*</a>
+<a name="1185"><span class="lineNum"> 1185 </span> : : * Don't pass through modfied TOC value if the modification was done</a>
+<a name="1186"><span class="lineNum"> 1186 </span> : : * because of --size, but still respect if it came from --toc (we</a>
+<a name="1187"><span class="lineNum"> 1187 </span> : : * assume the user knows what they're doing in that case)</a>
+<a name="1188"><span class="lineNum"> 1188 </span> : : */</a>
+<a name="1189"><span class="lineNum"> 1189 </span> :<span class="lineCov"> 2 : print_flash_info(&amp;flash);</span></a>
+<a name="1190"><span class="lineNum"> 1190 </span> : : }</a>
+<a name="1191"><span class="lineNum"> 1191 </span> : : </a>
+<a name="1192"><span class="lineNum"> 1192 </span> :<span class="lineCov"> 22 : if (print_detail)</span></a>
+<a name="1193"><span class="lineNum"> 1193 </span> :<span class="lineCov"> 12 : print_partition_detail(ffsh, ffs_index);</span></a>
+<a name="1194"><span class="lineNum"> 1194 </span> : : </a>
+<a name="1195"><span class="lineNum"> 1195 </span> : : /* Unlock flash (PNOR only) */</a>
+<a name="1196"><span class="lineNum"> 1196 </span> :<span class="lineCov"> 22 : if ((erase || program || do_clear) &amp;&amp; !bmc_flash &amp;&amp; !flashfilename) {</span></a>
+<a name="1197"><span class="lineNum"> 1197 </span> :<span class="lineNoCov"> 0 : flash.need_relock = arch_flash_set_wrprotect(flash.bl, false);</span></a>
+<a name="1198"><span class="lineNum"> 1198 </span> :<span class="lineNoCov"> 0 : if (flash.need_relock == -1) {</span></a>
+<a name="1199"><span class="lineNum"> 1199 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Architecture doesn't support write protection on flash\n&quot;);</span></a>
+<a name="1200"><span class="lineNum"> 1200 </span> :<span class="lineNoCov"> 0 : flash.need_relock = 0;</span></a>
+<a name="1201"><span class="lineNum"> 1201 </span> :<span class="lineNoCov"> 0 : goto close;</span></a>
+<a name="1202"><span class="lineNum"> 1202 </span> : : }</a>
+<a name="1203"><span class="lineNum"> 1203 </span> : : }</a>
+<a name="1204"><span class="lineNum"> 1204 </span> :<span class="lineCov"> 22 : rc = 0;</span></a>
+<a name="1205"><span class="lineNum"> 1205 </span> :<span class="lineCov"> 22 : if (do_read)</span></a>
+<a name="1206"><span class="lineNum"> 1206 </span> :<span class="lineNoCov"> 0 : rc = do_read_file(flash.bl, read_file, address, read_size, skip_size);</span></a>
+<a name="1207"><span class="lineNum"> 1207 </span> :<span class="lineCov"> 22 : if (!rc &amp;&amp; erase_all)</span></a>
+<a name="1208"><span class="lineNum"> 1208 </span> :<span class="lineCov"> 2 : rc = erase_chip(&amp;flash);</span></a>
+<a name="1209"><span class="lineNum"> 1209 </span> :<span class="lineCov"> 20 : else if (!rc &amp;&amp; erase)</span></a>
+<a name="1210"><span class="lineNum"> 1210 </span> :<span class="lineCov"> 6 : rc = erase_range(&amp;flash, address, write_size,</span></a>
+<a name="1211"><span class="lineNum"> 1211 </span> : : program, ffsh, ffs_index);</a>
+<a name="1212"><span class="lineNum"> 1212 </span> :<span class="lineCov"> 22 : if (!rc &amp;&amp; program)</span></a>
+<a name="1213"><span class="lineNum"> 1213 </span> :<span class="lineCov"> 4 : rc = program_file(flash.bl, write_file, address, write_size_minus_ecc,</span></a>
+<a name="1214"><span class="lineNum"> 1214 </span> : : ffsh, ffs_index);</a>
+<a name="1215"><span class="lineNum"> 1215 </span> :<span class="lineCov"> 22 : if (!rc &amp;&amp; do_clear)</span></a>
+<a name="1216"><span class="lineNum"> 1216 </span> :<span class="lineNoCov"> 0 : rc = set_ecc(&amp;flash, address, write_size);</span></a>
+<a name="1217"><span class="lineNum"> 1217 </span> : : </a>
+<a name="1218"><span class="lineNum"> 1218 </span> :<span class="lineCov"> 22 : close:</span></a>
+<a name="1219"><span class="lineNum"> 1219 </span> :<span class="lineCov"> 22 : if (flash.need_relock)</span></a>
+<a name="1220"><span class="lineNum"> 1220 </span> :<span class="lineNoCov"> 0 : arch_flash_set_wrprotect(flash.bl, 1);</span></a>
+<a name="1221"><span class="lineNum"> 1221 </span> :<span class="lineCov"> 22 : arch_flash_close(flash.bl, flashfilename);</span></a>
+<a name="1222"><span class="lineNum"> 1222 </span> :<span class="lineCov"> 22 : if (ffsh)</span></a>
+<a name="1223"><span class="lineNum"> 1223 </span> :<span class="lineCov"> 16 : ffs_close(ffsh);</span></a>
+<a name="1224"><span class="lineNum"> 1224 </span> :<span class="lineCov"> 6 : out:</span></a>
+<a name="1225"><span class="lineNum"> 1225 </span> :<span class="lineCov"> 26 : free(part_name);</span></a>
+<a name="1226"><span class="lineNum"> 1226 </span> :<span class="lineCov"> 26 : free(read_file);</span></a>
+<a name="1227"><span class="lineNum"> 1227 </span> :<span class="lineCov"> 26 : free(write_file);</span></a>
+<a name="1228"><span class="lineNum"> 1228 </span> : : </a>
+<a name="1229"><span class="lineNum"> 1229 </span> :<span class="lineCov"> 26 : return rc;</span></a>
+<a name="1230"><span class="lineNum"> 1230 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/progress.c.func-sort-c.html b/coverage-report/external/pflash/progress.c.func-sort-c.html
new file mode 100644
index 0000000..c228464
--- /dev/null
+++ b/coverage-report/external/pflash/progress.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/progress.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/pflash</a> - progress.c<span style="font-size: 80%;"> (<a href="progress.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntryMed">76.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="progress.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="progress.c.gcov.html#87">progress_end</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="progress.c.gcov.html#24">progress_init</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="progress.c.gcov.html#40">progress_tick</a></td>
+ <td class="coverFnHi">6666</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/progress.c.func.html b/coverage-report/external/pflash/progress.c.func.html
new file mode 100644
index 0000000..9fa9e57
--- /dev/null
+++ b/coverage-report/external/pflash/progress.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/progress.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/pflash</a> - progress.c<span style="font-size: 80%;"> (<a href="progress.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntryMed">76.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="progress.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="progress.c.gcov.html#87">progress_end</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="progress.c.gcov.html#24">progress_init</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="progress.c.gcov.html#40">progress_tick</a></td>
+ <td class="coverFnHi">6666</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/pflash/progress.c.gcov.html b/coverage-report/external/pflash/progress.c.gcov.html
new file mode 100644
index 0000000..ff8d548
--- /dev/null
+++ b/coverage-report/external/pflash/progress.c.gcov.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/pflash/progress.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/pflash</a> - progress.c<span style="font-size: 80%;"> (source / <a href="progress.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntryMed">76.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * The most important part of pflash, the progress bars</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2014-2017 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;limits.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;time.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;progress.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : static uint64_t progress_max;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : static uint64_t progress_pcent;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : static uint64_t progress_n_upd;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : static time_t progress_prevsec;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : static struct timespec progress_start;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define PROGRESS_CHARS 50</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 12 : void progress_init(uint64_t count)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 12 : unsigned int i;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 12 : progress_max = count;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 12 : progress_pcent = 0;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 12 : progress_n_upd = ULONG_MAX;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 12 : progress_prevsec = ULONG_MAX;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 12 : printf(&quot;\r[&quot;);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 624 : for (i = 0; i &lt; PROGRESS_CHARS; i++)</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 600 : printf(&quot; &quot;);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 12 : printf(&quot;] 0%%&quot;);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 12 : fflush(stdout);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 12 : clock_gettime(CLOCK_MONOTONIC, &amp;progress_start);}</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 6666 : void progress_tick(uint64_t cur)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 6666 : unsigned int i, pos;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 6666 : struct timespec now;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 6666 : uint64_t pcent;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 6666 : double sec;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 6666 : pcent = (cur * 100) / progress_max;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 6666 : if (progress_pcent == pcent &amp;&amp; cur &lt; progress_n_upd &amp;&amp;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : cur &lt; progress_max)</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 5864 : return;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 802 : progress_pcent = pcent;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 802 : pos = (pcent * PROGRESS_CHARS) / 101;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 802 : clock_gettime(CLOCK_MONOTONIC, &amp;now);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 802 : printf(&quot;\r[&quot;);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 22104 : for (i = 0; i &lt;= pos; i++)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 20500 : printf(&quot;=&quot;);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 20402 : for (; i &lt; PROGRESS_CHARS; i++)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 19600 : printf(&quot; &quot;);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 802 : printf(&quot;] %&quot; PRIu64 &quot;%%&quot;, pcent);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 802 : sec = difftime(now.tv_sec, progress_start.tv_sec);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 802 : if (sec &gt;= 5 &amp;&amp; pcent &gt; 0) {</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : uint64_t persec = cur / sec;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : uint64_t rem_sec;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : if (!persec)</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : persec = 1;</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : progress_n_upd = cur + persec;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : rem_sec = ((sec * 100) + (pcent / 2)) / pcent - sec;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : if (rem_sec &gt; progress_prevsec)</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : rem_sec = progress_prevsec;</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : progress_prevsec = rem_sec;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : if (rem_sec &lt; 60)</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : printf(&quot; ETA:%&quot; PRIu64 &quot;s &quot;, rem_sec);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : else {</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : printf(&quot; ETA:%&quot; PRIu64 &quot;:%02&quot; PRIu64 &quot;:%02&quot; PRIu64 &quot; &quot;,</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : rem_sec / 3600,</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : (rem_sec / 60) % 60,</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : rem_sec % 60);</a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 802 : fflush(stdout);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 12 : void progress_end(void)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 12 : printf(&quot;\n&quot;);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 12 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/trace/index-sort-b.html b/coverage-report/external/trace/index-sort-b.html
new file mode 100644
index 0000000..81dbc95
--- /dev/null
+++ b/coverage-report/external/trace/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/trace</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/trace</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/trace/index-sort-f.html b/coverage-report/external/trace/index-sort-f.html
new file mode 100644
index 0000000..94603be
--- /dev/null
+++ b/coverage-report/external/trace/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/trace</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/trace</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/trace/index-sort-l.html b/coverage-report/external/trace/index-sort-l.html
new file mode 100644
index 0000000..5458afc
--- /dev/null
+++ b/coverage-report/external/trace/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/trace</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/trace</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/trace/index.html b/coverage-report/external/trace/index.html
new file mode 100644
index 0000000..a13532b
--- /dev/null
+++ b/coverage-report/external/trace/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/trace</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - external/trace</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="trace.c.gcov.html">trace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/trace/trace.c.func-sort-c.html b/coverage-report/external/trace/trace.c.func-sort-c.html
new file mode 100644
index 0000000..a40c01c
--- /dev/null
+++ b/coverage-report/external/trace/trace.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/trace/trace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/trace</a> - trace.c<span style="font-size: 80%;"> (<a href="trace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="trace.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#45">trace_get</a></td>
+ <td class="coverFnHi">4050209</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#19">trace_empty</a></td>
+ <td class="coverFnHi">4050213</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/trace/trace.c.func.html b/coverage-report/external/trace/trace.c.func.html
new file mode 100644
index 0000000..c76ae09
--- /dev/null
+++ b/coverage-report/external/trace/trace.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/trace/trace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/trace</a> - trace.c<span style="font-size: 80%;"> (<a href="trace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="trace.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#19">trace_empty</a></td>
+ <td class="coverFnHi">4050213</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="trace.c.gcov.html#45">trace_get</a></td>
+ <td class="coverFnHi">4050209</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/external/trace/trace.c.gcov.html b/coverage-report/external/trace/trace.c.gcov.html
new file mode 100644
index 0000000..cf2d055
--- /dev/null
+++ b/coverage-report/external/trace/trace.c.gcov.html
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - external/trace/trace.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">external/trace</a> - trace.c<span style="font-size: 80%;"> (source / <a href="trace.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This example code shows how to read from the trace buffer.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;external/trace/trace.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;../ccan/endian/endian.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;../ccan/short_types/short_types.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;trace.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;trace_types.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;errno.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #if defined(__powerpc__) || defined(__powerpc64__)</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define rmb() lwsync()</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #else</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define rmb()</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #endif</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 4050213 : bool trace_empty(const struct trace_reader *tr)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : const struct trace_repeat *rep;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 4050213 : if (tr-&gt;rpos == be64_to_cpu(tr-&gt;tb-&gt;end))</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 6597 : return true;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : /*</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * If we have a single element only, and it's a repeat buffer</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * we've already seen every repeat for (yet which may be</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * incremented in future), we're also empty.</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 4043616 : rep = (void *)tr-&gt;tb-&gt;buf + tr-&gt;rpos % be64_to_cpu(tr-&gt;tb-&gt;buf_size);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 4043616 : if (be64_to_cpu(tr-&gt;tb-&gt;end) != tr-&gt;rpos + sizeof(*rep))</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1950756 : return false;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 2092860 : if (rep-&gt;type != TRACE_REPEAT)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 8 : return false;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 2092852 : if (be16_to_cpu(rep-&gt;num) != tr-&gt;last_repeat)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1046427 : return false;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1046425 : return true;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : }</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : /* You can't read in parallel, so some locking required in caller. */</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 4050209 : bool trace_get(union trace *t, struct trace_reader *tr)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : {</a>
+<a name="49"><span class="lineNum"> 49 </span> : : u64 start, rpos;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : size_t len;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 8100418 : len = sizeof(*t) &lt; be32_to_cpu(tr-&gt;tb-&gt;max_size) ? sizeof(*t) :</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 4050209 : be32_to_cpu(tr-&gt;tb-&gt;max_size);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 4050209 : if (trace_empty(tr))</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1053018 : return false;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 2997191 : again:</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : /*</a>
+<a name="60"><span class="lineNum"> 60 </span> : : * The actual buffer is slightly larger than tbsize, so this</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * memcpy is always valid.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : */</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 3721143 : memcpy(t, tr-&gt;tb-&gt;buf + tr-&gt;rpos % be64_to_cpu(tr-&gt;tb-&gt;buf_size), len);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : rmb(); /* read barrier, so we read tr-&gt;tb-&gt;start after copying record. */</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 3721143 : start = be64_to_cpu(tr-&gt;tb-&gt;start);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 3721143 : rpos = tr-&gt;rpos;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* Now, was that overwritten? */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 3721143 : if (rpos &lt; start) {</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : /* Create overflow record. */</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 45 : t-&gt;overflow.unused64 = 0;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 45 : t-&gt;overflow.type = TRACE_OVERFLOW;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 45 : t-&gt;overflow.len_div_8 = sizeof(t-&gt;overflow) / 8;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 45 : t-&gt;overflow.bytes_missed = cpu_to_be64(start - rpos);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 45 : tr-&gt;rpos = start;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 45 : return true;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : /* Repeat entries need special handling */</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 3721098 : if (t-&gt;hdr.type == TRACE_REPEAT) {</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 2494316 : u32 num = be16_to_cpu(t-&gt;repeat.num);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> : : /* In case we've read some already... */</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 2494316 : t-&gt;repeat.num = cpu_to_be16(num - tr-&gt;last_repeat);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* Record how many repeats we saw this time. */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 2494316 : tr-&gt;last_repeat = num;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : /* Don't report an empty repeat buffer. */</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 2494316 : if (t-&gt;repeat.num == 0) {</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : /*</a>
+<a name="94"><span class="lineNum"> 94 </span> : : * This can't be the last buffer, otherwise</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * trace_empty would have returned true.</a>
+<a name="96"><span class="lineNum"> 96 </span> : : */</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 723952 : assert(be64_to_cpu(tr-&gt;tb-&gt;end) &gt;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : rpos + t-&gt;hdr.len_div_8 * 8);</a>
+<a name="99"><span class="lineNum"> 99 </span> : : /* Skip to next entry. */</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 723952 : tr-&gt;rpos = rpos + t-&gt;hdr.len_div_8 * 8;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 723952 : tr-&gt;last_repeat = 0;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 723952 : goto again;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : } else {</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1226782 : tr-&gt;last_repeat = 0;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1226782 : tr-&gt;rpos = rpos + t-&gt;hdr.len_div_8 * 8;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : }</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 2997146 : return true;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/gcov.css b/coverage-report/gcov.css
new file mode 100644
index 0000000..bfd0a83
--- /dev/null
+++ b/coverage-report/gcov.css
@@ -0,0 +1,519 @@
+/* All views: initial background and text color */
+body
+{
+ color: #000000;
+ background-color: #FFFFFF;
+}
+
+/* All views: standard link format*/
+a:link
+{
+ color: #284FA8;
+ text-decoration: underline;
+}
+
+/* All views: standard link - visited format */
+a:visited
+{
+ color: #00CB40;
+ text-decoration: underline;
+}
+
+/* All views: standard link - activated format */
+a:active
+{
+ color: #FF0040;
+ text-decoration: underline;
+}
+
+/* All views: main title format */
+td.title
+{
+ text-align: center;
+ padding-bottom: 10px;
+ font-family: sans-serif;
+ font-size: 20pt;
+ font-style: italic;
+ font-weight: bold;
+}
+
+/* All views: header item format */
+td.headerItem
+{
+ text-align: right;
+ padding-right: 6px;
+ font-family: sans-serif;
+ font-weight: bold;
+ vertical-align: top;
+ white-space: nowrap;
+}
+
+/* All views: header item value format */
+td.headerValue
+{
+ text-align: left;
+ color: #284FA8;
+ font-family: sans-serif;
+ font-weight: bold;
+ white-space: nowrap;
+}
+
+/* All views: header item coverage table heading */
+td.headerCovTableHead
+{
+ text-align: center;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-bottom: 0px;
+ font-family: sans-serif;
+ font-size: 80%;
+ white-space: nowrap;
+}
+
+/* All views: header item coverage table entry */
+td.headerCovTableEntry
+{
+ text-align: right;
+ color: #284FA8;
+ font-family: sans-serif;
+ font-weight: bold;
+ white-space: nowrap;
+ padding-left: 12px;
+ padding-right: 4px;
+ background-color: #DAE7FE;
+}
+
+/* All views: header item coverage table entry for high coverage rate */
+td.headerCovTableEntryHi
+{
+ text-align: right;
+ color: #000000;
+ font-family: sans-serif;
+ font-weight: bold;
+ white-space: nowrap;
+ padding-left: 12px;
+ padding-right: 4px;
+ background-color: #A7FC9D;
+}
+
+/* All views: header item coverage table entry for medium coverage rate */
+td.headerCovTableEntryMed
+{
+ text-align: right;
+ color: #000000;
+ font-family: sans-serif;
+ font-weight: bold;
+ white-space: nowrap;
+ padding-left: 12px;
+ padding-right: 4px;
+ background-color: #FFEA20;
+}
+
+/* All views: header item coverage table entry for ow coverage rate */
+td.headerCovTableEntryLo
+{
+ text-align: right;
+ color: #000000;
+ font-family: sans-serif;
+ font-weight: bold;
+ white-space: nowrap;
+ padding-left: 12px;
+ padding-right: 4px;
+ background-color: #FF0000;
+}
+
+/* All views: header legend value for legend entry */
+td.headerValueLeg
+{
+ text-align: left;
+ color: #000000;
+ font-family: sans-serif;
+ font-size: 80%;
+ white-space: nowrap;
+ padding-top: 4px;
+}
+
+/* All views: color of horizontal ruler */
+td.ruler
+{
+ background-color: #6688D4;
+}
+
+/* All views: version string format */
+td.versionInfo
+{
+ text-align: center;
+ padding-top: 2px;
+ font-family: sans-serif;
+ font-style: italic;
+}
+
+/* Directory view/File view (all)/Test case descriptions:
+ table headline format */
+td.tableHead
+{
+ text-align: center;
+ color: #FFFFFF;
+ background-color: #6688D4;
+ font-family: sans-serif;
+ font-size: 120%;
+ font-weight: bold;
+ white-space: nowrap;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+span.tableHeadSort
+{
+ padding-right: 4px;
+}
+
+/* Directory view/File view (all): filename entry format */
+td.coverFile
+{
+ text-align: left;
+ padding-left: 10px;
+ padding-right: 20px;
+ color: #284FA8;
+ background-color: #DAE7FE;
+ font-family: monospace;
+}
+
+/* Directory view/File view (all): bar-graph entry format*/
+td.coverBar
+{
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #DAE7FE;
+}
+
+/* Directory view/File view (all): bar-graph outline color */
+td.coverBarOutline
+{
+ background-color: #000000;
+}
+
+/* Directory view/File view (all): percentage entry for files with
+ high coverage rate */
+td.coverPerHi
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #A7FC9D;
+ font-weight: bold;
+ font-family: sans-serif;
+}
+
+/* Directory view/File view (all): line count entry for files with
+ high coverage rate */
+td.coverNumHi
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #A7FC9D;
+ white-space: nowrap;
+ font-family: sans-serif;
+}
+
+/* Directory view/File view (all): percentage entry for files with
+ medium coverage rate */
+td.coverPerMed
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #FFEA20;
+ font-weight: bold;
+ font-family: sans-serif;
+}
+
+/* Directory view/File view (all): line count entry for files with
+ medium coverage rate */
+td.coverNumMed
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #FFEA20;
+ white-space: nowrap;
+ font-family: sans-serif;
+}
+
+/* Directory view/File view (all): percentage entry for files with
+ low coverage rate */
+td.coverPerLo
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #FF0000;
+ font-weight: bold;
+ font-family: sans-serif;
+}
+
+/* Directory view/File view (all): line count entry for files with
+ low coverage rate */
+td.coverNumLo
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #FF0000;
+ white-space: nowrap;
+ font-family: sans-serif;
+}
+
+/* File view (all): "show/hide details" link format */
+a.detail:link
+{
+ color: #B8D0FF;
+ font-size:80%;
+}
+
+/* File view (all): "show/hide details" link - visited format */
+a.detail:visited
+{
+ color: #B8D0FF;
+ font-size:80%;
+}
+
+/* File view (all): "show/hide details" link - activated format */
+a.detail:active
+{
+ color: #FFFFFF;
+ font-size:80%;
+}
+
+/* File view (detail): test name entry */
+td.testName
+{
+ text-align: right;
+ padding-right: 10px;
+ background-color: #DAE7FE;
+ font-family: sans-serif;
+}
+
+/* File view (detail): test percentage entry */
+td.testPer
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #DAE7FE;
+ font-family: sans-serif;
+}
+
+/* File view (detail): test lines count entry */
+td.testNum
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #DAE7FE;
+ font-family: sans-serif;
+}
+
+/* Test case descriptions: test name format*/
+dt
+{
+ font-family: sans-serif;
+ font-weight: bold;
+}
+
+/* Test case descriptions: description table body */
+td.testDescription
+{
+ padding-top: 10px;
+ padding-left: 30px;
+ padding-bottom: 10px;
+ padding-right: 30px;
+ background-color: #DAE7FE;
+}
+
+/* Source code view: function entry */
+td.coverFn
+{
+ text-align: left;
+ padding-left: 10px;
+ padding-right: 20px;
+ color: #284FA8;
+ background-color: #DAE7FE;
+ font-family: monospace;
+}
+
+/* Source code view: function entry zero count*/
+td.coverFnLo
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #FF0000;
+ font-weight: bold;
+ font-family: sans-serif;
+}
+
+/* Source code view: function entry nonzero count*/
+td.coverFnHi
+{
+ text-align: right;
+ padding-left: 10px;
+ padding-right: 10px;
+ background-color: #DAE7FE;
+ font-weight: bold;
+ font-family: sans-serif;
+}
+
+/* Source code view: source code format */
+pre.source
+{
+ font-family: monospace;
+ white-space: pre;
+ margin-top: 2px;
+}
+
+/* Source code view: line number format */
+span.lineNum
+{
+ background-color: #EFE383;
+}
+
+/* Source code view: format for lines which were executed */
+td.lineCov,
+span.lineCov
+{
+ background-color: #CAD7FE;
+}
+
+/* Source code view: format for Cov legend */
+span.coverLegendCov
+{
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 2px;
+ background-color: #CAD7FE;
+}
+
+/* Source code view: format for lines which were not executed */
+td.lineNoCov,
+span.lineNoCov
+{
+ background-color: #FF6230;
+}
+
+/* Source code view: format for NoCov legend */
+span.coverLegendNoCov
+{
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 2px;
+ background-color: #FF6230;
+}
+
+/* Source code view (function table): standard link - visited format */
+td.lineNoCov > a:visited,
+td.lineCov > a:visited
+{
+ color: black;
+ text-decoration: underline;
+}
+
+/* Source code view: format for lines which were executed only in a
+ previous version */
+span.lineDiffCov
+{
+ background-color: #B5F7AF;
+}
+
+/* Source code view: format for branches which were executed
+ * and taken */
+span.branchCov
+{
+ background-color: #CAD7FE;
+}
+
+/* Source code view: format for branches which were executed
+ * but not taken */
+span.branchNoCov
+{
+ background-color: #FF6230;
+}
+
+/* Source code view: format for branches which were not executed */
+span.branchNoExec
+{
+ background-color: #FF6230;
+}
+
+/* Source code view: format for the source code heading line */
+pre.sourceHeading
+{
+ white-space: pre;
+ font-family: monospace;
+ font-weight: bold;
+ margin: 0px;
+}
+
+/* All views: header legend value for low rate */
+td.headerValueLegL
+{
+ font-family: sans-serif;
+ text-align: center;
+ white-space: nowrap;
+ padding-left: 4px;
+ padding-right: 2px;
+ background-color: #FF0000;
+ font-size: 80%;
+}
+
+/* All views: header legend value for med rate */
+td.headerValueLegM
+{
+ font-family: sans-serif;
+ text-align: center;
+ white-space: nowrap;
+ padding-left: 2px;
+ padding-right: 2px;
+ background-color: #FFEA20;
+ font-size: 80%;
+}
+
+/* All views: header legend value for hi rate */
+td.headerValueLegH
+{
+ font-family: sans-serif;
+ text-align: center;
+ white-space: nowrap;
+ padding-left: 2px;
+ padding-right: 4px;
+ background-color: #A7FC9D;
+ font-size: 80%;
+}
+
+/* All views except source code view: legend format for low coverage */
+span.coverLegendCovLo
+{
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 2px;
+ background-color: #FF0000;
+}
+
+/* All views except source code view: legend format for med coverage */
+span.coverLegendCovMed
+{
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 2px;
+ background-color: #FFEA20;
+}
+
+/* All views except source code view: legend format for hi coverage */
+span.coverLegendCovHi
+{
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 2px;
+ background-color: #A7FC9D;
+}
diff --git a/coverage-report/glass.png b/coverage-report/glass.png
new file mode 100644
index 0000000..e1abc00
--- /dev/null
+++ b/coverage-report/glass.png
Binary files differ
diff --git a/coverage-report/hdata/cpu-common.c.func-sort-c.html b/coverage-report/hdata/cpu-common.c.func-sort-c.html
new file mode 100644
index 0000000..931866a
--- /dev/null
+++ b/coverage-report/hdata/cpu-common.c.func-sort-c.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/cpu-common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - cpu-common.c<span style="font-size: 80%;"> (<a href="cpu-common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">96</td>
+ <td class="headerCovTableEntry">139</td>
+ <td class="headerCovTableEntryLo">69.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="cpu-common.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#290">find_l2_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#221">l35_cache_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#183">add_core_attr</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#298">add_core_cache_info</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#10">add_core_common</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#267">l2_cache_node</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#244">l3_cache_node</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#197">create_cache_node</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/cpu-common.c.func.html b/coverage-report/hdata/cpu-common.c.func.html
new file mode 100644
index 0000000..8cf9e7e
--- /dev/null
+++ b/coverage-report/hdata/cpu-common.c.func.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/cpu-common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - cpu-common.c<span style="font-size: 80%;"> (<a href="cpu-common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">96</td>
+ <td class="headerCovTableEntry">139</td>
+ <td class="headerCovTableEntryLo">69.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="cpu-common.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#183">add_core_attr</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#298">add_core_cache_info</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#10">add_core_common</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#197">create_cache_node</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#290">find_l2_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#267">l2_cache_node</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#221">l35_cache_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="cpu-common.c.gcov.html#244">l3_cache_node</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/cpu-common.c.gcov.html b/coverage-report/hdata/cpu-common.c.gcov.html
new file mode 100644
index 0000000..f978b35
--- /dev/null
+++ b/coverage-report/hdata/cpu-common.c.gcov.html
@@ -0,0 +1,421 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/cpu-common.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - cpu-common.c<span style="font-size: 80%;"> (source / <a href="cpu-common.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">96</td>
+ <td class="headerCovTableEntry">139</td>
+ <td class="headerCovTableEntryLo">69.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;spira.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;device.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 26 : struct dt_node * add_core_common(struct dt_node *cpus,</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : const struct sppcia_cpu_cache *cache,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : const struct sppcia_cpu_timebase *tb,</a>
+<a name="15"><span class="lineNum"> 15 </span> : : uint32_t int_server, bool okay)</a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : const char *name;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : struct dt_node *cpu;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : uint32_t version;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : uint64_t freq;</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 26 : const uint8_t pa_features_p8[] = {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : 24, 0,</a>
+<a name="23"><span class="lineNum"> 23 </span> : : 0xf6, 0x3f, 0xc7, 0xc0, 0x80, 0xd0, 0x80, 0x00,</a>
+<a name="24"><span class="lineNum"> 24 </span> : : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,</a>
+<a name="26"><span class="lineNum"> 26 </span> : : };</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 26 : const uint8_t pa_features_p9n_dd20[] = {</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : 64, 0,</a>
+<a name="29"><span class="lineNum"> 29 </span> : : 0xf6, 0x3f, 0xc7, 0xc0, 0x80, 0xd0, 0x80, 0x00, /* 0 .. 7 */</a>
+<a name="30"><span class="lineNum"> 30 </span> : : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 8 .. 15 */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* 16 .. 23 */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* 24 .. 31 */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, /* 32 .. 39 */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 40 .. 47 */</a>
+<a name="35"><span class="lineNum"> 35 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 48 .. 55 */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 56 .. 63 */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : };</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 26 : const uint8_t pa_features_p9[] = {</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : 64, 0,</a>
+<a name="40"><span class="lineNum"> 40 </span> : : 0xf6, 0x3f, 0xc7, 0xc0, 0x80, 0xd0, 0x80, 0x00, /* 0 .. 7 */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 8 .. 15 */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* 16 .. 23 */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* 24 .. 31 */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, /* 32 .. 39 */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 40 .. 47 */</a>
+<a name="46"><span class="lineNum"> 46 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 48 .. 55 */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 56 .. 63 */</a>
+<a name="48"><span class="lineNum"> 48 </span> : : };</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : const uint8_t *pa_features;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : size_t pa_features_size;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 26 : prlog(PR_INFO, &quot; Cache: I=%u D=%u/%u/%u/%u\n&quot;,</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : be32_to_cpu(cache-&gt;icache_size_kb),</a>
+<a name="55"><span class="lineNum"> 55 </span> : : be32_to_cpu(cache-&gt;l1_dcache_size_kb),</a>
+<a name="56"><span class="lineNum"> 56 </span> : : be32_to_cpu(cache-&gt;l2_dcache_size_kb),</a>
+<a name="57"><span class="lineNum"> 57 </span> : : be32_to_cpu(cache-&gt;l3_dcache_size_kb),</a>
+<a name="58"><span class="lineNum"> 58 </span> : : be32_to_cpu(cache-&gt;l35_dcache_size_kb));</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : /* Use the boot CPU PVR to make up a CPU name in the device-tree</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * since the HDAT doesn't seem to tell....</a>
+<a name="62"><span class="lineNum"> 62 </span> : : */</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 26 : version = mfspr(SPR_PVR);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 26 : switch(PVR_TYPE(version)) {</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 26 : case PVR_TYPE_P8E:</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : case PVR_TYPE_P8:</a>
+<a name="67"><span class="lineNum"> 67 </span> : : case PVR_TYPE_P8NVL:</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 26 : name = &quot;PowerPC,POWER8&quot;;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 26 : pa_features = pa_features_p8;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 26 : pa_features_size = sizeof(pa_features_p8);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 26 : break;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : case PVR_TYPE_P9:</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : case PVR_TYPE_P9P:</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : name = &quot;PowerPC,POWER9&quot;;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : if (is_power9n(version) &amp;&amp;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : (PVR_VERS_MAJ(version) == 2) &amp;&amp;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : (PVR_VERS_MIN(version) == 0)) {</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* P9N DD2.0 */</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : pa_features = pa_features_p9n_dd20;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : pa_features_size = sizeof(pa_features_p9n_dd20);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : } else {</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : pa_features = pa_features_p9;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : pa_features_size = sizeof(pa_features_p9);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : name = &quot;PowerPC,Unknown&quot;;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : pa_features = NULL;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : }</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 26 : cpu = dt_new_addr(cpus, name, int_server);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 26 : assert(cpu);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 26 : dt_add_property_string(cpu, &quot;device_type&quot;, &quot;cpu&quot;);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 26 : dt_add_property_string(cpu, &quot;status&quot;, okay ? &quot;okay&quot; : &quot;bad&quot;);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;reg&quot;, int_server);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;cpu-version&quot;, version);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 26 : dt_add_property(cpu, &quot;64-bit&quot;, NULL, 0);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 26 : dt_add_property(cpu, &quot;32-64-bridge&quot;, NULL, 0);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 26 : dt_add_property(cpu, &quot;graphics&quot;, NULL, 0);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 26 : dt_add_property(cpu, &quot;general-purpose&quot;, NULL, 0);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,processor-segment-sizes&quot;,</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : 0x1c, 0x28, 0xffffffff, 0xffffffff);</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,processor-page-sizes&quot;,</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : 0xc, 0x10, 0x18, 0x22);</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 26 : if (proc_gen == proc_gen_p9)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(cpu, &quot;ibm,processor-radix-AP-encodings&quot;,</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : 0x0000000c, 0xa0000010, 0x20000015, 0x4000001e);</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* HPT segment page size encodings, common to all supported CPUs */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,segment-page-sizes&quot;,</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : 0x0c, 0x000, 3, 0x0c, 0x0000, /* 4K seg 4k pages */</a>
+<a name="113"><span class="lineNum"> 113 </span> : : 0x10, 0x0007, /* 4K seg 64k pages */</a>
+<a name="114"><span class="lineNum"> 114 </span> : : 0x18, 0x0038, /* 4K seg 16M pages */</a>
+<a name="115"><span class="lineNum"> 115 </span> : : 0x10, 0x110, 2, 0x10, 0x0001, /* 64K seg 64k pages */</a>
+<a name="116"><span class="lineNum"> 116 </span> : : 0x18, 0x0008, /* 64K seg 16M pages */</a>
+<a name="117"><span class="lineNum"> 117 </span> : : 0x18, 0x100, 1, 0x18, 0x0000, /* 16M seg 16M pages */</a>
+<a name="118"><span class="lineNum"> 118 </span> : : 0x22, 0x120, 1, 0x22, 0x0003); /* 16G seg 16G pages */</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 26 : if (pa_features) {</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 26 : dt_add_property(cpu, &quot;ibm,pa-features&quot;,</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : pa_features, pa_features_size);</a>
+<a name="124"><span class="lineNum"> 124 </span> : : }</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,slb-size&quot;, 0x20);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,vmx&quot;, 0x2);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,dfp&quot;, 0x2);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,purr&quot;, 0x1);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,spurr&quot;, 0x1);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /*</a>
+<a name="133"><span class="lineNum"> 133 </span> : : * Do not create &quot;clock-frequency&quot; if the frequency doesn't</a>
+<a name="134"><span class="lineNum"> 134 </span> : : * fit in a single cell</a>
+<a name="135"><span class="lineNum"> 135 </span> : : */</a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 26 : freq = ((uint64_t)be32_to_cpu(tb-&gt;actual_clock_speed)) * 1000000ul;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 26 : if (freq &lt;= 0xfffffffful)</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;clock-frequency&quot;, freq);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 26 : dt_add_property_u64(cpu, &quot;ibm,extended-clock-frequency&quot;, freq);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : /* FIXME: Hardcoding is bad. */</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;timebase-frequency&quot;, 512000000);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,extended-timebase-frequency&quot;,</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : 0, 512000000);</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;reservation-granule-size&quot;,</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : be32_to_cpu(cache-&gt;reservation_size));</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;d-tlb-size&quot;,</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : be32_to_cpu(cache-&gt;dtlb_entries));</a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;i-tlb-size&quot;,</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : be32_to_cpu(cache-&gt;itlb_entries));</a>
+<a name="153"><span class="lineNum"> 153 </span> : : /* Assume unified TLB */</a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;tlb-size&quot;,</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : be32_to_cpu(cache-&gt;dtlb_entries));</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;d-tlb-sets&quot;,</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : be32_to_cpu(cache-&gt;dtlb_assoc_sets));</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;i-tlb-sets&quot;,</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : be32_to_cpu(cache-&gt;itlb_assoc_sets));</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;tlb-sets&quot;,</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : be32_to_cpu(cache-&gt;dtlb_assoc_sets));</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;d-cache-block-size&quot;,</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : be32_to_cpu(cache-&gt;dcache_block_size));</a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;i-cache-block-size&quot;,</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : be32_to_cpu(cache-&gt;icache_block_size));</a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;d-cache-size&quot;,</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : be32_to_cpu(cache-&gt;l1_dcache_size_kb)*1024);</a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;i-cache-size&quot;,</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : be32_to_cpu(cache-&gt;icache_size_kb)*1024);</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;i-cache-sets&quot;,</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : be32_to_cpu(cache-&gt;icache_assoc_sets));</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;d-cache-sets&quot;,</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : be32_to_cpu(cache-&gt;dcache_assoc_sets));</a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 26 : if (cache-&gt;icache_line_size != cache-&gt;icache_block_size)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(cpu, &quot;i-cache-line-size&quot;,</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : be32_to_cpu(cache-&gt;icache_line_size));</a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 26 : if (cache-&gt;l1_dcache_line_size != cache-&gt;dcache_block_size)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(cpu, &quot;d-cache-line-size&quot;,</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : be32_to_cpu(cache-&gt;l1_dcache_line_size));</a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 26 : return cpu;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 26 : void add_core_attr(struct dt_node *cpu, uint32_t attr)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : {</a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 26 : if (attr &amp; CPU_ATTR_UNIFIED_PL1)</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : dt_add_property(cpu, &quot;cache-unified&quot;, NULL, 0);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 26 : if (attr &amp; CPU_ATTR_SPLIT_TLB)</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : dt_add_property(cpu, &quot;tlb-split&quot;, NULL, 0);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 26 : if (attr &amp; CPU_ATTR_TLBIA)</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : dt_add_property(cpu, &quot;tlbia&quot;, NULL, 0);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 26 : if (attr &amp; CPU_ATTR_PERF_MONITOR)</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;performance-monitor&quot;, 0, 1);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 26 : if (attr &amp; CPU_ATTR_EXTERN_CONT)</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : dt_add_property(cpu, &quot;external-control&quot;, NULL, 0);</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 26 : }</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 52 : static struct dt_node *create_cache_node(struct dt_node *cpus,</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : const struct sppcia_cpu_cache *cache,</a>
+<a name="201"><span class="lineNum"> 201 </span> : : const char *name, uint32_t unit_addr,</a>
+<a name="202"><span class="lineNum"> 202 </span> : : int okay)</a>
+<a name="203"><span class="lineNum"> 203 </span> : : {</a>
+<a name="204"><span class="lineNum"> 204 </span> : : struct dt_node *node;</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 52 : node = dt_new_addr(cpus, name, unit_addr);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 52 : assert(node);</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 52 : dt_add_property_string(node, &quot;device_type&quot;, &quot;cache&quot;);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 52 : dt_add_property_cells(node, &quot;reg&quot;, unit_addr);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 52 : dt_add_property_string(node, &quot;status&quot;, okay ? &quot;okay&quot; : &quot;bad&quot;);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 52 : dt_add_property(node, &quot;cache-unified&quot;, NULL, 0);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> : : /* Assume cache associavitity sets is same for L2, L3 and L3.5 */</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 52 : dt_add_property_cells(node, &quot;d-cache-sets&quot;,</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : be32_to_cpu(cache-&gt;l2_cache_assoc_sets));</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 52 : dt_add_property_cells(node, &quot;i-cache-sets&quot;,</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : be32_to_cpu(cache-&gt;l2_cache_assoc_sets));</a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 52 : return node;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : }</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : static struct dt_node *l35_cache_node(struct dt_node *cpus,</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : const struct sppcia_cpu_cache *cache,</a>
+<a name="225"><span class="lineNum"> 225 </span> : : uint32_t unit_addr, int okay)</a>
+<a name="226"><span class="lineNum"> 226 </span> : : {</a>
+<a name="227"><span class="lineNum"> 227 </span> : : struct dt_node *node;</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : node = create_cache_node(cpus, cache, &quot;l35-cache&quot;, unit_addr, okay);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;d-cache-size&quot;,</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : be32_to_cpu(cache-&gt;l35_dcache_size_kb) * 1024);</a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;i-cache-size&quot;,</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : be32_to_cpu(cache-&gt;l35_dcache_size_kb) * 1024);</a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : if (cache-&gt;icache_line_size != cache-&gt;icache_block_size)</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;i-cache-line-size&quot;,</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : be32_to_cpu(cache-&gt;icache_line_size));</a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : if (cache-&gt;l35_cache_line_size != cache-&gt;dcache_block_size)</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;d-cache-line-size&quot;,</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : be32_to_cpu(cache-&gt;l35_cache_line_size));</a>
+<a name="242"><span class="lineNum"> 242 </span> : : </a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : return node;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : }</a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 26 : static struct dt_node *l3_cache_node(struct dt_node *cpus,</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : const struct sppcia_cpu_cache *cache,</a>
+<a name="248"><span class="lineNum"> 248 </span> : : uint32_t unit_addr, int okay)</a>
+<a name="249"><span class="lineNum"> 249 </span> : : {</a>
+<a name="250"><span class="lineNum"> 250 </span> : : struct dt_node *node;</a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 26 : node = create_cache_node(cpus, cache, &quot;l3-cache&quot;, unit_addr, okay);</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 26 : dt_add_property_cells(node, &quot;d-cache-size&quot;,</span></a>
+<a name="255"><span class="lineNum"> 255 </span> : : be32_to_cpu(cache-&gt;l3_dcache_size_kb) * 1024);</a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 26 : dt_add_property_cells(node, &quot;i-cache-size&quot;,</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : be32_to_cpu(cache-&gt;l3_dcache_size_kb) * 1024);</a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 26 : if (cache-&gt;icache_line_size != cache-&gt;icache_block_size)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;i-cache-line-size&quot;,</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : be32_to_cpu(cache-&gt;icache_line_size));</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 26 : if (cache-&gt;l3_line_size != cache-&gt;dcache_block_size)</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;d-cache-line-size&quot;,</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : be32_to_cpu(cache-&gt;l3_line_size));</a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 26 : return node;</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : }</a>
+<a name="268"><span class="lineNum"> 268 </span> : : </a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 26 : static struct dt_node *l2_cache_node(struct dt_node *cpus,</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : const struct sppcia_cpu_cache *cache,</a>
+<a name="271"><span class="lineNum"> 271 </span> : : uint32_t unit_addr, int okay)</a>
+<a name="272"><span class="lineNum"> 272 </span> : : {</a>
+<a name="273"><span class="lineNum"> 273 </span> : : struct dt_node *node;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 26 : node = create_cache_node(cpus, cache, &quot;l2-cache&quot;, unit_addr, okay);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 26 : dt_add_property_cells(node, &quot;d-cache-size&quot;,</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : be32_to_cpu(cache-&gt;l2_dcache_size_kb) * 1024);</a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 26 : dt_add_property_cells(node, &quot;i-cache-size&quot;,</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : be32_to_cpu(cache-&gt;l2_dcache_size_kb) * 1024);</a>
+<a name="281"><span class="lineNum"> 281 </span> : : </a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 26 : if (cache-&gt;icache_line_size != cache-&gt;icache_block_size)</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;i-cache-line-size&quot;,</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : be32_to_cpu(cache-&gt;icache_line_size));</a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 26 : if (cache-&gt;l2_line_size != cache-&gt;dcache_block_size)</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;d-cache-line-size&quot;,</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : be32_to_cpu(cache-&gt;l2_line_size));</a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 26 : return node;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : }</a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : static struct dt_node *find_l2_node(struct dt_node *cpus, u32 unit_addr)</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : {</a>
+<a name="294"><span class="lineNum"> 294 </span> : : char name[32];</a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineNoCov"> 0 : snprintf(name, sizeof(name), &quot;l2-cache@%.08x&quot;, unit_addr);</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineNoCov"> 0 : return dt_find_by_name(cpus, name);</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : }</a>
+<a name="299"><span class="lineNum"> 299 </span> : : </a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 26 : uint32_t add_core_cache_info(struct dt_node *cpus,</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : const struct sppcia_cpu_cache *cache,</a>
+<a name="302"><span class="lineNum"> 302 </span> : : uint32_t core_pir, int okay)</a>
+<a name="303"><span class="lineNum"> 303 </span> : : {</a>
+<a name="304"><span class="lineNum"> 304 </span> : : struct dt_node *l2_node, *l3_node, *l35_node;</a>
+<a name="305"><span class="lineNum"> 305 </span> : : uint32_t unit_addr;</a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> : : /*</a>
+<a name="308"><span class="lineNum"> 308 </span> : : * On P9 the L2 is shared by pairs of SMT=4 cores. We only want</a>
+<a name="309"><span class="lineNum"> 309 </span> : : * to create a cache node for the first of these so we mask off</a>
+<a name="310"><span class="lineNum"> 310 </span> : : * the low PIR bits to get the unit address of the shared cache.</a>
+<a name="311"><span class="lineNum"> 311 </span> : : */</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 26 : if (proc_gen == proc_gen_p9) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : core_pir &amp;= ~0x7;</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : l2_node = find_l2_node(cpus, 0x20 &lt;&lt; 24 | core_pir);</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineNoCov"> 0 : if (l2_node)</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineNoCov"> 0 : return l2_node-&gt;phandle;</span></a>
+<a name="318"><span class="lineNum"> 318 </span> : : }</a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 26 : unit_addr = 0x20 &lt;&lt; 24 | core_pir;</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 26 : l2_node = l2_cache_node(cpus, cache, unit_addr, okay);</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : </a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 26 : unit_addr = 0x30 &lt;&lt; 24 | core_pir;</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 26 : l3_node = l3_cache_node(cpus, cache, unit_addr, okay);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> : : /* Represents the next level of cache in the memory hierarchy */</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 26 : dt_add_property_cells(l2_node, &quot;l2-cache&quot;, l3_node-&gt;phandle);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : </a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 26 : if (be32_to_cpu(cache-&gt;l35_dcache_size_kb)) {</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : unit_addr = 0x35 &lt;&lt; 24 | core_pir;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : l35_node = l35_cache_node(cpus, cache, unit_addr, okay);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(l3_node, &quot;l2-cache&quot;, l35_node-&gt;phandle);</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : }</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 26 : return l2_node-&gt;phandle;</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/fsp.c.func-sort-c.html b/coverage-report/hdata/fsp.c.func-sort-c.html
new file mode 100644
index 0000000..6c63ff9
--- /dev/null
+++ b/coverage-report/hdata/fsp.c.func-sort-c.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/fsp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - fsp.c<span style="font-size: 80%;"> (<a href="fsp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">240</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">54.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="fsp.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#269">add_chip_id_to_sensors</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#303">add_ipmi_sensors</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#215">add_lpc_io_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#237">add_uart</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#353">bmc_create_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#485">bmc_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#172">fsp_create_links</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#96">fsp_create_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#506">fsp_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#130">fsp_create_link</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#26">find_service_proc_type</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/fsp.c.func.html b/coverage-report/hdata/fsp.c.func.html
new file mode 100644
index 0000000..390a7d7
--- /dev/null
+++ b/coverage-report/hdata/fsp.c.func.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/fsp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - fsp.c<span style="font-size: 80%;"> (<a href="fsp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">240</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">54.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="fsp.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#269">add_chip_id_to_sensors</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#303">add_ipmi_sensors</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#215">add_lpc_io_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#237">add_uart</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#353">bmc_create_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#485">bmc_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#26">find_service_proc_type</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#130">fsp_create_link</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#172">fsp_create_links</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#96">fsp_create_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fsp.c.gcov.html#506">fsp_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/fsp.c.gcov.html b/coverage-report/hdata/fsp.c.gcov.html
new file mode 100644
index 0000000..da2e626
--- /dev/null
+++ b/coverage-report/hdata/fsp.c.gcov.html
@@ -0,0 +1,637 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/fsp.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - fsp.c<span style="font-size: 80%;"> (source / <a href="fsp.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">90</td>
+ <td class="headerCovTableEntry">240</td>
+ <td class="headerCovTableEntryLo">37.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">54.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;device.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;spira.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;interrupts.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;phys-map.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;chip.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;ipmi.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : enum sp_type {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : SP_BAD = 0,</a>
+<a name="19"><span class="lineNum"> 19 </span> : : SP_UNKNOWN,</a>
+<a name="20"><span class="lineNum"> 20 </span> : : SP_FSP,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : SP_BMC,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : };</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : static const char * const sp_names[] = {</a>
+<a name="25"><span class="lineNum"> 25 </span> : : &quot;Broken&quot;, &quot;Unknown&quot;, &quot;FSP&quot;, &quot;BMC&quot;,</a>
+<a name="26"><span class="lineNum"> 26 </span> : : };</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 4 : static enum sp_type find_service_proc_type(const struct HDIF_common_hdr *spss,</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : int index)</a>
+<a name="30"><span class="lineNum"> 30 </span> : : {</a>
+<a name="31"><span class="lineNum"> 31 </span> : : const struct spss_sp_impl *sp_impl;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : int hw_ver, sw_ver, flags;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : enum sp_type sp_type;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : bool functional, installed;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : /* Find an check the SP Implementation structure */</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 4 : sp_impl = HDIF_get_idata(spss, SPSS_IDATA_SP_IMPL, NULL);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 4 : if (!CHECK_SPPTR(sp_impl)) {</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SP #%d: SPSS/SP_Implementation not found !\n&quot;, index);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : return SP_BAD;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 4 : hw_ver = be16_to_cpu(sp_impl-&gt;hw_version);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 4 : sw_ver = be16_to_cpu(sp_impl-&gt;sw_version);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 4 : flags = be16_to_cpu(sp_impl-&gt;func_flags);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 4 : switch (hw_ver) {</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 4 : case 0x1:</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : case 0x2: /* We only support FSP2 */</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 4 : sp_type = SP_FSP;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : case 0x3:</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : sp_type = SP_BMC;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : sp_type = SP_UNKNOWN;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : }</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 4 : if (sp_type == SP_UNKNOWN)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : return SP_UNKNOWN;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 4 : installed = !!(flags &amp; SPSS_SP_IMPL_FLAGS_INSTALLED);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 4 : functional = !!(flags &amp; SPSS_SP_IMPL_FLAGS_FUNCTIONAL);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 4 : if (!installed || !functional) {</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : prerror(&quot;%s #%d not usable: %sinstalled, %sfunctional\n&quot;,</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : sp_names[sp_type], index,</a>
+<a name="68"><span class="lineNum"> 68 </span> : : installed ? &quot;&quot; : &quot;not &quot;,</a>
+<a name="69"><span class="lineNum"> 69 </span> : : functional ? &quot;&quot; : &quot;not &quot;);</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : return SP_BAD;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : }</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 4 : prlog(PR_INFO, &quot;%s #%d: HW version %d, SW version %d, chip DD%d.%d\n&quot;,</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : sp_names[sp_type], index, hw_ver, sw_ver,</a>
+<a name="76"><span class="lineNum"> 76 </span> : : sp_impl-&gt;chip_version &gt;&gt; 4,</a>
+<a name="77"><span class="lineNum"> 77 </span> : : sp_impl-&gt;chip_version &amp; 0xf);</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 4 : return sp_type;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : /*</a>
+<a name="83"><span class="lineNum"> 83 </span> : : * Note on DT representation of the PSI links and FSPs:</a>
+<a name="84"><span class="lineNum"> 84 </span> : : *</a>
+<a name="85"><span class="lineNum"> 85 </span> : : * We create a XSCOM node for each PSI host bridge(one per chip),</a>
+<a name="86"><span class="lineNum"> 86 </span> : : *</a>
+<a name="87"><span class="lineNum"> 87 </span> : : * This is done in spira.c</a>
+<a name="88"><span class="lineNum"> 88 </span> : : *</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * We do not create the /psi MMIO variant at this stage, it will</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * be added by the psi driver in skiboot.</a>
+<a name="91"><span class="lineNum"> 91 </span> : : *</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * We do not put the FSP(s) as children of these. Instead, we create</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * a top-level /fsps node with the FSPs as children.</a>
+<a name="94"><span class="lineNum"> 94 </span> : : *</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * Each FSP then has a &quot;links&quot; property which is an array of chip IDs</a>
+<a name="96"><span class="lineNum"> 96 </span> : : */</a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 2 : static struct dt_node *fsp_create_node(const void *spss, int i,</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : struct dt_node *parent)</a>
+<a name="100"><span class="lineNum"> 100 </span> : : {</a>
+<a name="101"><span class="lineNum"> 101 </span> : : const struct spss_sp_impl *sp_impl;</a>
+<a name="102"><span class="lineNum"> 102 </span> : : struct dt_node *node;</a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 2 : sp_impl = HDIF_get_idata(spss, SPSS_IDATA_SP_IMPL, NULL);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 2 : node = dt_new_addr(parent, &quot;fsp&quot;, i);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 2 : assert(node);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;reg&quot;, i);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 2 : if (be16_to_cpu(sp_impl-&gt;hw_version) == 1) {</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;compatible&quot;, &quot;ibm,fsp&quot;,</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : &quot;ibm,fsp1&quot;);</a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* Offset into the FSP MMIO space where the mailbox</a>
+<a name="115"><span class="lineNum"> 115 </span> : : * registers are */</a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* seen in the FSP1 spec */</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg-offset&quot;, 0xb0016000);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 2 : } else if (be16_to_cpu(sp_impl-&gt;hw_version) == 2) {</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 2 : dt_add_property_strings(node, &quot;compatible&quot;, &quot;ibm,fsp&quot;,</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : &quot;ibm,fsp2&quot;);</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;reg-offset&quot;, 0xb0011000);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;hw-version&quot;, be16_to_cpu(sp_impl-&gt;hw_version));</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;sw-version&quot;, be16_to_cpu(sp_impl-&gt;sw_version));</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 2 : if (be16_to_cpu(sp_impl-&gt;func_flags) &amp; SPSS_SP_IMPL_FLAGS_PRIMARY)</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 2 : dt_add_property(node, &quot;primary&quot;, NULL, 0);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 2 : return node;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : }</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 3 : static uint32_t fsp_create_link(const struct spss_iopath *iopath, int index,</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : int fsp_index)</a>
+<a name="134"><span class="lineNum"> 134 </span> : : {</a>
+<a name="135"><span class="lineNum"> 135 </span> : : struct dt_node *node;</a>
+<a name="136"><span class="lineNum"> 136 </span> : : const char *ststr;</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 3 : bool current = false;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 3 : bool working = false;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : uint32_t chip_id;</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 3 : switch(be16_to_cpu(iopath-&gt;psi.link_status)) {</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : case SPSS_IO_PATH_PSI_LINK_BAD_FRU:</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : ststr = &quot;Broken&quot;;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 2 : case SPSS_IO_PATH_PSI_LINK_CURRENT:</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 2 : ststr = &quot;Active&quot;;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 2 : current = working = true;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : case SPSS_IO_PATH_PSI_LINK_BACKUP:</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : ststr = &quot;Backup&quot;;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : working = true;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : ststr = &quot;Unknown&quot;;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : }</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 3 : prlog(PR_DEBUG, &quot;FSP #%d: IO PATH %d is %s PSI Link, GXHB at %&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : fsp_index, index, ststr, be64_to_cpu(iopath-&gt;psi.gxhb_base));</a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 3 : chip_id = pcid_to_chip_id(be32_to_cpu(iopath-&gt;psi.proc_chip_id));</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 3 : node = dt_find_compatible_node_on_chip(dt_root, NULL, &quot;ibm,psihb-x&quot;,</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : chip_id);</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 3 : if (!node) {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FSP #%d: Can't find psihb node for link %d\n&quot;,</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : fsp_index, index);</a>
+<a name="165"><span class="lineNum"> 165 </span> : : } else {</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 3 : if (current)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 2 : dt_add_property(node, &quot;boot-link&quot;, NULL, 0);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 3 : dt_add_property_strings(node, &quot;status&quot;, working ? &quot;ok&quot; : &quot;bad&quot;);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : }</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 3 : return chip_id;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 2 : static void fsp_create_links(const void *spss, int index,</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : struct dt_node *fsp_node)</a>
+<a name="176"><span class="lineNum"> 176 </span> : : {</a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 2 : __be32 *links = NULL;</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 2 : unsigned int i, lp, lcount = 0;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : int count;</a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 2 : count = HDIF_get_iarray_size(spss, SPSS_IDATA_SP_IOPATH);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 2 : if (count &lt; 0) {</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FSP #%d: Can't find IO PATH array size !\n&quot;, index);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="185"><span class="lineNum"> 185 </span> : : }</a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;FSP #%d: Found %d IO PATH\n&quot;, index, count);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> : : /* Iterate all links */</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 5 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : const struct spss_iopath *iopath;</a>
+<a name="191"><span class="lineNum"> 191 </span> : : unsigned int iopath_sz;</a>
+<a name="192"><span class="lineNum"> 192 </span> : : uint32_t chip;</a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 3 : iopath = HDIF_get_iarray_item(spss, SPSS_IDATA_SP_IOPATH,</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : i, &amp;iopath_sz);</a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 3 : if (!CHECK_SPPTR(iopath)) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FSP #%d: Can't find IO PATH %d\n&quot;, index, i);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : }</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 3 : if (be16_to_cpu(iopath-&gt;iopath_type) != SPSS_IOPATH_TYPE_PSI) {</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : prerror(&quot;FSP #%d: Unsupported IO PATH %d type 0x%04x\n&quot;,</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : index, i, iopath-&gt;iopath_type);</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 3 : chip = fsp_create_link(iopath, i, index);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 3 : lp = lcount++;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 3 : links = realloc(links, 4 * lcount);</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 3 : links[lp] = cpu_to_be32(chip);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : }</a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 2 : if (links)</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 2 : dt_add_property(fsp_node, &quot;ibm,psi-links&quot;, links, lcount * 4);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 2 : free(links);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : static struct dt_node *add_lpc_io_node(struct dt_node *parent,</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : const char *name, u32 offset, u32 size)</a>
+<a name="219"><span class="lineNum"> 219 </span> : : {</a>
+<a name="220"><span class="lineNum"> 220 </span> : : struct dt_node *n;</a>
+<a name="221"><span class="lineNum"> 221 </span> : : char buffer[32];</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> : : /*</a>
+<a name="224"><span class="lineNum"> 224 </span> : : * LPC bus addresses have strange DT names, they have the</a>
+<a name="225"><span class="lineNum"> 225 </span> : : * Bus address space embedded into the unit address e.g.</a>
+<a name="226"><span class="lineNum"> 226 </span> : : * serial@i3f8 - refers to offset 0x3f8 in the IO space</a>
+<a name="227"><span class="lineNum"> 227 </span> : : */</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : snprintf(buffer, sizeof(buffer), &quot;%s@i%x&quot;, name, offset);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : n = dt_new(parent, buffer);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : assert(n);</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> : : /* first address cell of 1 indicates the LPC IO space */</a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(n, &quot;reg&quot;, 1, offset, size);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : return n;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : }</a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : static void add_uart(const struct spss_iopath *iopath, struct dt_node *lpc)</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : {</a>
+<a name="241"><span class="lineNum"> 241 </span> : : struct dt_node *serial;</a>
+<a name="242"><span class="lineNum"> 242 </span> : : u64 base;</a>
+<a name="243"><span class="lineNum"> 243 </span> : : </a>
+<a name="244"><span class="lineNum"> 244 </span> : : /* XXX: The spec says this is supposed to be a MMIO address.</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * However, in practice we get an LPC IO Space offset.</a>
+<a name="246"><span class="lineNum"> 246 </span> : : */</a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : base = be64_to_cpu(iopath-&gt;lpc.uart_base);</span></a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : serial = add_lpc_io_node(lpc, &quot;serial&quot;, base,</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : be32_to_cpu(iopath-&gt;lpc.uart_size));</a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(serial, &quot;compatible&quot;, &quot;ns16550&quot;);</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(serial, &quot;current-speed&quot;,</span></a>
+<a name="255"><span class="lineNum"> 255 </span> : : be32_to_cpu(iopath-&gt;lpc.uart_baud));</a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(serial, &quot;clock-frequency&quot;,</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : be32_to_cpu(iopath-&gt;lpc.uart_clk));</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(serial, &quot;interrupts&quot;,</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : iopath-&gt;lpc.uart_int_number);</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(serial, &quot;device_type&quot;, &quot;serial&quot;);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> : : </a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;LPC UART: base addr = %#&quot; PRIx64&quot; (%#&quot; PRIx64 &quot;) size = %#x clk = %u, baud = %u\n&quot;,</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : be64_to_cpu(iopath-&gt;lpc.uart_base),</a>
+<a name="265"><span class="lineNum"> 265 </span> : : base,</a>
+<a name="266"><span class="lineNum"> 266 </span> : : be32_to_cpu(iopath-&gt;lpc.uart_size),</a>
+<a name="267"><span class="lineNum"> 267 </span> : : be32_to_cpu(iopath-&gt;lpc.uart_clk),</a>
+<a name="268"><span class="lineNum"> 268 </span> : : be32_to_cpu(iopath-&gt;lpc.uart_baud));</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : static void add_chip_id_to_sensors(struct dt_node *sensor_node, uint32_t slca_index)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : {</a>
+<a name="273"><span class="lineNum"> 273 </span> : : unsigned int i;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : const void *hdif;</a>
+<a name="275"><span class="lineNum"> 275 </span> : : const struct slca_entry *slca;</a>
+<a name="276"><span class="lineNum"> 276 </span> : : const struct spira_fru_id *fru_id;</a>
+<a name="277"><span class="lineNum"> 277 </span> : : const struct sppcrd_chip_info *cinfo;</a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : slca = slca_get_entry(slca_index);</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : if (slca == NULL) {</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;SENSORS: Invalid slca index\n&quot;);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineNoCov"> 0 : for_each_ntuple_idx(&amp;spira.ntuples.proc_chip, hdif, i, SPPCRD_HDIF_SIG) {</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : fru_id = HDIF_get_idata(hdif, SPPCRD_IDATA_FRU_ID, NULL);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : if (!fru_id)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineNoCov"> 0 : if (fru_id-&gt;rsrc_id != slca-&gt;rsrc_id)</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineNoCov"> 0 : cinfo = HDIF_get_idata(hdif, SPPCRD_IDATA_CHIP_INFO, NULL);</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(cinfo)) {</span></a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;SENSORS: Bad ChipID data %d\n&quot;, i);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="297"><span class="lineNum"> 297 </span> : : }</a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(sensor_node,</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : &quot;ibm,chip-id&quot;, be32_to_cpu(cinfo-&gt;xscom_id));</a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : }</a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : static void add_ipmi_sensors(struct dt_node *bmc_node)</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : {</a>
+<a name="307"><span class="lineNum"> 307 </span> : : int i;</a>
+<a name="308"><span class="lineNum"> 308 </span> : : const struct HDIF_common_hdr *hdif_sensor;</a>
+<a name="309"><span class="lineNum"> 309 </span> : : const struct ipmi_sensors *ipmi_sensors;</a>
+<a name="310"><span class="lineNum"> 310 </span> : : struct dt_node *sensors_node, *sensor_node;</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : hdif_sensor = get_hdif(&amp;spira.ntuples.ipmi_sensor, IPMI_SENSORS_HDIF_SIG);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : if (!hdif_sensor) {</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;SENSORS: Missing IPMI sensors mappings tuple\n&quot;);</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : }</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : ipmi_sensors = HDIF_get_idata(hdif_sensor, IPMI_SENSORS_IDATA_SENSORS, NULL);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : if (!ipmi_sensors) {</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;SENSORS: bad data\n&quot;);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : }</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : sensors_node = dt_new(bmc_node, &quot;sensors&quot;);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : assert(sensors_node);</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : </a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(sensors_node, &quot;#address-cells&quot;, 1);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(sensors_node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; be32_to_cpu(ipmi_sensors-&gt;count); i++) {</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : if(dt_find_by_name_addr(sensors_node, &quot;sensor&quot;,</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : ipmi_sensors-&gt;data[i].id)) {</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;SENSORS: Duplicate sensor ID : %x\n&quot;,</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : ipmi_sensors-&gt;data[i].id);</a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : }</a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : /* We support only &lt; MAX_IPMI_SENSORS sensors */</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : if (!(ipmi_sensors-&gt;data[i].type &lt; MAX_IPMI_SENSORS))</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : sensor_node = dt_new_addr(sensors_node, &quot;sensor&quot;,</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineNoCov"> 0 : ipmi_sensors-&gt;data[i].id);</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : assert(sensor_node);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(sensor_node, &quot;compatible&quot;, &quot;ibm,ipmi-sensor&quot;);</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(sensor_node, &quot;reg&quot;, ipmi_sensors-&gt;data[i].id);</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(sensor_node, &quot;ipmi-sensor-type&quot;,</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : ipmi_sensors-&gt;data[i].type);</a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : add_chip_id_to_sensors(sensor_node,</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : be32_to_cpu(ipmi_sensors-&gt;data[i].slca_index));</a>
+<a name="352"><span class="lineNum"> 352 </span> : : }</a>
+<a name="353"><span class="lineNum"> 353 </span> : : }</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineNoCov"> 0 : static void bmc_create_node(const struct HDIF_common_hdr *sp)</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : {</a>
+<a name="357"><span class="lineNum"> 357 </span> : : struct dt_node *bmc_node;</a>
+<a name="358"><span class="lineNum"> 358 </span> : : u32 fw_bar, io_bar, mem_bar, internal_bar;</a>
+<a name="359"><span class="lineNum"> 359 </span> : : const struct spss_iopath *iopath;</a>
+<a name="360"><span class="lineNum"> 360 </span> : : const struct spss_sp_impl *sp_impl;</a>
+<a name="361"><span class="lineNum"> 361 </span> : : struct dt_node *lpcm, *lpc, *n;</a>
+<a name="362"><span class="lineNum"> 362 </span> : : u64 lpcm_base, lpcm_end;</a>
+<a name="363"><span class="lineNum"> 363 </span> : : uint32_t chip_id;</a>
+<a name="364"><span class="lineNum"> 364 </span> : : int size;</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : bmc_node = dt_new(dt_root, &quot;bmc&quot;);</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : assert(bmc_node);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : </a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(bmc_node, &quot;#address-cells&quot;, 1);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(bmc_node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : </a>
+<a name="372"><span class="lineNum"> 372 </span> : : /* Add sensor info under /bmc */</a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : add_ipmi_sensors(bmc_node);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : </a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : sp_impl = HDIF_get_idata(sp, SPSS_IDATA_SP_IMPL, &amp;size);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : if (CHECK_SPPTR(sp_impl) &amp;&amp; (size &gt; 8)) {</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(bmc_node, &quot;compatible&quot;, sp_impl-&gt;sp_family);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;SP Family is %s\n&quot;, sp_impl-&gt;sp_family);</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : }</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : iopath = HDIF_get_iarray_item(sp, SPSS_IDATA_SP_IOPATH, 0, NULL);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : if (be16_to_cpu(iopath-&gt;iopath_type) != SPSS_IOPATH_TYPE_LPC) {</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : prerror(&quot;BMC: Non-LPC IOPATH, this is probably broken\n&quot;);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="386"><span class="lineNum"> 386 </span> : : }</a>
+<a name="387"><span class="lineNum"> 387 </span> : : </a>
+<a name="388"><span class="lineNum"> 388 </span> : : /*</a>
+<a name="389"><span class="lineNum"> 389 </span> : : * For now we only instantiate the LPC node for the LPC that is used</a>
+<a name="390"><span class="lineNum"> 390 </span> : : * for Host &lt;-&gt; BMC comms. The secondary LPCs can be skipped.</a>
+<a name="391"><span class="lineNum"> 391 </span> : : */</a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineNoCov"> 0 : if (be16_to_cpu(iopath-&gt;lpc.link_status) != LPC_STATUS_ACTIVE)</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : </a>
+<a name="395"><span class="lineNum"> 395 </span> : : #define GB (1024ul * 1024ul * 1024ul)</a>
+<a name="396"><span class="lineNum"> 396 </span> : : /*</a>
+<a name="397"><span class="lineNum"> 397 </span> : : * convert the hdat chip ID the HW chip id so we get the right</a>
+<a name="398"><span class="lineNum"> 398 </span> : : * phys map offset</a>
+<a name="399"><span class="lineNum"> 399 </span> : : */</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : chip_id = pcid_to_chip_id(be32_to_cpu(iopath-&gt;lpc.chip_id));</span></a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : phys_map_get(chip_id, LPC_BUS, 0, &amp;lpcm_base, NULL);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : lpcm = dt_new_addr(dt_root, &quot;lpcm-opb&quot;, lpcm_base);</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : assert(lpcm);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(lpcm, &quot;#address-cells&quot;, 1);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(lpcm, &quot;#size-cells&quot;, 1);</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(lpcm, &quot;compatible&quot;,</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : &quot;ibm,power9-lpcm-opb&quot;, &quot;simple-bus&quot;);</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64s(lpcm, &quot;reg&quot;, lpcm_base, 0x100000000ul);</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : </a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(lpcm, &quot;ibm,chip-id&quot;, chip_id);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> : : /* Setup the ranges for the MMIO LPC */</a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : lpcm_end = lpcm_base + 2 * GB;</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(lpcm, &quot;ranges&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : 0x00000000, hi32(lpcm_base), lo32(lpcm_base), 2 * GB,</a>
+<a name="418"><span class="lineNum"> 418 </span> : : 0x80000000, hi32(lpcm_end), lo32(lpcm_end), 2 * GB);</a>
+<a name="419"><span class="lineNum"> 419 </span> : : </a>
+<a name="420"><span class="lineNum"> 420 </span> : : /*</a>
+<a name="421"><span class="lineNum"> 421 </span> : : * Despite the name the &quot;BAR&quot; values provided through the HDAT are</a>
+<a name="422"><span class="lineNum"> 422 </span> : : * the base addresses themselves rather than the BARs</a>
+<a name="423"><span class="lineNum"> 423 </span> : : */</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : fw_bar = be32_to_cpu(iopath-&gt;lpc.firmware_bar);</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : mem_bar = be32_to_cpu(iopath-&gt;lpc.memory_bar);</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : io_bar = be32_to_cpu(iopath-&gt;lpc.io_bar);</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : internal_bar = be32_to_cpu(iopath-&gt;lpc.internal_bar);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;LPC: IOPATH chip id = %x\n&quot;, chip_id);</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;LPC: FW BAR = %#x\n&quot;, fw_bar);</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;LPC: MEM BAR = %#x\n&quot;, mem_bar);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;LPC: IO BAR = %#x\n&quot;, io_bar);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;LPC: Internal BAR = %#x\n&quot;, internal_bar);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /*</a>
+<a name="436"><span class="lineNum"> 436 </span> : : * The internal address space BAR actually points to the LPC master</a>
+<a name="437"><span class="lineNum"> 437 </span> : : * registers. So we &quot;fix&quot; it by masking off the low bits.</a>
+<a name="438"><span class="lineNum"> 438 </span> : : *</a>
+<a name="439"><span class="lineNum"> 439 </span> : : * XXX: we probably need separate base addresses for all these things</a>
+<a name="440"><span class="lineNum"> 440 </span> : : */</a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : internal_bar &amp;= 0xf0000000;</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> : : /* Add the various internal bus devices */</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : n = dt_new_addr(lpcm, &quot;opb-master&quot;, internal_bar + 0x10000);</span></a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(n, &quot;compatible&quot;, &quot;ibm,power9-lpcm-opb-master&quot;);</span></a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(n, &quot;reg&quot;, internal_bar + 0x10000, 0x60);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> : : </a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : n = dt_new_addr(lpcm, &quot;opb-arbiter&quot;, internal_bar + 0x11000);</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(n, &quot;compatible&quot;, &quot;ibm,power9-lpcm-opb-arbiter&quot;);</span></a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(n, &quot;reg&quot;, internal_bar + 0x11000, 0x8);</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : </a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : n = dt_new_addr(lpcm, &quot;lpc-controller&quot;, internal_bar + 0x12000);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(n, &quot;compatible&quot;, &quot;ibm,power9-lpc-controller&quot;);</span></a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(n, &quot;reg&quot;, internal_bar + 0x12000, 0x100);</span></a>
+<a name="455"><span class="lineNum"> 455 </span> : : </a>
+<a name="456"><span class="lineNum"> 456 </span> : : /*</a>
+<a name="457"><span class="lineNum"> 457 </span> : : * FIXME: lpc@0 might not be accurate, but i'm pretty sure</a>
+<a name="458"><span class="lineNum"> 458 </span> : : * lpc@f0000000 isn't right either.</a>
+<a name="459"><span class="lineNum"> 459 </span> : : */</a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : lpc = dt_new_addr(lpcm, &quot;lpc&quot;, 0x0);</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(lpc, &quot;#address-cells&quot;, 2);</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(lpc, &quot;#size-cells&quot;, 1);</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(lpc, &quot;compatible&quot;,</span></a>
+<a name="464"><span class="lineNum"> 464 </span> : : &quot;ibm,power9-lpc&quot;, &quot;ibm,power8-lpc&quot;);</a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(lpc, &quot;ranges&quot;,</span></a>
+<a name="467"><span class="lineNum"> 467 </span> : : 0, 0, mem_bar, 0x10000000, /* MEM space */</a>
+<a name="468"><span class="lineNum"> 468 </span> : : 1, 0, io_bar, 0x00010000, /* IO space */</a>
+<a name="469"><span class="lineNum"> 469 </span> : : /* we don't expose the internal space */</a>
+<a name="470"><span class="lineNum"> 470 </span> : : 3, 0, fw_bar, 0x10000000 /* FW space */</a>
+<a name="471"><span class="lineNum"> 471 </span> : : );</a>
+<a name="472"><span class="lineNum"> 472 </span> : : </a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : add_uart(iopath, lpc);</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : </a>
+<a name="475"><span class="lineNum"> 475 </span> : : /* BT device info isn't currently populated */</a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;LPC: BT [%#&quot;PRIx64&quot;, %#x] sms_int: %u, bmc_int: %u\n&quot;,</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : iopath-&gt;lpc.bt_base, iopath-&gt;lpc.bt_size,</a>
+<a name="478"><span class="lineNum"> 478 </span> : : iopath-&gt;lpc.bt_sms_int_num, iopath-&gt;lpc.bt_bmc_response_int_num</a>
+<a name="479"><span class="lineNum"> 479 </span> : : );</a>
+<a name="480"><span class="lineNum"> 480 </span> : : }</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> : : /*</a>
+<a name="483"><span class="lineNum"> 483 </span> : : * Search for and instanciate BMC nodes. This is mostly the same as fsp_parse()</a>
+<a name="484"><span class="lineNum"> 484 </span> : : * below, but it can be called earlier since BMCs don't depend on the psihb</a>
+<a name="485"><span class="lineNum"> 485 </span> : : * nodes being added.</a>
+<a name="486"><span class="lineNum"> 486 </span> : : */</a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 2 : void bmc_parse(void)</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : {</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 2 : bool found = false;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> : : const void *sp;</a>
+<a name="491"><span class="lineNum"> 491 </span> : : int i;</a>
+<a name="492"><span class="lineNum"> 492 </span> : : </a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 2 : sp = get_hdif(&amp;spira.ntuples.sp_subsys, SPSS_HDIF_SIG);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 2 : if (!sp)</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> : : </a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 4 : for_each_ntuple_idx(&amp;spira.ntuples.sp_subsys, sp, i, SPSS_HDIF_SIG) {</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineCov"> 2 : if (find_service_proc_type(sp, i) == SP_BMC) {</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : bmc_create_node(sp);</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : found = true;</span></a>
+<a name="501"><span class="lineNum"> 501 </span> : : }</a>
+<a name="502"><span class="lineNum"> 502 </span> : : }</a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 2 : if (found)</span></a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : early_uart_init();</span></a>
+<a name="506"><span class="lineNum"> 506 </span> : : }</a>
+<a name="507"><span class="lineNum"> 507 </span> : : </a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 2 : void fsp_parse(void)</span></a>
+<a name="509"><span class="lineNum"> 509 </span> : : {</a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 2 : struct dt_node *fsp_root = NULL, *fsp_node;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> : : const void *sp;</a>
+<a name="512"><span class="lineNum"> 512 </span> : : int index;</a>
+<a name="513"><span class="lineNum"> 513 </span> : : </a>
+<a name="514"><span class="lineNum"> 514 </span> : : /* Find SPSS tuple in SPIRA */</a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineCov"> 2 : sp = get_hdif(&amp;spira.ntuples.sp_subsys, SPSS_HDIF_SIG);</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineCov"> 2 : if (!sp) {</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;HDAT: No FSP/BMC found!\n&quot;);</span></a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="519"><span class="lineNum"> 519 </span> : : }</a>
+<a name="520"><span class="lineNum"> 520 </span> : : </a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineCov"> 4 : for_each_ntuple_idx(&amp;spira.ntuples.sp_subsys, sp, index, SPSS_HDIF_SIG) {</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 2 : switch (find_service_proc_type(sp, index)) {</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineCov"> 2 : case SP_FSP:</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineCov"> 2 : if (!fsp_root) {</span></a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineCov"> 2 : fsp_root = dt_new(dt_root, &quot;fsps&quot;);</span></a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineCov"> 2 : assert(fsp_root);</span></a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 2 : dt_add_property_cells(fsp_root,</span></a>
+<a name="529"><span class="lineNum"> 529 </span> : : &quot;#address-cells&quot;, 1);</a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 2 : dt_add_property_cells(fsp_root,</span></a>
+<a name="531"><span class="lineNum"> 531 </span> : : &quot;#size-cells&quot;, 0);</a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineCov"> 2 : fsp_node = fsp_create_node(sp, index, fsp_root);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineCov"> 2 : if (fsp_node)</span></a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineCov"> 2 : fsp_create_links(sp, index, fsp_node);</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : </a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineNoCov"> 0 : case SP_BMC:</span></a>
+<a name="541"><span class="lineNum"> 541 </span> : : /* Handled above */</a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : </a>
+<a name="544"><span class="lineNum"> 544 </span> :<span class="lineNoCov"> 0 : case SP_BAD:</span></a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="546"><span class="lineNum"> 546 </span> : : </a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SP #%d: This service processor is not supported\n&quot;, index);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : }</a>
+<a name="551"><span class="lineNum"> 551 </span> : : }</a>
+<a name="552"><span class="lineNum"> 552 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hdif.c.func-sort-c.html b/coverage-report/hdata/hdif.c.func-sort-c.html
new file mode 100644
index 0000000..f3cfb5b
--- /dev/null
+++ b/coverage-report/hdata/hdif.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hdif.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hdif.c<span style="font-size: 80%;"> (<a href="hdif.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">50.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="hdif.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#143">HDIF_iarray_item</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#97">HDIF_get_iarray</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#154">HDIF_child_arr</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#169">HDIF_child</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#64">HDIF_get_iarray_size</a></td>
+ <td class="coverFnHi">773</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#32">HDIF_get_iarray_item</a></td>
+ <td class="coverFnHi">2243</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#5">HDIF_get_idata</a></td>
+ <td class="coverFnHi">3700</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hdif.c.func.html b/coverage-report/hdata/hdif.c.func.html
new file mode 100644
index 0000000..4ee0c15
--- /dev/null
+++ b/coverage-report/hdata/hdif.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hdif.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hdif.c<span style="font-size: 80%;"> (<a href="hdif.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">50.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="hdif.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#169">HDIF_child</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#154">HDIF_child_arr</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#97">HDIF_get_iarray</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#32">HDIF_get_iarray_item</a></td>
+ <td class="coverFnHi">2243</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#64">HDIF_get_iarray_size</a></td>
+ <td class="coverFnHi">773</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#5">HDIF_get_idata</a></td>
+ <td class="coverFnHi">3700</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.c.gcov.html#143">HDIF_iarray_item</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hdif.c.gcov.html b/coverage-report/hdata/hdif.c.gcov.html
new file mode 100644
index 0000000..5ab044c
--- /dev/null
+++ b/coverage-report/hdata/hdif.c.gcov.html
@@ -0,0 +1,290 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hdif.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hdif.c<span style="font-size: 80%;"> (source / <a href="hdif.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">50.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;hdif.h&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stack.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> :<span class="lineCov"> 3700 : const void *HDIF_get_idata(const struct HDIF_common_hdr *hdif, unsigned int di,</span></a>
+<a name="8"><span class="lineNum"> 8 </span> : : unsigned int *size)</a>
+<a name="9"><span class="lineNum"> 9 </span> : : {</a>
+<a name="10"><span class="lineNum"> 10 </span> :<span class="lineCov"> 3700 : const struct HDIF_common_hdr *hdr = hdif;</span></a>
+<a name="11"><span class="lineNum"> 11 </span> : : const struct HDIF_idata_ptr *iptr;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 3700 : if (be16_to_cpu(hdr-&gt;d1f0) != 0xd1f0) {</span></a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: Bad header format !\n&quot;);</span></a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : }</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 3700 : if (di &gt;= be16_to_cpu(hdr-&gt;idptr_count)) {</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;HDIF: idata %d out of range for %.6s!\n&quot;,</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : di, hdr-&gt;id);</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 3698 : iptr = (void *)hdif + be32_to_cpu(hdr-&gt;idptr_off)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 3698 : + di * sizeof(struct HDIF_idata_ptr);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 3698 : if (size)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 3394 : *size = be32_to_cpu(iptr-&gt;size);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 3698 : return (void *)hdif + be32_to_cpu(iptr-&gt;offset);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 2243 : const void *HDIF_get_iarray_item(const struct HDIF_common_hdr *hdif,</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : unsigned int di, unsigned int ai,</a>
+<a name="36"><span class="lineNum"> 36 </span> : : unsigned int *size)</a>
+<a name="37"><span class="lineNum"> 37 </span> : : {</a>
+<a name="38"><span class="lineNum"> 38 </span> : : const struct HDIF_array_hdr *ahdr;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : unsigned int asize;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : const void *arr;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 2243 : arr = HDIF_get_idata(hdif, di, &amp;asize);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 2243 : if (!arr)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 2243 : if (asize &lt; sizeof(struct HDIF_array_hdr)) {</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: idata block too small for array !\n&quot;);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 2243 : ahdr = arr;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 2243 : if (ai &gt;= be32_to_cpu(ahdr-&gt;ecnt)) {</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: idata array index out of range !\n&quot;);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 2243 : if (size)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 2241 : *size = be32_to_cpu(ahdr-&gt;eactsz);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 2243 : return arr + be32_to_cpu(ahdr-&gt;offset) + ai * be32_to_cpu(ahdr-&gt;esize);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 773 : int HDIF_get_iarray_size(const struct HDIF_common_hdr *hdif, unsigned int di)</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : const struct HDIF_array_hdr *ahdr;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : unsigned int asize;</a>
+<a name="70"><span class="lineNum"> 70 </span> : : const void *arr;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 773 : arr = HDIF_get_idata(hdif, di, &amp;asize);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 773 : if (!arr)</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 773 : if (asize &lt; sizeof(struct HDIF_array_hdr)) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: idata block too small for array !\n&quot;);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 773 : ahdr = arr;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 773 : return be32_to_cpu(ahdr-&gt;ecnt);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /*</a>
+<a name="87"><span class="lineNum"> 87 </span> : : * Returns NULL and sets *items to zero when:</a>
+<a name="88"><span class="lineNum"> 88 </span> : : *</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * a) Array extends beyond bounds (hard error)</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * b) The array is empty (soft error)</a>
+<a name="91"><span class="lineNum"> 91 </span> : : * c) The item size is zero (soft error)</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * d) The array is missing (soft error)</a>
+<a name="93"><span class="lineNum"> 93 </span> : : *</a>
+<a name="94"><span class="lineNum"> 94 </span> : : * b, c) are bugs in the input data so they generate backtraces.</a>
+<a name="95"><span class="lineNum"> 95 </span> : : *</a>
+<a name="96"><span class="lineNum"> 96 </span> : : * If you care about the soft error cases, retrive the array header manually</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * with HDIF_get_idata().</a>
+<a name="98"><span class="lineNum"> 98 </span> : : */</a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 2 : const struct HDIF_array_hdr *HDIF_get_iarray(const struct HDIF_common_hdr *hdif,</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : unsigned int di, unsigned int *items)</a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : const struct HDIF_array_hdr *arr;</a>
+<a name="103"><span class="lineNum"> 103 </span> : : unsigned int req_size, size, elements;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : unsigned int actual_sz, alloc_sz, offset;</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 2 : arr = HDIF_get_idata(hdif, di, &amp;size);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 2 : if(items)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 2 : *items = 0;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 2 : if (!arr || !size)</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : /* base size of an Idata array header */</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : offset = be32_to_cpu(arr-&gt;offset);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : actual_sz = be32_to_cpu(arr-&gt;eactsz);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : alloc_sz = be32_to_cpu(arr-&gt;esize);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : elements = be32_to_cpu(arr-&gt;ecnt);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /* actual size should always be smaller than allocated */</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineNoCov"> 0 : if (alloc_sz &lt; actual_sz) {</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF %.6s iarray %u has actsz (%u) &lt; alloc_sz (%u)\n)&quot;,</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : hdif-&gt;id, di, actual_sz, alloc_sz);</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : }</a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : req_size = elements * alloc_sz + offset;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : if (req_size &gt; size) {</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: %.6s iarray %u requires %#x bytes, but only %#x are allocated!\n&quot;,</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : hdif-&gt;id, di, req_size, size);</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : if (!elements || !actual_sz)</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : </a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : if (items)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : *items = elements;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : return arr;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : const void *HDIF_iarray_item(const struct HDIF_array_hdr *ahdr,</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : unsigned int index)</a>
+<a name="147"><span class="lineNum"> 147 </span> : : {</a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : if (!ahdr || index &gt;= be32_to_cpu(ahdr-&gt;ecnt))</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : return (const void * )ahdr + be32_to_cpu(ahdr-&gt;offset) +</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : index * be32_to_cpu(ahdr-&gt;esize);</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : }</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> : : struct HDIF_child_ptr *</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 14 : HDIF_child_arr(const struct HDIF_common_hdr *hdif, unsigned int idx)</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : {</a>
+<a name="158"><span class="lineNum"> 158 </span> : : struct HDIF_child_ptr *children;</a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 14 : children = (void *)hdif + be32_to_cpu(hdif-&gt;child_off);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 14 : if (idx &gt;= be16_to_cpu(hdif-&gt;child_count)) {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: child array idx out of range!\n&quot;);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 14 : return &amp;children[idx];</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : }</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 18 : struct HDIF_common_hdr *HDIF_child(const struct HDIF_common_hdr *hdif,</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : const struct HDIF_child_ptr *child,</a>
+<a name="173"><span class="lineNum"> 173 </span> : : unsigned int idx,</a>
+<a name="174"><span class="lineNum"> 174 </span> : : const char *eyecatcher)</a>
+<a name="175"><span class="lineNum"> 175 </span> : : {</a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 18 : void *base = (void *)hdif;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : struct HDIF_common_hdr *ret;</a>
+<a name="178"><span class="lineNum"> 178 </span> : : long child_off;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> : : /* child must be in hdif's child array */</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 18 : child_off = (void *)child - (base + be32_to_cpu(hdif-&gt;child_off));</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 18 : assert(child_off % sizeof(struct HDIF_child_ptr) == 0);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 18 : assert(child_off / sizeof(struct HDIF_child_ptr)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : &lt; be16_to_cpu(hdif-&gt;child_count));</a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 18 : assert(idx &lt; be32_to_cpu(child-&gt;count));</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 18 : if (be32_to_cpu(child-&gt;size) &lt; sizeof(struct HDIF_common_hdr)) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: %s child #%i too small: %u\n&quot;,</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : eyecatcher, idx, be32_to_cpu(child-&gt;size));</a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 18 : ret = base + be32_to_cpu(child-&gt;offset)</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 18 : + be32_to_cpu(child-&gt;size) * idx;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 18 : if (!HDIF_check(ret, eyecatcher)) {</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HDIF: #%i bad type (wanted %6s, got %6s)\n&quot;,</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : idx, eyecatcher, ret-&gt;id);</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : backtrace();</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : }</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 18 : return ret;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hdif.h.func-sort-c.html b/coverage-report/hdata/hdif.h.func-sort-c.html
new file mode 100644
index 0000000..719d3db
--- /dev/null
+++ b/coverage-report/hdata/hdif.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hdif.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hdif.h<span style="font-size: 80%;"> (<a href="hdif.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="hdif.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.h.gcov.html#64">HDIF_check</a></td>
+ <td class="coverFnHi">558</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hdif.h.func.html b/coverage-report/hdata/hdif.h.func.html
new file mode 100644
index 0000000..5af077f
--- /dev/null
+++ b/coverage-report/hdata/hdif.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hdif.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hdif.h<span style="font-size: 80%;"> (<a href="hdif.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="hdif.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdif.h.gcov.html#64">HDIF_check</a></td>
+ <td class="coverFnHi">558</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hdif.h.gcov.html b/coverage-report/hdata/hdif.h.gcov.html
new file mode 100644
index 0000000..4d78055
--- /dev/null
+++ b/coverage-report/hdata/hdif.h.gcov.html
@@ -0,0 +1,231 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hdif.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hdif.h<span style="font-size: 80%;"> (source / <a href="hdif.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __HDIF_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __HDIF_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;types.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : struct HDIF_common_hdr {</a>
+<a name="12"><span class="lineNum"> 12 </span> : : __be16 d1f0; /* 0xd1f0 */</a>
+<a name="13"><span class="lineNum"> 13 </span> : : char id[6]; /* eye catcher string */</a>
+<a name="14"><span class="lineNum"> 14 </span> : : __be16 instnum; /* instance number */</a>
+<a name="15"><span class="lineNum"> 15 </span> : : __be16 version; /* version */</a>
+<a name="16"><span class="lineNum"> 16 </span> : : __be32 total_len; /* total structure length */</a>
+<a name="17"><span class="lineNum"> 17 </span> : : __be32 hdr_len; /* header length (currently 0x20) */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : __be32 idptr_off; /* offset to idata pointers */</a>
+<a name="19"><span class="lineNum"> 19 </span> : : __be16 idptr_count; /* number of idata pointers */</a>
+<a name="20"><span class="lineNum"> 20 </span> : : __be16 child_count; /* number of child structures */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : __be32 child_off; /* offset to child structures array */</a>
+<a name="22"><span class="lineNum"> 22 </span> : : } __packed __align(0x10);</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct HDIF_idata_ptr {</a>
+<a name="25"><span class="lineNum"> 25 </span> : : __be32 offset;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : __be32 size;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : } __packed __align(0x8);</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct HDIF_array_hdr {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : __be32 offset;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : __be32 ecnt;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : __be32 esize;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : __be32 eactsz;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : } __packed __align(0x4);</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : struct HDIF_child_ptr {</a>
+<a name="37"><span class="lineNum"> 37 </span> : : __be32 offset;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : __be32 size;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : __be32 count;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : } __packed;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define HDIF_HDR_LEN (sizeof(struct HDIF_common_hdr))</a>
+<a name="43"><span class="lineNum"> 43 </span> : : #define HDIF_ARRAY_OFFSET (sizeof(struct HDIF_array_hdr))</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : #define HDIF_ID(_id) .d1f0 = CPU_TO_BE16(0xd1f0), .id = _id</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : #define HDIF_SIMPLE_HDR(id, vers, type) \</a>
+<a name="48"><span class="lineNum"> 48 </span> : : { \</a>
+<a name="49"><span class="lineNum"> 49 </span> : : HDIF_ID(id), \</a>
+<a name="50"><span class="lineNum"> 50 </span> : : .instnum = CPU_TO_BE16(0), \</a>
+<a name="51"><span class="lineNum"> 51 </span> : : .version = CPU_TO_BE16(vers), \</a>
+<a name="52"><span class="lineNum"> 52 </span> : : .total_len = CPU_TO_BE32(sizeof(type)), \</a>
+<a name="53"><span class="lineNum"> 53 </span> : : .hdr_len = CPU_TO_BE32(HDIF_HDR_LEN), \</a>
+<a name="54"><span class="lineNum"> 54 </span> : : .idptr_off = CPU_TO_BE32(HDIF_HDR_LEN), \</a>
+<a name="55"><span class="lineNum"> 55 </span> : : .idptr_count = CPU_TO_BE16(1), \</a>
+<a name="56"><span class="lineNum"> 56 </span> : : .child_count = CPU_TO_BE16(0), \</a>
+<a name="57"><span class="lineNum"> 57 </span> : : .child_off = CPU_TO_BE32(0), \</a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : #define HDIF_IDATA_PTR(_offset, _size) \</a>
+<a name="61"><span class="lineNum"> 61 </span> : : { \</a>
+<a name="62"><span class="lineNum"> 62 </span> : : .offset = CPU_TO_BE32(_offset), \</a>
+<a name="63"><span class="lineNum"> 63 </span> : : .size = CPU_TO_BE32(_size), \</a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 558 : static inline bool HDIF_check(const void *hdif, const char id[])</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 558 : const struct HDIF_common_hdr *hdr = hdif;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1116 : return hdr-&gt;d1f0 == CPU_TO_BE16(0xd1f0) &amp;&amp;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 558 : memcmp(hdr-&gt;id, id, sizeof(hdr-&gt;id)) == 0;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : }</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* HDIF_get_idata - Get a pointer to internal data block</a>
+<a name="75"><span class="lineNum"> 75 </span> : : *</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * @hdif : HDIF structure pointer</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * @di : Index of the idata pointer</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * @size : Return the data size (or NULL if ignored)</a>
+<a name="79"><span class="lineNum"> 79 </span> : : */</a>
+<a name="80"><span class="lineNum"> 80 </span> : : extern const void *HDIF_get_idata(const struct HDIF_common_hdr *hdif,</a>
+<a name="81"><span class="lineNum"> 81 </span> : : unsigned int di,</a>
+<a name="82"><span class="lineNum"> 82 </span> : : unsigned int *size);</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : /* HDIF_get_iarray - Get a pointer to an elemnt of an internal data array</a>
+<a name="85"><span class="lineNum"> 85 </span> : : *</a>
+<a name="86"><span class="lineNum"> 86 </span> : : * @hdif : HDIF structure pointer</a>
+<a name="87"><span class="lineNum"> 87 </span> : : * @di : Index of the idata pointer</a>
+<a name="88"><span class="lineNum"> 88 </span> : : * @ai : Index in the resulting array</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * @size : Return the entry actual size (or NULL if ignored)</a>
+<a name="90"><span class="lineNum"> 90 </span> : : */</a>
+<a name="91"><span class="lineNum"> 91 </span> : : extern const void *HDIF_get_iarray_item(const struct HDIF_common_hdr *hdif,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : unsigned int di,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : unsigned int ai, unsigned int *size);</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : /* HDIF_get_iarray - Get a pointer to an internal array header</a>
+<a name="96"><span class="lineNum"> 96 </span> : : *</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * @hdif : HDIF structure pointer</a>
+<a name="98"><span class="lineNum"> 98 </span> : : * @di : Index of the idata pointer</a>
+<a name="99"><span class="lineNum"> 99 </span> : : * @ai : Index in the resulting array</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * @size : Return the entry actual size (or NULL if ignored)</a>
+<a name="101"><span class="lineNum"> 101 </span> : : */</a>
+<a name="102"><span class="lineNum"> 102 </span> : : extern const struct HDIF_array_hdr *HDIF_get_iarray(</a>
+<a name="103"><span class="lineNum"> 103 </span> : : const struct HDIF_common_hdr *hdif, unsigned int di,</a>
+<a name="104"><span class="lineNum"> 104 </span> : : unsigned int *items);</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : extern const void *HDIF_iarray_item(const struct HDIF_array_hdr *hdif,</a>
+<a name="107"><span class="lineNum"> 107 </span> : : unsigned int index);</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> : : #define HDIF_iarray_for_each(arr, idx, ptr) \</a>
+<a name="110"><span class="lineNum"> 110 </span> : : for (idx = 0, ptr = HDIF_iarray_item(arr, idx); \</a>
+<a name="111"><span class="lineNum"> 111 </span> : : ptr; idx++, ptr = HDIF_iarray_item(arr, idx))</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : /* HDIF_get_iarray_size - Get the number of elements of an internal data array</a>
+<a name="114"><span class="lineNum"> 114 </span> : : *</a>
+<a name="115"><span class="lineNum"> 115 </span> : : * @hdif : HDIF structure pointer</a>
+<a name="116"><span class="lineNum"> 116 </span> : : * @di : Index of the idata pointer</a>
+<a name="117"><span class="lineNum"> 117 </span> : : *</a>
+<a name="118"><span class="lineNum"> 118 </span> : : * A negative result means an error</a>
+<a name="119"><span class="lineNum"> 119 </span> : : */</a>
+<a name="120"><span class="lineNum"> 120 </span> : : extern int HDIF_get_iarray_size(const struct HDIF_common_hdr *hdif,</a>
+<a name="121"><span class="lineNum"> 121 </span> : : unsigned int di);</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> : : /* HDIF_child_arr - Get a child array from this HDIF.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : *</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * @hdif : HDIF structure pointer</a>
+<a name="126"><span class="lineNum"> 126 </span> : : * @idx : the child to get</a>
+<a name="127"><span class="lineNum"> 127 </span> : : *</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * NULL means an error (not that many children).</a>
+<a name="129"><span class="lineNum"> 129 </span> : : */</a>
+<a name="130"><span class="lineNum"> 130 </span> : : extern struct HDIF_child_ptr *</a>
+<a name="131"><span class="lineNum"> 131 </span> : : HDIF_child_arr(const struct HDIF_common_hdr *hdif, unsigned int idx);</a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> : : /* HDIF_child - Deref a child_ptr entry.</a>
+<a name="134"><span class="lineNum"> 134 </span> : : *</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * @hdif : HDIF structure pointer</a>
+<a name="136"><span class="lineNum"> 136 </span> : : * @child : the child returned from HDIF_child_arr</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * @idx : the index of the child to get (&lt; child-&gt;count).</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * @eyecatcher: the 6-char ID expected for this child.</a>
+<a name="139"><span class="lineNum"> 139 </span> : : *</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * NULL means an error.</a>
+<a name="141"><span class="lineNum"> 141 </span> : : */</a>
+<a name="142"><span class="lineNum"> 142 </span> : : extern struct HDIF_common_hdr *HDIF_child(const struct HDIF_common_hdr *hdif,</a>
+<a name="143"><span class="lineNum"> 143 </span> : : const struct HDIF_child_ptr *child,</a>
+<a name="144"><span class="lineNum"> 144 </span> : : unsigned int idx,</a>
+<a name="145"><span class="lineNum"> 145 </span> : : const char *eyecatcher);</a>
+<a name="146"><span class="lineNum"> 146 </span> : : #endif /* __HDIF_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hostservices.c.func-sort-c.html b/coverage-report/hdata/hostservices.c.func-sort-c.html
new file mode 100644
index 0000000..f22efc2
--- /dev/null
+++ b/coverage-report/hdata/hostservices.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hostservices.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hostservices.c<span style="font-size: 80%;"> (<a href="hostservices.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryMed">81.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="hostservices.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hostservices.c.gcov.html#39">hservice_parse_dt_tree</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hostservices.c.gcov.html#53">hservices_from_hdat</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hostservices.c.gcov.html#15">merge_property</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hostservices.c.func.html b/coverage-report/hdata/hostservices.c.func.html
new file mode 100644
index 0000000..a1dd06b
--- /dev/null
+++ b/coverage-report/hdata/hostservices.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hostservices.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hostservices.c<span style="font-size: 80%;"> (<a href="hostservices.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryMed">81.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="hostservices.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hostservices.c.gcov.html#39">hservice_parse_dt_tree</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hostservices.c.gcov.html#53">hservices_from_hdat</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hostservices.c.gcov.html#15">merge_property</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/hostservices.c.gcov.html b/coverage-report/hdata/hostservices.c.gcov.html
new file mode 100644
index 0000000..a6c399a
--- /dev/null
+++ b/coverage-report/hdata/hostservices.c.gcov.html
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/hostservices.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - hostservices.c<span style="font-size: 80%;"> (source / <a href="hostservices.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryMed">81.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;libfdt/libfdt.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;device.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;hostservices.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;spira.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 6 : static void merge_property(const struct dt_node *src_root,</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : struct dt_node *dst_root,</a>
+<a name="19"><span class="lineNum"> 19 </span> : : const char *name)</a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> : : const struct dt_property *src;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct dt_property *dst;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : /* Nothing to merge if old one doesn't exist. */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 6 : src = dt_find_property(src_root, name);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 6 : if (!src)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Just create a new one if there's none in dst. */</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 6 : dst = __dt_find_property(dst_root, name);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 6 : if (!dst) {</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 6 : dt_add_property(dst_root, name, src-&gt;prop, src-&gt;len);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : /* Append src to dst. */</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : dt_resize_property(&amp;dst, dst-&gt;len + src-&gt;len);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : memcpy(dst-&gt;prop + dst-&gt;len, src-&gt;prop, src-&gt;len);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : }</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 2 : static void hservice_parse_dt_tree(const struct dt_node *src)</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : {</a>
+<a name="43"><span class="lineNum"> 43 </span> : : const struct dt_property *sprop;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : /* Copy/merge reserved names &amp; ranges properties. */</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 12 : list_for_each(&amp;src-&gt;properties, sprop, list) {</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 10 : if (streq(sprop-&gt;name, &quot;reserved-names&quot;) ||</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 8 : streq(sprop-&gt;name, &quot;reserved-ranges&quot;) ||</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 6 : streq(sprop-&gt;name, &quot;ibm,enabled-idle-states&quot;))</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 6 : merge_property(src, dt_root, sprop-&gt;name);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : /* Get host services information from hdat. */</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 2 : bool hservices_from_hdat(const void *fdt, size_t size)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> : : int err;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : struct dt_node *hservices;</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;HBRT: Found mini-DT at 0x%p size: 0x%08lx\n&quot;,</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : fdt, size);</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : /* For diagnostic purposes, we copy the whole blob over */</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 2 : dt_add_property(dt_root, &quot;ibm,hbrt-mini-fdt&quot;, fdt, size);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : /* Parse &amp; extract relevant properties */</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 2 : err = fdt_check_header(fdt);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 2 : if (err) {</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HBRT: fdt blob %p hdr error %d\n&quot;, fdt, err);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : }</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 2 : hservices = dt_new_root(&quot;ibm,hostservices&quot;);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 2 : err = dt_expand_node(hservices, fdt, 0);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 2 : if (err &lt; 0) {</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HBRT: fdt blob %p parse error %d\n&quot;, fdt, err);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 2 : hservice_parse_dt_tree(hservices);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 2 : dt_free(hservices);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 2 : return true;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/i2c.c.func-sort-c.html b/coverage-report/hdata/i2c.c.func-sort-c.html
new file mode 100644
index 0000000..07ec7c1
--- /dev/null
+++ b/coverage-report/hdata/i2c.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/i2c.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - i2c.c<span style="font-size: 80%;"> (<a href="i2c.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="i2c.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#61">get_bus_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#31">get_i2cm_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#160">get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#173">is_zeros</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#149">map_type</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#190">parse_i2c_devs</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/i2c.c.func.html b/coverage-report/hdata/i2c.c.func.html
new file mode 100644
index 0000000..5fb2d4f
--- /dev/null
+++ b/coverage-report/hdata/i2c.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/i2c.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - i2c.c<span style="font-size: 80%;"> (<a href="i2c.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="i2c.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#61">get_bus_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#31">get_i2cm_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#160">get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#173">is_zeros</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#149">map_type</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="i2c.c.gcov.html#190">parse_i2c_devs</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/i2c.c.gcov.html b/coverage-report/hdata/i2c.c.gcov.html
new file mode 100644
index 0000000..9c32d88
--- /dev/null
+++ b/coverage-report/hdata/i2c.c.gcov.html
@@ -0,0 +1,445 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/i2c.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - i2c.c<span style="font-size: 80%;"> (source / <a href="i2c.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2017-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;device.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;interrupts.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;chip.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;spira.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct i2c_dev {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : uint8_t i2cm_engine;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : uint8_t i2cm_port;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : __be16 i2c_bus_freq;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : /* i2c slave info */</a>
+<a name="20"><span class="lineNum"> 20 </span> : : uint8_t type;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint8_t dev_addr;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : uint8_t dev_port;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : uint8_t __reserved;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : __be32 purpose;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : __be32 i2c_link;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : __be16 slca_index;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : };</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : #define P9_I2CM_XSCOM_SIZE 0x1000</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #define P9_I2CM_XSCOM_BASE 0xa0000</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : static struct dt_node *get_i2cm_node(struct dt_node *xscom, int engine)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : {</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : uint64_t xscom_base = P9_I2CM_XSCOM_BASE + P9_I2CM_XSCOM_SIZE * (uint64_t)engine;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : struct dt_node *i2cm;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : uint64_t freq, clock;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : i2cm = dt_find_by_name_addr(xscom, &quot;i2cm&quot;, xscom_base);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : if (!i2cm) {</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : i2cm = dt_new_addr(xscom, &quot;i2cm&quot;, xscom_base);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(i2cm, &quot;reg&quot;, xscom_base,</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : P9_I2CM_XSCOM_SIZE);</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(i2cm, &quot;compatible&quot;,</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : &quot;ibm,power8-i2cm&quot;, &quot;ibm,power9-i2cm&quot;);</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(i2cm, &quot;#size-cells&quot;, 0);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(i2cm, &quot;#address-cells&quot;, 1);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(i2cm, &quot;chip-engine#&quot;, engine);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : freq = dt_prop_get_u64_def(xscom, &quot;bus-frequency&quot;, 0);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : clock = (u32)(freq / 4);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : if (clock)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(i2cm, &quot;clock-frequency&quot;, clock);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : else</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(i2cm, &quot;clock-frequency&quot;, 150000000);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : return i2cm;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineNoCov"> 0 : static struct dt_node *get_bus_node(struct dt_node *i2cm, int port, int freq)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> : : struct dt_node *bus;</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : bus = dt_find_by_name_addr(i2cm, &quot;i2c-bus&quot;, port);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : if (!bus) {</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : bus = dt_new_addr(i2cm, &quot;i2c-bus&quot;, port);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(bus, &quot;reg&quot;, port);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(bus, &quot;#size-cells&quot;, 0);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(bus, &quot;#address-cells&quot;, 1);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* The P9 I2C master is fully compatible with the P8 one */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(bus, &quot;compatible&quot;, &quot;ibm,opal-i2c&quot;,</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : &quot;ibm,power8-i2c-port&quot;, &quot;ibm,power9-i2c-port&quot;);</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /*</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * use the clock frequency as the bus frequency until we</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * have actual devices on the bus. Adding a device will</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * reduce the frequency to something that all devices</a>
+<a name="82"><span class="lineNum"> 82 </span> : : * can tolerate.</a>
+<a name="83"><span class="lineNum"> 83 </span> : : */</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(bus, &quot;bus-frequency&quot;, freq * 1000);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : }</a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : return bus;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : struct hdat_i2c_type {</a>
+<a name="91"><span class="lineNum"> 91 </span> : : uint32_t id;</a>
+<a name="92"><span class="lineNum"> 92 </span> : : const char *name;</a>
+<a name="93"><span class="lineNum"> 93 </span> : : const char *compat;</a>
+<a name="94"><span class="lineNum"> 94 </span> : : };</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : static struct hdat_i2c_type hdat_i2c_devs[] = {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : { 0x1, &quot;gpio&quot;, &quot;nxp,pca9551&quot; },</a>
+<a name="98"><span class="lineNum"> 98 </span> : : /* XXX: Please verify that all VPD EEPROMs are of this type */</a>
+<a name="99"><span class="lineNum"> 99 </span> : : { 0x2, &quot;eeprom&quot;, &quot;atmel,24c128&quot; },</a>
+<a name="100"><span class="lineNum"> 100 </span> : : { 0x3, &quot;tpm&quot;, &quot;nuvoton,npct650&quot; },</a>
+<a name="101"><span class="lineNum"> 101 </span> : : { 0x4, &quot;i2c&quot;, NULL }, /* MEX-FPGA */</a>
+<a name="102"><span class="lineNum"> 102 </span> : : { 0x5, &quot;i2c&quot;, NULL }, /* UCX90xx devs for PCI Hotplug */</a>
+<a name="103"><span class="lineNum"> 103 </span> : : { 0x6, &quot;gpio&quot;, &quot;nxp,pca9552&quot; },</a>
+<a name="104"><span class="lineNum"> 104 </span> : : { 0x7, &quot;gpio&quot;, &quot;nxp,pca9553&quot; },</a>
+<a name="105"><span class="lineNum"> 105 </span> : : { 0x8, &quot;gpio&quot;, &quot;nxp,pca9554&quot; },</a>
+<a name="106"><span class="lineNum"> 106 </span> : : { 0x9, &quot;gpio&quot;, &quot;nxp,pca9555&quot; },</a>
+<a name="107"><span class="lineNum"> 107 </span> : : { 0xa, &quot;i2c&quot;, NULL }, /* SMP/OpenCAPI Cable */</a>
+<a name="108"><span class="lineNum"> 108 </span> : : { 0xb, &quot;eeprom&quot;, &quot;atmel,24c256&quot; },</a>
+<a name="109"><span class="lineNum"> 109 </span> : : { 0xc, &quot;i2c&quot;, NULL }, /* Thermal Sensor */</a>
+<a name="110"><span class="lineNum"> 110 </span> : : { 0xd, &quot;eeprom&quot;, &quot;atmel,24c04&quot; },</a>
+<a name="111"><span class="lineNum"> 111 </span> : : { 0xe, &quot;eeprom&quot;, &quot;atmel,24c512&quot; },</a>
+<a name="112"><span class="lineNum"> 112 </span> : : { 0xf, &quot;eeprom&quot;, &quot;atmel,24c32&quot; },</a>
+<a name="113"><span class="lineNum"> 113 </span> : : { 0x10, &quot;eeprom&quot;, &quot;atmel,24c64&quot; },</a>
+<a name="114"><span class="lineNum"> 114 </span> : : { 0x11, &quot;eeprom&quot;, &quot;atmel,24c16&quot; },</a>
+<a name="115"><span class="lineNum"> 115 </span> : : { 0x12, &quot;i2c&quot;, NULL }, /* NVDIA GPU */</a>
+<a name="116"><span class="lineNum"> 116 </span> : : { 0x13, &quot;i2c&quot;, &quot;nxp,lpc11u35&quot; },</a>
+<a name="117"><span class="lineNum"> 117 </span> : : };</a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : struct hdat_i2c_info {</a>
+<a name="120"><span class="lineNum"> 120 </span> : : uint32_t id;</a>
+<a name="121"><span class="lineNum"> 121 </span> : : bool allowed; /* true if the host may use the device */</a>
+<a name="122"><span class="lineNum"> 122 </span> : : const char *label;</a>
+<a name="123"><span class="lineNum"> 123 </span> : : };</a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> : : static struct hdat_i2c_info hdat_i2c_extra_info[] = {</a>
+<a name="126"><span class="lineNum"> 126 </span> : : { 0x1, false, &quot;led-controller&quot; },</a>
+<a name="127"><span class="lineNum"> 127 </span> : : { 0x2, false, &quot;pci-hotplug-pgood&quot; },</a>
+<a name="128"><span class="lineNum"> 128 </span> : : { 0x3, false, &quot;pci-hotplug-control&quot; },</a>
+<a name="129"><span class="lineNum"> 129 </span> : : { 0x4, true, &quot;tpm&quot; },</a>
+<a name="130"><span class="lineNum"> 130 </span> : : { 0x5, true, &quot;module-vpd&quot; },</a>
+<a name="131"><span class="lineNum"> 131 </span> : : { 0x6, true, &quot;dimm-spd&quot; },</a>
+<a name="132"><span class="lineNum"> 132 </span> : : { 0x7, true, &quot;proc-vpd&quot; },</a>
+<a name="133"><span class="lineNum"> 133 </span> : : { 0x8, false, &quot;sbe-eeprom&quot;},</a>
+<a name="134"><span class="lineNum"> 134 </span> : : { 0x9, true, &quot;planar-vpd&quot; },</a>
+<a name="135"><span class="lineNum"> 135 </span> : : { 0xa, false, &quot;opencapi-topology&quot; },</a>
+<a name="136"><span class="lineNum"> 136 </span> : : { 0xb, false, &quot;opencapi-micro-reset&quot; },</a>
+<a name="137"><span class="lineNum"> 137 </span> : : { 0xc, false, &quot;nvlink-cable&quot; },</a>
+<a name="138"><span class="lineNum"> 138 </span> : : { 0xd, false, &quot;secure-window-open&quot; },</a>
+<a name="139"><span class="lineNum"> 139 </span> : : { 0xe, false, &quot;physical-presence&quot; },</a>
+<a name="140"><span class="lineNum"> 140 </span> : : { 0xf, false, &quot;mex-fpga&quot; },</a>
+<a name="141"><span class="lineNum"> 141 </span> : : { 0x10, false, &quot;thermal-sensor&quot; },</a>
+<a name="142"><span class="lineNum"> 142 </span> : : { 0x11, false, &quot;host-i2c-enable&quot; },</a>
+<a name="143"><span class="lineNum"> 143 </span> : : { 0x12, false, &quot;gpu-config&quot; },</a>
+<a name="144"><span class="lineNum"> 144 </span> : : };</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> : : /*</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * this is pretty half-assed, to generate the labels properly we need to look</a>
+<a name="148"><span class="lineNum"> 148 </span> : : * up associated SLCA index and determine what kind of module the device is on</a>
+<a name="149"><span class="lineNum"> 149 </span> : : * and why</a>
+<a name="150"><span class="lineNum"> 150 </span> : : */</a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineNoCov"> 0 : static struct hdat_i2c_type *map_type(uint32_t type)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : {</a>
+<a name="153"><span class="lineNum"> 153 </span> : : int i;</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; ARRAY_SIZE(hdat_i2c_devs); i++)</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : if (hdat_i2c_devs[i].id == type)</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : return &amp;hdat_i2c_devs[i];</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : static struct hdat_i2c_info *get_info(uint32_t type)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : {</a>
+<a name="164"><span class="lineNum"> 164 </span> : : static struct hdat_i2c_info no_info =</a>
+<a name="165"><span class="lineNum"> 165 </span> : : { .id = 0x0, .allowed = false, .label = &quot;&quot; };</a>
+<a name="166"><span class="lineNum"> 166 </span> : : int i;</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; ARRAY_SIZE(hdat_i2c_extra_info); i++)</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : if (hdat_i2c_extra_info[i].id == type)</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return &amp;hdat_i2c_extra_info[i];</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineNoCov"> 0 : return &amp;no_info;</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : }</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : static bool is_zeros(const void *p, size_t size)</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : {</a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : const char *c = p;</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : size_t i;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; size; i++)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : if (c[i] != 0)</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="185"><span class="lineNum"> 185 </span> : : }</a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> : : struct host_i2c_hdr {</a>
+<a name="188"><span class="lineNum"> 188 </span> : : const struct HDIF_array_hdr hdr;</a>
+<a name="189"><span class="lineNum"> 189 </span> : : __be32 version;</a>
+<a name="190"><span class="lineNum"> 190 </span> : : } __packed __align(0x4);</a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : int parse_i2c_devs(const struct HDIF_common_hdr *hdr, int idata_index,</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : struct dt_node *xscom)</a>
+<a name="194"><span class="lineNum"> 194 </span> : : {</a>
+<a name="195"><span class="lineNum"> 195 </span> : : struct dt_node *i2cm, *bus, *node;</a>
+<a name="196"><span class="lineNum"> 196 </span> : : const struct hdat_i2c_type *type;</a>
+<a name="197"><span class="lineNum"> 197 </span> : : const struct hdat_i2c_info *info;</a>
+<a name="198"><span class="lineNum"> 198 </span> : : const struct i2c_dev *dev;</a>
+<a name="199"><span class="lineNum"> 199 </span> : : const char *name, *compat;</a>
+<a name="200"><span class="lineNum"> 200 </span> : : const struct host_i2c_hdr *ahdr;</a>
+<a name="201"><span class="lineNum"> 201 </span> : : uint32_t dev_addr;</a>
+<a name="202"><span class="lineNum"> 202 </span> : : uint32_t version;</a>
+<a name="203"><span class="lineNum"> 203 </span> : : uint32_t size;</a>
+<a name="204"><span class="lineNum"> 204 </span> : : uint32_t purpose;</a>
+<a name="205"><span class="lineNum"> 205 </span> : : int i, count;</a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> : : /*</a>
+<a name="208"><span class="lineNum"> 208 </span> : : * This code makes a few assumptions about XSCOM addrs, etc</a>
+<a name="209"><span class="lineNum"> 209 </span> : : * and will need updating for new processors</a>
+<a name="210"><span class="lineNum"> 210 </span> : : */</a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : assert(proc_gen == proc_gen_p9);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /*</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * Emit an error if we get a newer version. This is an interim measure</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * until the new version format is finalised.</a>
+<a name="216"><span class="lineNum"> 216 </span> : : */</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : ahdr = HDIF_get_idata(hdr, idata_index, &amp;size);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : if (!ahdr || !size)</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : /*</a>
+<a name="222"><span class="lineNum"> 222 </span> : : * Some hostboots don't correctly fill the version field. On these</a>
+<a name="223"><span class="lineNum"> 223 </span> : : * the offset from the start of the header to the start of the array</a>
+<a name="224"><span class="lineNum"> 224 </span> : : * is 16 bytes.</a>
+<a name="225"><span class="lineNum"> 225 </span> : : */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(ahdr-&gt;hdr.offset) == 16) {</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : version = 1;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : prerror(&quot;I2C: HDAT device array has no version! Assuming v1\n&quot;);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : } else {</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : version = be32_to_cpu(ahdr-&gt;version);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : }</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : if (version == 2) {</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;I2C: v%d found, but not supported. Parsing as v1\n&quot;,</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : version);</a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : } else if (version &gt; 2) {</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : prerror(&quot;I2C: v%d found, but not supported! THIS IS A BUG\n&quot;,</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : version);</a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : count = HDIF_get_iarray_size(hdr, idata_index);</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : dev = HDIF_get_iarray_item(hdr, idata_index, i, &amp;size);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> : : /*</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * XXX: Some broken hostboots populate i2c devs with zeros.</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * Workaround them for now.</a>
+<a name="249"><span class="lineNum"> 249 </span> : : */</a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : if (is_zeros(dev, size)) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : prerror(&quot;I2C: Ignoring broken i2c dev %d\n&quot;, i);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : }</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /*</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * On some systems the CFAM I2C master is represented in the</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * host I2C table as engine 6. There are only 4 (0, 1, 2, 3)</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * engines accessible to the host via XSCOM so filter out</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * engines outside this range so we don't create bogus</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * i2cm@&lt;addr&gt; nodes.</a>
+<a name="261"><span class="lineNum"> 261 </span> : : */</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : if (dev-&gt;i2cm_engine &gt;= 4 &amp;&amp; proc_gen == proc_gen_p9)</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : i2cm = get_i2cm_node(xscom, dev-&gt;i2cm_engine);</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : bus = get_bus_node(i2cm, dev-&gt;i2cm_port,</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : be16_to_cpu(dev-&gt;i2c_bus_freq));</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : </a>
+<a name="269"><span class="lineNum"> 269 </span> : : /*</a>
+<a name="270"><span class="lineNum"> 270 </span> : : * Looks like hostboot gives the address as an 8 bit, left</a>
+<a name="271"><span class="lineNum"> 271 </span> : : * justified quantity (i.e it includes the R/W bit). So we need</a>
+<a name="272"><span class="lineNum"> 272 </span> : : * to strip it off to get an address linux can use.</a>
+<a name="273"><span class="lineNum"> 273 </span> : : */</a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineNoCov"> 0 : dev_addr = dev-&gt;dev_addr &gt;&gt; 1;</span></a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : purpose = be32_to_cpu(dev-&gt;purpose);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : type = map_type(dev-&gt;type);</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : info = get_info(purpose);</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> : : /* HACK: Hostboot doesn't export the correct type information</a>
+<a name="281"><span class="lineNum"> 281 </span> : : * for the DIMM SPD EEPROMs. This is a problem because SPD</a>
+<a name="282"><span class="lineNum"> 282 </span> : : * EEPROMs have a different wire protocol to the atmel,24XXXX</a>
+<a name="283"><span class="lineNum"> 283 </span> : : * series. The main difference being that SPD EEPROMs have an</a>
+<a name="284"><span class="lineNum"> 284 </span> : : * 8bit offset rather than a 16bit offset. This means that the</a>
+<a name="285"><span class="lineNum"> 285 </span> : : * driver will send 2 bytes when doing a random read,</a>
+<a name="286"><span class="lineNum"> 286 </span> : : * potentially overwriting part of the SPD information.</a>
+<a name="287"><span class="lineNum"> 287 </span> : : *</a>
+<a name="288"><span class="lineNum"> 288 </span> : : * Just to make things interested the FSP also gets the device</a>
+<a name="289"><span class="lineNum"> 289 </span> : : * type wrong. To work around both just set the device-type to</a>
+<a name="290"><span class="lineNum"> 290 </span> : : * &quot;spd&quot; for anything in the 0x50 to 0x57 range since that's the</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * SPD eeprom range.</a>
+<a name="292"><span class="lineNum"> 292 </span> : : *</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * XXX: Future chips might not use engine 3 for the DIMM buses.</a>
+<a name="294"><span class="lineNum"> 294 </span> : : */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : if (dev-&gt;i2cm_engine == 3 &amp;&amp; dev_addr &gt;= 0x50</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineNoCov"> 0 : &amp;&amp; dev_addr &lt; 0x58) {</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineNoCov"> 0 : compat = &quot;spd&quot;;</span></a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : name = &quot;eeprom&quot;;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : } else if (type) {</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : compat = type-&gt;compat;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : name = type-&gt;name;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : } else {</a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : name = &quot;unknown&quot;;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : compat = NULL;</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : }</a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> : : /*</a>
+<a name="308"><span class="lineNum"> 308 </span> : : * An i2c device is unknown if either the i2c device list is</a>
+<a name="309"><span class="lineNum"> 309 </span> : : * outdated or the device is marked as unknown (0xFF) in the</a>
+<a name="310"><span class="lineNum"> 310 </span> : : * hdat. Log both cases to see what/where/why.</a>
+<a name="311"><span class="lineNum"> 311 </span> : : */</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : if (!type || dev-&gt;type == 0xFF) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;HDAT I2C: found e%dp%d - %s@%x dp:%02x (%#x:%s)\n&quot;,</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : dev-&gt;i2cm_engine, dev-&gt;i2cm_port, name, dev_addr,</a>
+<a name="315"><span class="lineNum"> 315 </span> : : dev-&gt;dev_port, purpose, info-&gt;label);</a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : }</a>
+<a name="318"><span class="lineNum"> 318 </span> : : </a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;HDAT I2C: found e%dp%d - %s@%x dp:%02x (%#x:%s)\n&quot;,</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : dev-&gt;i2cm_engine, dev-&gt;i2cm_port, name, dev_addr,</a>
+<a name="321"><span class="lineNum"> 321 </span> : : dev-&gt;dev_port, purpose, info-&gt;label);</a>
+<a name="322"><span class="lineNum"> 322 </span> : : </a>
+<a name="323"><span class="lineNum"> 323 </span> : : /*</a>
+<a name="324"><span class="lineNum"> 324 </span> : : * Multi-port device require special handling since we need to</a>
+<a name="325"><span class="lineNum"> 325 </span> : : * generate the device-specific DT bindings. For now we're just</a>
+<a name="326"><span class="lineNum"> 326 </span> : : * going to ignore them since these devices are owned by FW</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * any way.</a>
+<a name="328"><span class="lineNum"> 328 </span> : : */</a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineNoCov"> 0 : if (dev-&gt;dev_port != 0xff)</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : node = dt_new_addr(bus, name, dev_addr);</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineNoCov"> 0 : if (!node)</span></a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg&quot;, dev_addr);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;link-id&quot;,</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : be32_to_cpu(dev-&gt;i2c_link));</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : if (compat)</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;compatible&quot;, compat);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : if (info-&gt;label)</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;label&quot;, info-&gt;label);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineNoCov"> 0 : if (!info-&gt;allowed)</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;status&quot;, &quot;reserved&quot;);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : </a>
+<a name="346"><span class="lineNum"> 346 </span> : : /*</a>
+<a name="347"><span class="lineNum"> 347 </span> : : * Set a default timeout of 2s on the ports with a TPM. This is</a>
+<a name="348"><span class="lineNum"> 348 </span> : : * to work around a bug with certain TPM firmwares that can</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * clock stretch for long periods of time and will lock up</a>
+<a name="350"><span class="lineNum"> 350 </span> : : * until they are power cycled if a STOP condition is sent</a>
+<a name="351"><span class="lineNum"> 351 </span> : : * during this period.</a>
+<a name="352"><span class="lineNum"> 352 </span> : : */</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : if (dev-&gt;type == 0x3)</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(bus, &quot;timeout-ms&quot;, 2000);</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> : : /* XXX: SLCA index? */</a>
+<a name="357"><span class="lineNum"> 357 </span> : : }</a>
+<a name="358"><span class="lineNum"> 358 </span> : : </a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/index-sort-b.html b/coverage-report/hdata/index-sort-b.html
new file mode 100644
index 0000000..85f1928
--- /dev/null
+++ b/coverage-report/hdata/index-sort-b.html
@@ -0,0 +1,275 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hdata</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1237</td>
+ <td class="headerCovTableEntry">2675</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">147</td>
+ <td class="headerCovTableEntryLo">68.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="iohub.c.gcov.html">iohub.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=27 height=10 alt="27.4%"><img src="../snow.png" width=73 height=10 alt="27.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">27.4&nbsp;%</td>
+ <td class="coverNumLo">100 / 365</td>
+ <td class="coverPerLo">40.0&nbsp;%</td>
+ <td class="coverNumLo">8 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hostservices.c.gcov.html">hostservices.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="81.2%"><img src="../snow.png" width=19 height=10 alt="81.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.2&nbsp;%</td>
+ <td class="coverNumMed">26 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=76 height=10 alt="75.8%"><img src="../snow.png" width=24 height=10 alt="75.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.8&nbsp;%</td>
+ <td class="coverNumMed">207 / 273</td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">17 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="slca.c.gcov.html">slca.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=64 height=10 alt="64.3%"><img src="../snow.png" width=36 height=10 alt="64.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">45 / 70</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.c.gcov.html">spira.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="52.1%"><img src="../snow.png" width=48 height=10 alt="52.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">52.1&nbsp;%</td>
+ <td class="coverNumLo">379 / 728</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">28 / 35</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.h.gcov.html">spira.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.4%"><img src="../snow.png" width=64 height=10 alt="36.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.4&nbsp;%</td>
+ <td class="coverNumLo">4 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fsp.c.gcov.html">fsp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=38 height=10 alt="37.5%"><img src="../snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">90 / 240</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tpmrel.c.gcov.html">tpmrel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 92</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.c.gcov.html">hdif.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=51 height=10 alt="50.5%"><img src="../snow.png" width=49 height=10 alt="50.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.5&nbsp;%</td>
+ <td class="coverNumLo">47 / 93</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd-common.c.gcov.html">vpd-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=80 height=10 alt="80.0%"><img src="../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpu-common.c.gcov.html">cpu-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="69.1%"><img src="../snow.png" width=31 height=10 alt="69.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.1&nbsp;%</td>
+ <td class="coverNumLo">96 / 139</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pcia.c.gcov.html">pcia.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="80.8%"><img src="../snow.png" width=19 height=10 alt="80.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.8&nbsp;%</td>
+ <td class="coverNumMed">84 / 104</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memory.c.gcov.html">memory.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.0%"><img src="../snow.png" width=64 height=10 alt="36.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.0&nbsp;%</td>
+ <td class="coverNumLo">151 / 419</td>
+ <td class="coverPerLo">68.4&nbsp;%</td>
+ <td class="coverNumLo">13 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.h.gcov.html">hdif.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="i2c.c.gcov.html">i2c.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 100</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/index-sort-f.html b/coverage-report/hdata/index-sort-f.html
new file mode 100644
index 0000000..65f7de6
--- /dev/null
+++ b/coverage-report/hdata/index-sort-f.html
@@ -0,0 +1,275 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hdata</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1237</td>
+ <td class="headerCovTableEntry">2675</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">147</td>
+ <td class="headerCovTableEntryLo">68.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tpmrel.c.gcov.html">tpmrel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 92</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="i2c.c.gcov.html">i2c.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 100</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="iohub.c.gcov.html">iohub.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=27 height=10 alt="27.4%"><img src="../snow.png" width=73 height=10 alt="27.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">27.4&nbsp;%</td>
+ <td class="coverNumLo">100 / 365</td>
+ <td class="coverPerLo">40.0&nbsp;%</td>
+ <td class="coverNumLo">8 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fsp.c.gcov.html">fsp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=38 height=10 alt="37.5%"><img src="../snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">90 / 240</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memory.c.gcov.html">memory.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.0%"><img src="../snow.png" width=64 height=10 alt="36.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.0&nbsp;%</td>
+ <td class="coverNumLo">151 / 419</td>
+ <td class="coverPerLo">68.4&nbsp;%</td>
+ <td class="coverNumLo">13 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpu-common.c.gcov.html">cpu-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="69.1%"><img src="../snow.png" width=31 height=10 alt="69.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.1&nbsp;%</td>
+ <td class="coverNumLo">96 / 139</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.c.gcov.html">spira.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="52.1%"><img src="../snow.png" width=48 height=10 alt="52.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">52.1&nbsp;%</td>
+ <td class="coverNumLo">379 / 728</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">28 / 35</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="slca.c.gcov.html">slca.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=64 height=10 alt="64.3%"><img src="../snow.png" width=36 height=10 alt="64.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">45 / 70</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.c.gcov.html">hdif.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=51 height=10 alt="50.5%"><img src="../snow.png" width=49 height=10 alt="50.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.5&nbsp;%</td>
+ <td class="coverNumLo">47 / 93</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=76 height=10 alt="75.8%"><img src="../snow.png" width=24 height=10 alt="75.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.8&nbsp;%</td>
+ <td class="coverNumMed">207 / 273</td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">17 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.h.gcov.html">spira.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.4%"><img src="../snow.png" width=64 height=10 alt="36.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.4&nbsp;%</td>
+ <td class="coverNumLo">4 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd-common.c.gcov.html">vpd-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=80 height=10 alt="80.0%"><img src="../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.h.gcov.html">hdif.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hostservices.c.gcov.html">hostservices.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="81.2%"><img src="../snow.png" width=19 height=10 alt="81.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.2&nbsp;%</td>
+ <td class="coverNumMed">26 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pcia.c.gcov.html">pcia.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="80.8%"><img src="../snow.png" width=19 height=10 alt="80.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.8&nbsp;%</td>
+ <td class="coverNumMed">84 / 104</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/index-sort-l.html b/coverage-report/hdata/index-sort-l.html
new file mode 100644
index 0000000..d2df0da
--- /dev/null
+++ b/coverage-report/hdata/index-sort-l.html
@@ -0,0 +1,275 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hdata</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1237</td>
+ <td class="headerCovTableEntry">2675</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">147</td>
+ <td class="headerCovTableEntryLo">68.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tpmrel.c.gcov.html">tpmrel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 92</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="i2c.c.gcov.html">i2c.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 100</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="iohub.c.gcov.html">iohub.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=27 height=10 alt="27.4%"><img src="../snow.png" width=73 height=10 alt="27.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">27.4&nbsp;%</td>
+ <td class="coverNumLo">100 / 365</td>
+ <td class="coverPerLo">40.0&nbsp;%</td>
+ <td class="coverNumLo">8 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memory.c.gcov.html">memory.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.0%"><img src="../snow.png" width=64 height=10 alt="36.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.0&nbsp;%</td>
+ <td class="coverNumLo">151 / 419</td>
+ <td class="coverPerLo">68.4&nbsp;%</td>
+ <td class="coverNumLo">13 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.h.gcov.html">spira.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.4%"><img src="../snow.png" width=64 height=10 alt="36.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.4&nbsp;%</td>
+ <td class="coverNumLo">4 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fsp.c.gcov.html">fsp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=38 height=10 alt="37.5%"><img src="../snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">90 / 240</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.c.gcov.html">hdif.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=51 height=10 alt="50.5%"><img src="../snow.png" width=49 height=10 alt="50.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.5&nbsp;%</td>
+ <td class="coverNumLo">47 / 93</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.c.gcov.html">spira.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="52.1%"><img src="../snow.png" width=48 height=10 alt="52.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">52.1&nbsp;%</td>
+ <td class="coverNumLo">379 / 728</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">28 / 35</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="slca.c.gcov.html">slca.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=64 height=10 alt="64.3%"><img src="../snow.png" width=36 height=10 alt="64.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">45 / 70</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpu-common.c.gcov.html">cpu-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="69.1%"><img src="../snow.png" width=31 height=10 alt="69.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.1&nbsp;%</td>
+ <td class="coverNumLo">96 / 139</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=76 height=10 alt="75.8%"><img src="../snow.png" width=24 height=10 alt="75.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.8&nbsp;%</td>
+ <td class="coverNumMed">207 / 273</td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">17 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd-common.c.gcov.html">vpd-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=80 height=10 alt="80.0%"><img src="../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pcia.c.gcov.html">pcia.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="80.8%"><img src="../snow.png" width=19 height=10 alt="80.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.8&nbsp;%</td>
+ <td class="coverNumMed">84 / 104</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hostservices.c.gcov.html">hostservices.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="81.2%"><img src="../snow.png" width=19 height=10 alt="81.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.2&nbsp;%</td>
+ <td class="coverNumMed">26 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.h.gcov.html">hdif.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/index.html b/coverage-report/hdata/index.html
new file mode 100644
index 0000000..4d0db56
--- /dev/null
+++ b/coverage-report/hdata/index.html
@@ -0,0 +1,275 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hdata</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1237</td>
+ <td class="headerCovTableEntry">2675</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">147</td>
+ <td class="headerCovTableEntryLo">68.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="cpu-common.c.gcov.html">cpu-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="69.1%"><img src="../snow.png" width=31 height=10 alt="69.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.1&nbsp;%</td>
+ <td class="coverNumLo">96 / 139</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fsp.c.gcov.html">fsp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=38 height=10 alt="37.5%"><img src="../snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">90 / 240</td>
+ <td class="coverPerLo">54.5&nbsp;%</td>
+ <td class="coverNumLo">6 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.c.gcov.html">hdif.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=51 height=10 alt="50.5%"><img src="../snow.png" width=49 height=10 alt="50.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.5&nbsp;%</td>
+ <td class="coverNumLo">47 / 93</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdif.h.gcov.html">hdif.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hostservices.c.gcov.html">hostservices.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="81.2%"><img src="../snow.png" width=19 height=10 alt="81.2%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.2&nbsp;%</td>
+ <td class="coverNumMed">26 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="i2c.c.gcov.html">i2c.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 100</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="iohub.c.gcov.html">iohub.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=27 height=10 alt="27.4%"><img src="../snow.png" width=73 height=10 alt="27.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">27.4&nbsp;%</td>
+ <td class="coverNumLo">100 / 365</td>
+ <td class="coverPerLo">40.0&nbsp;%</td>
+ <td class="coverNumLo">8 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memory.c.gcov.html">memory.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.0%"><img src="../snow.png" width=64 height=10 alt="36.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.0&nbsp;%</td>
+ <td class="coverNumLo">151 / 419</td>
+ <td class="coverPerLo">68.4&nbsp;%</td>
+ <td class="coverNumLo">13 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pcia.c.gcov.html">pcia.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=81 height=10 alt="80.8%"><img src="../snow.png" width=19 height=10 alt="80.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.8&nbsp;%</td>
+ <td class="coverNumMed">84 / 104</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="slca.c.gcov.html">slca.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=64 height=10 alt="64.3%"><img src="../snow.png" width=36 height=10 alt="64.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">45 / 70</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">5 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.c.gcov.html">spira.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="52.1%"><img src="../snow.png" width=48 height=10 alt="52.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">52.1&nbsp;%</td>
+ <td class="coverNumLo">379 / 728</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">28 / 35</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="spira.h.gcov.html">spira.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=36 height=10 alt="36.4%"><img src="../snow.png" width=64 height=10 alt="36.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">36.4&nbsp;%</td>
+ <td class="coverNumLo">4 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tpmrel.c.gcov.html">tpmrel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 92</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd-common.c.gcov.html">vpd-common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=80 height=10 alt="80.0%"><img src="../snow.png" width=20 height=10 alt="80.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vpd.c.gcov.html">vpd.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=76 height=10 alt="75.8%"><img src="../snow.png" width=24 height=10 alt="75.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.8&nbsp;%</td>
+ <td class="coverNumMed">207 / 273</td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">17 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/iohub.c.func-sort-c.html b/coverage-report/hdata/iohub.c.func-sort-c.html
new file mode 100644
index 0000000..cb34884
--- /dev/null
+++ b/coverage-report/hdata/iohub.c.func-sort-c.html
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/iohub.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - iohub.c<span style="font-size: 80%;"> (<a href="iohub.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">365</td>
+ <td class="headerCovTableEntryLo">27.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryLo">40.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="iohub.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#348">add_i2c_link</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#147">add_pec_stack</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#361">find_slot_details</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#441">find_slot_entry_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#680">get_slot_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#268">io_add_p9</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#191">io_add_phb4</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#501">is_port</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#517">parse_one_slot</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#376">parse_slot_details</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#469">st_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#483">xlate_type</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#822">io_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#297">io_add_p8_cec_vpd</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#16">io_get_lx_info</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#732">io_parse_fru</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#237">io_add_p8</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#693">io_parse_slots</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#88">io_add_phb3</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#56">io_get_loc_code</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/iohub.c.func.html b/coverage-report/hdata/iohub.c.func.html
new file mode 100644
index 0000000..7d24cc9
--- /dev/null
+++ b/coverage-report/hdata/iohub.c.func.html
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/iohub.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - iohub.c<span style="font-size: 80%;"> (<a href="iohub.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">365</td>
+ <td class="headerCovTableEntryLo">27.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryLo">40.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="iohub.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#348">add_i2c_link</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#147">add_pec_stack</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#361">find_slot_details</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#441">find_slot_entry_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#680">get_slot_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#237">io_add_p8</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#297">io_add_p8_cec_vpd</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#268">io_add_p9</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#88">io_add_phb3</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#191">io_add_phb4</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#56">io_get_loc_code</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#16">io_get_lx_info</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#822">io_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#732">io_parse_fru</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#693">io_parse_slots</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#501">is_port</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#517">parse_one_slot</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#376">parse_slot_details</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#469">st_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="iohub.c.gcov.html#483">xlate_type</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/iohub.c.gcov.html b/coverage-report/hdata/iohub.c.gcov.html
new file mode 100644
index 0000000..165d8cd
--- /dev/null
+++ b/coverage-report/hdata/iohub.c.gcov.html
@@ -0,0 +1,971 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/iohub.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - iohub.c<span style="font-size: 80%;"> (source / <a href="iohub.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">365</td>
+ <td class="headerCovTableEntryLo">27.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryLo">40.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;spira.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;fsp.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;opal.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;ccan/array_size/array_size.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;device.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;string.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 3 : static bool io_get_lx_info(const void *kwvpd, unsigned int kwvpd_sz,</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : int lx_idx, struct dt_node *hn)</a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> : : const void *lxr;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : char recname[5];</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 3 : beint32_t lxrbuf[2] = { 0, 0 };</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : /* Find LXRn, where n is the index passed in*/</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 3 : strcpy(recname, &quot;LXR0&quot;);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 3 : recname[3] += lx_idx;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 3 : lxr = vpd_find(kwvpd, kwvpd_sz, recname, &quot;LX&quot;, NULL);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 3 : if (!lxr) {</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* Not found, try VINI */</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : lxr = vpd_find(kwvpd, kwvpd_sz, &quot;VINI&quot;,</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : &quot;LX&quot;, NULL);</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : if (lxr)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : lx_idx = VPD_LOAD_LXRN_VINI;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 3 : if (!lxr) {</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;CEC: LXR%x not found !\n&quot;, lx_idx);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : }</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 3 : memcpy(lxrbuf, lxr, sizeof(beint32_t)*2);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 3 : prlog(PR_DEBUG, &quot;CEC: LXRn=%d LXR=%08x%08x\n&quot;, lx_idx, be32_to_cpu(lxrbuf[0]), be32_to_cpu(lxrbuf[1]));</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 3 : prlog(PR_DEBUG, &quot;CEC: LX Info added to %llx\n&quot;, (long long)hn);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : /* Add the LX info */</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 3 : if (!dt_has_node_property(hn, &quot;ibm,vpd-lx-info&quot;, NULL)) {</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 2 : dt_add_property_cells(hn, &quot;ibm,vpd-lx-info&quot;,</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : lx_idx,</a>
+<a name="50"><span class="lineNum"> 50 </span> : : be32_to_cpu(lxrbuf[0]),</a>
+<a name="51"><span class="lineNum"> 51 </span> : : be32_to_cpu(lxrbuf[1]));</a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 3 : return true;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 14 : static void io_get_loc_code(const void *sp_iohubs, struct dt_node *hn, const char *prop_name)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> : : const struct spira_fru_id *fru_id;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : unsigned int fru_id_sz;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : char loc_code[LOC_CODE_SIZE + 1];</a>
+<a name="63"><span class="lineNum"> 63 </span> : : const char *slca_loc_code;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : /* Find SLCA Index */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 14 : fru_id = HDIF_get_idata(sp_iohubs, CECHUB_FRU_ID_DATA, &amp;fru_id_sz);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 14 : if (fru_id) {</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 14 : memset(loc_code, 0, sizeof(loc_code));</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* Find LOC Code from SLCA Index */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 14 : slca_loc_code = slca_get_loc_code_index(be16_to_cpu(fru_id-&gt;slca_index));</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 14 : if (slca_loc_code) {</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 14 : strncpy(loc_code, slca_loc_code, LOC_CODE_SIZE);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 14 : if (!dt_has_node_property(hn, prop_name, NULL)) {</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 13 : dt_add_property(hn, prop_name, loc_code,</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 13 : strlen(loc_code) + 1);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 14 : prlog(PR_DEBUG, &quot;CEC: %s: %s (SLCA rsrc 0x%x)\n&quot;,</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : prop_name, loc_code,</a>
+<a name="80"><span class="lineNum"> 80 </span> : : be16_to_cpu(fru_id-&gt;rsrc_id));</a>
+<a name="81"><span class="lineNum"> 81 </span> : : } else {</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;CEC: SLCA Loc not found: &quot;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : &quot;index %d\n&quot;, fru_id-&gt;slca_index);</a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : } else {</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;CEC: Hub FRU ID not found...\n&quot;);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 14 : }</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 11 : static struct dt_node *io_add_phb3(const struct cechub_io_hub *hub,</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : const struct HDIF_common_hdr *sp_iohubs,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : unsigned int index, struct dt_node *xcom,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : unsigned int pe_xscom,</a>
+<a name="94"><span class="lineNum"> 94 </span> : : unsigned int pci_xscom,</a>
+<a name="95"><span class="lineNum"> 95 </span> : : unsigned int spci_xscom)</a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : struct dt_node *pbcq;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : unsigned int hdif_vers;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> : : /* Get HDIF version */</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 11 : hdif_vers = be16_to_cpu(sp_iohubs-&gt;version);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : /* Create PBCQ node under xscom */</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 11 : pbcq = dt_new_addr(xcom, &quot;pbcq&quot;, pe_xscom);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 11 : if (!pbcq)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> : : /* &quot;reg&quot; property contains in order the PE, PCI and SPCI XSCOM</a>
+<a name="109"><span class="lineNum"> 109 </span> : : * addresses</a>
+<a name="110"><span class="lineNum"> 110 </span> : : */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 11 : dt_add_property_cells(pbcq, &quot;reg&quot;,</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : pe_xscom, 0x20,</a>
+<a name="113"><span class="lineNum"> 113 </span> : : pci_xscom, 0x05,</a>
+<a name="114"><span class="lineNum"> 114 </span> : : spci_xscom, 0x15);</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* A couple more things ... */</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 11 : dt_add_property_strings(pbcq, &quot;compatible&quot;, &quot;ibm,power8-pbcq&quot;);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 11 : dt_add_property_cells(pbcq, &quot;ibm,phb-index&quot;, index);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 11 : dt_add_property_cells(pbcq, &quot;ibm,hub-id&quot;, be16_to_cpu(hub-&gt;hub_num));</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : /* The loc code of the PHB itself is different from the base</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * loc code of the slots (It's actually the DCM's loc code).</a>
+<a name="123"><span class="lineNum"> 123 </span> : : */</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 11 : io_get_loc_code(sp_iohubs, pbcq, &quot;ibm,loc-code&quot;);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> : : /* We indicate that this is an IBM setup, which means that</a>
+<a name="127"><span class="lineNum"> 127 </span> : : * the presence detect A/B bits are meaningful. So far we</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * don't know whether they make any sense on customer setups</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * so we only set that when booting with HDAT</a>
+<a name="130"><span class="lineNum"> 130 </span> : : */</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 11 : dt_add_property(pbcq, &quot;ibm,use-ab-detect&quot;, NULL, 0);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> : : /* HDAT spec has these in version 0x6A and later */</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 11 : if (hdif_vers &gt;= 0x6a) {</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 11 : u64 eq0 = be64_to_cpu(hub-&gt;phb_lane_eq[index][0]);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 11 : u64 eq1 = be64_to_cpu(hub-&gt;phb_lane_eq[index][1]);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 11 : u64 eq2 = be64_to_cpu(hub-&gt;phb_lane_eq[index][2]);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 11 : u64 eq3 = be64_to_cpu(hub-&gt;phb_lane_eq[index][3]);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 11 : dt_add_property_u64s(pbcq, &quot;ibm,lane-eq&quot;, eq0, eq1, eq2, eq3);</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : }</a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : /* Currently we only create a PBCQ node, the actual PHB nodes</a>
+<a name="144"><span class="lineNum"> 144 </span> : : * will be added by sapphire later on.</a>
+<a name="145"><span class="lineNum"> 145 </span> : : */</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 11 : return pbcq;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : }</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : static struct dt_node *add_pec_stack(const struct cechub_io_hub *hub,</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : struct dt_node *pbcq, int stack_index,</a>
+<a name="151"><span class="lineNum"> 151 </span> : : int phb_index, u8 active_phbs)</a>
+<a name="152"><span class="lineNum"> 152 </span> : : {</a>
+<a name="153"><span class="lineNum"> 153 </span> : : struct dt_node *stack;</a>
+<a name="154"><span class="lineNum"> 154 </span> : : u64 eq[8];</a>
+<a name="155"><span class="lineNum"> 155 </span> : : u8 *gen4;</a>
+<a name="156"><span class="lineNum"> 156 </span> : : int i;</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : stack = dt_new_addr(pbcq, &quot;stack&quot;, stack_index);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : assert(stack);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : </a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(stack, &quot;reg&quot;, stack_index);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(stack, &quot;ibm,phb-index&quot;, phb_index);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(stack, &quot;compatible&quot;, &quot;ibm,power9-phb-stack&quot;);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* XXX: This should probably just return if the PHB is disabled</a>
+<a name="166"><span class="lineNum"> 166 </span> : : * rather than adding the extra properties.</a>
+<a name="167"><span class="lineNum"> 167 </span> : : */</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : if (active_phbs &amp; (0x80 &gt;&gt; phb_index))</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(stack, &quot;status&quot;, &quot;okay&quot;);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : else</a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(stack, &quot;status&quot;, &quot;disabled&quot;);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 4; i++) /* gen 3 eq settings */</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : eq[i] = be64_to_cpu(hub-&gt;phb_lane_eq[phb_index][i]);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 4; i++) /* gen 4 eq settings */</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : eq[i+4] = be64_to_cpu(hub-&gt;phb4_lane_eq[phb_index][i]);</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> : : /* Lane-eq settings are packed 2 bytes per lane for 16 lanes</a>
+<a name="180"><span class="lineNum"> 180 </span> : : * On P9 DD2, 1 byte per lane is used in the hardware</a>
+<a name="181"><span class="lineNum"> 181 </span> : : */</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> : : /* Repack 2 byte lane settings into 1 byte */</a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : gen4 = (u8 *)&amp;eq[4];</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 16; i++)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : gen4[i] = gen4[2*i];</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64s(stack, &quot;ibm,lane-eq&quot;, eq[0], eq[1],</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : eq[2], eq[3], eq[4], eq[5]);</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return stack;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : static struct dt_node *io_add_phb4(const struct cechub_io_hub *hub,</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : const struct HDIF_common_hdr *sp_iohubs,</a>
+<a name="195"><span class="lineNum"> 195 </span> : : struct dt_node *xcom,</a>
+<a name="196"><span class="lineNum"> 196 </span> : : unsigned int pec_index,</a>
+<a name="197"><span class="lineNum"> 197 </span> : : int stacks,</a>
+<a name="198"><span class="lineNum"> 198 </span> : : int phb_base)</a>
+<a name="199"><span class="lineNum"> 199 </span> : : {</a>
+<a name="200"><span class="lineNum"> 200 </span> : : struct dt_node *pbcq;</a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : uint8_t active_phb_mask = hub-&gt;fab_br0_pdt;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : uint32_t pe_xscom = 0x4010c00 + (pec_index * 0x0000400);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : uint32_t pci_xscom = 0xd010800 + (pec_index * 0x1000000);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : int i;</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> : : /* Create PBCQ node under xscom */</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : pbcq = dt_new_addr(xcom, &quot;pbcq&quot;, pe_xscom);</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : if (!pbcq)</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> : : /* &quot;reg&quot; property contains (in order) the PE and PCI XSCOM addresses */</a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(pbcq, &quot;reg&quot;,</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : pe_xscom, 0x100,</a>
+<a name="214"><span class="lineNum"> 214 </span> : : pci_xscom, 0x200);</a>
+<a name="215"><span class="lineNum"> 215 </span> : : </a>
+<a name="216"><span class="lineNum"> 216 </span> : : /* The hubs themselves go under the stacks */</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(pbcq, &quot;compatible&quot;, &quot;ibm,power9-pbcq&quot;);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(pbcq, &quot;ibm,pec-index&quot;, pec_index);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(pbcq, &quot;#address-cells&quot;, 1);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(pbcq, &quot;#size-cells&quot;, 0);</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; stacks; i++)</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : add_pec_stack(hub, pbcq, i, phb_base + i, active_phb_mask);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(pbcq, &quot;ibm,hub-id&quot;, be16_to_cpu(hub-&gt;hub_num));</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : </a>
+<a name="227"><span class="lineNum"> 227 </span> : : /* The loc code of the PHB itself is different from the base</a>
+<a name="228"><span class="lineNum"> 228 </span> : : * loc code of the slots (It's actually the DCM's loc code).</a>
+<a name="229"><span class="lineNum"> 229 </span> : : */</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : io_get_loc_code(sp_iohubs, pbcq, &quot;ibm,loc-code&quot;);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : </a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;CEC: Added PHB4 PBCQ %d with %d stacks\n&quot;,</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : pec_index, stacks);</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> : : /* the actual PHB nodes created later on by skiboot */</a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : return pbcq;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : }</a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 6 : static struct dt_node *io_add_p8(const struct cechub_io_hub *hub,</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : const struct HDIF_common_hdr *sp_iohubs)</a>
+<a name="241"><span class="lineNum"> 241 </span> : : {</a>
+<a name="242"><span class="lineNum"> 242 </span> : : struct dt_node *xscom;</a>
+<a name="243"><span class="lineNum"> 243 </span> : : unsigned int i, chip_id;</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 6 : chip_id = pcid_to_chip_id(be32_to_cpu(hub-&gt;proc_chip_id));</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 6 : prlog(PR_INFO, &quot;CEC: HW CHIP=0x%x, HW TOPO=0x%04x\n&quot;, chip_id,</span></a>
+<a name="248"><span class="lineNum"> 248 </span> : : be16_to_cpu(hub-&gt;hw_topology));</a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 6 : xscom = find_xscom_for_chip(chip_id);</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 6 : if (!xscom) {</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : prerror(&quot;P8: Can't find XSCOM for chip %d\n&quot;, chip_id);</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> : : /* Create PHBs, max 3 */</a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 24 : for (i = 0; i &lt; 3; i++) {</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 18 : if (hub-&gt;fab_br0_pdt &amp; (0x80 &gt;&gt; i))</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : /* XSCOM addresses are the same on Murano and Venice */</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 11 : io_add_phb3(hub, sp_iohubs, i, xscom,</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 11 : 0x02012000 + (i * 0x400),</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 11 : 0x09012000 + (i * 0x400),</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 11 : 0x09013c00 + (i * 0x40));</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : }</a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> : : /* HACK: We return the XSCOM device for the VPD info */</a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 6 : return xscom;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : }</a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : static struct dt_node *io_add_p9(const struct cechub_io_hub *hub,</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : const struct HDIF_common_hdr *sp_iohubs)</a>
+<a name="272"><span class="lineNum"> 272 </span> : : {</a>
+<a name="273"><span class="lineNum"> 273 </span> : : struct dt_node *xscom;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : unsigned int chip_id;</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : chip_id = pcid_to_chip_id(be32_to_cpu(hub-&gt;proc_chip_id));</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : </a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;CEC: HW CHIP=0x%x, HW TOPO=0x%04x\n&quot;, chip_id,</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : be16_to_cpu(hub-&gt;hw_topology));</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : xscom = find_xscom_for_chip(chip_id);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : if (!xscom) {</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : prerror(&quot;P9: Can't find XSCOM for chip %d\n&quot;, chip_id);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;IOHUB: PHB4 active bridge mask %x\n&quot;,</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : (u32) hub-&gt;fab_br0_pdt);</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> : : /* Create PBCQs */</a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : io_add_phb4(hub, sp_iohubs, xscom, 0, 1, 0);</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : io_add_phb4(hub, sp_iohubs, xscom, 1, 2, 1);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineNoCov"> 0 : io_add_phb4(hub, sp_iohubs, xscom, 2, 3, 3);</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : return xscom;</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : }</a>
+<a name="297"><span class="lineNum"> 297 </span> : : </a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 3 : static void io_add_p8_cec_vpd(const struct HDIF_common_hdr *sp_iohubs)</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : {</a>
+<a name="301"><span class="lineNum"> 301 </span> : : const struct HDIF_child_ptr *iokids;</a>
+<a name="302"><span class="lineNum"> 302 </span> : : const void *iokid; </a>
+<a name="303"><span class="lineNum"> 303 </span> : : const void *kwvpd;</a>
+<a name="304"><span class="lineNum"> 304 </span> : : unsigned int kwvpd_sz;</a>
+<a name="305"><span class="lineNum"> 305 </span> : : </a>
+<a name="306"><span class="lineNum"> 306 </span> : : /* P8 LXR0 kept in IO KID Keyword VPD */</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 3 : iokids = HDIF_child_arr(sp_iohubs, CECHUB_CHILD_IO_KIDS);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 3 : if (!CHECK_SPPTR(iokids)) {</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;CEC: No IOKID child array !\n&quot;);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : }</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 3 : if (!iokids-&gt;count) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;CEC: IOKID count is 0 !\n&quot;);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : }</a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 3 : if (be32_to_cpu(iokids-&gt;count) &gt; 1) {</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;CEC: WARNING ! More than 1 IO KID !!! (%d)\n&quot;,</span></a>
+<a name="318"><span class="lineNum"> 318 </span> : : be32_to_cpu(iokids-&gt;count));</a>
+<a name="319"><span class="lineNum"> 319 </span> : : /* Ignoring the additional ones */</a>
+<a name="320"><span class="lineNum"> 320 </span> : : }</a>
+<a name="321"><span class="lineNum"> 321 </span> : : </a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 3 : iokid = HDIF_child(sp_iohubs, iokids, 0, &quot;IO KID&quot;);</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 3 : if (!iokid) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;CEC: No IO KID structure in child array !\n&quot;);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /* Grab base location code for slots */</a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 3 : io_get_loc_code(iokid, dt_root, &quot;ibm,io-base-loc-code&quot;);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 3 : kwvpd = HDIF_get_idata(iokid, CECHUB_ASCII_KEYWORD_VPD, &amp;kwvpd_sz);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 3 : if (!kwvpd) {</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;CEC: No VPD entry in IO KID !\n&quot;);</span></a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : }</a>
+<a name="336"><span class="lineNum"> 336 </span> : : </a>
+<a name="337"><span class="lineNum"> 337 </span> : : /* Grab LX load info */</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 3 : io_get_lx_info(kwvpd, kwvpd_sz, 0, dt_root);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> : : }</a>
+<a name="340"><span class="lineNum"> 340 </span> : : </a>
+<a name="341"><span class="lineNum"> 341 </span> : : /*</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * Assumptions:</a>
+<a name="343"><span class="lineNum"> 343 </span> : : *</a>
+<a name="344"><span class="lineNum"> 344 </span> : : * a) the IOSLOT index is the hub ID -CHECK</a>
+<a name="345"><span class="lineNum"> 345 </span> : : *</a>
+<a name="346"><span class="lineNum"> 346 </span> : : */</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : static struct dt_node *dt_slots;</a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : static void add_i2c_link(struct dt_node *node, const char *link_name,</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : u32 i2c_link)</a>
+<a name="352"><span class="lineNum"> 352 </span> : : {</a>
+<a name="353"><span class="lineNum"> 353 </span> : : /* FIXME: Do something not shit */</a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, link_name, i2c_link);</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> : : /*</a>
+<a name="358"><span class="lineNum"> 358 </span> : : * the root of the slots node has #address-cells = 2, &lt;hub-index, phb-index&gt;</a>
+<a name="359"><span class="lineNum"> 359 </span> : : * can we ditch hub-index?</a>
+<a name="360"><span class="lineNum"> 360 </span> : : */</a>
+<a name="361"><span class="lineNum"> 361 </span> : : </a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : static const struct slot_map_details *find_slot_details(</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : const struct HDIF_common_hdr *ioslot, int entry)</a>
+<a name="365"><span class="lineNum"> 365 </span> : : {</a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : const struct slot_map_details *details = NULL;</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : const struct HDIF_array_hdr *arr;</a>
+<a name="368"><span class="lineNum"> 368 </span> : : unsigned int i;</a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : arr = HDIF_get_iarray(ioslot, IOSLOT_IDATA_DETAILS, NULL);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineNoCov"> 0 : HDIF_iarray_for_each(arr, i, details)</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : if (be16_to_cpu(details-&gt;entry) == entry)</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : </a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : return details;</span></a>
+<a name="376"><span class="lineNum"> 376 </span> : : }</a>
+<a name="377"><span class="lineNum"> 377 </span> : : </a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : static void parse_slot_details(struct dt_node *slot,</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : const struct slot_map_details *details)</a>
+<a name="380"><span class="lineNum"> 380 </span> : : {</a>
+<a name="381"><span class="lineNum"> 381 </span> : : u32 slot_caps;</a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> : : /*</a>
+<a name="384"><span class="lineNum"> 384 </span> : : * generic slot options</a>
+<a name="385"><span class="lineNum"> 385 </span> : : */</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(slot, &quot;max-power&quot;,</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : be16_to_cpu(details-&gt;max_power));</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : if (details-&gt;perst_ctl_type == SLOT_PERST_PHB_OR_SW)</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineNoCov"> 0 : dt_add_property(slot, &quot;pci-perst&quot;, NULL, 0);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineNoCov"> 0 : else if (details-&gt;perst_ctl_type == SLOT_PERST_SW_GPIO)</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(slot, &quot;gpio-perst&quot;, details-&gt;perst_gpio);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : </a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : if (details-&gt;presence_det_type == SLOT_PRESENCE_PCI)</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : dt_add_property(slot, &quot;pci-presence-detect&quot;, NULL, 0);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> : : /*</a>
+<a name="399"><span class="lineNum"> 399 </span> : : * specific slot capabilities</a>
+<a name="400"><span class="lineNum"> 400 </span> : : */</a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : slot_caps = be32_to_cpu(details-&gt;slot_caps);</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : </a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (slot_caps &amp; SLOT_CAP_LSI)</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : dt_add_property(slot, &quot;lsi&quot;, NULL, 0);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : if (slot_caps &amp; SLOT_CAP_CAPI) {</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* XXX: should we be more specific here?</a>
+<a name="408"><span class="lineNum"> 408 </span> : : *</a>
+<a name="409"><span class="lineNum"> 409 </span> : : * Also we should double check that this slot</a>
+<a name="410"><span class="lineNum"> 410 </span> : : * is a root connected slot.</a>
+<a name="411"><span class="lineNum"> 411 </span> : : */</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : dt_add_property(slot, &quot;capi&quot;, NULL, 0);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : }</a>
+<a name="414"><span class="lineNum"> 414 </span> : : </a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : if (slot_caps &amp; SLOT_CAP_CCARD) {</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : dt_add_property(slot, &quot;cable-card&quot;, NULL, 0);</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : if (details-&gt;presence_det_type == SLOT_PRESENCE_I2C)</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : add_i2c_link(slot, &quot;i2c-presence-detect&quot;,</span></a>
+<a name="420"><span class="lineNum"> 420 </span> : : be32_to_cpu(details-&gt;i2c_cable_card));</a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : if (slot_caps &amp; SLOT_CAP_HOTPLUG) {</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : dt_add_property(slot, &quot;hotplug&quot;, NULL, 0);</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : </a>
+<a name="426"><span class="lineNum"> 426 </span> : : /*</a>
+<a name="427"><span class="lineNum"> 427 </span> : : * Power control should only exist when the slot is hotplug</a>
+<a name="428"><span class="lineNum"> 428 </span> : : * capable</a>
+<a name="429"><span class="lineNum"> 429 </span> : : */</a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : if (details-&gt;power_ctrl_type == SLOT_PWR_I2C)</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : add_i2c_link(slot, &quot;i2c-power-ctrl&quot;,</span></a>
+<a name="432"><span class="lineNum"> 432 </span> : : be32_to_cpu(details-&gt;i2c_power_ctl));</a>
+<a name="433"><span class="lineNum"> 433 </span> : : }</a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /*</a>
+<a name="436"><span class="lineNum"> 436 </span> : : * NB: Additional NVLink specific info is added to this node</a>
+<a name="437"><span class="lineNum"> 437 </span> : : * when the SMP Link structures are parsed later on.</a>
+<a name="438"><span class="lineNum"> 438 </span> : : */</a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : if (slot_caps &amp; SLOT_CAP_NVLINK)</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : dt_add_property(slot, &quot;nvlink&quot;, NULL, 0);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : struct dt_node *find_slot_entry_node(struct dt_node *root, u32 entry_id)</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : {</a>
+<a name="445"><span class="lineNum"> 445 </span> : : struct dt_node *node;</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : for (node = dt_first(root); node; node = dt_next(root, node)) {</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : if (!dt_has_node_property(node, DT_PRIVATE &quot;entry_id&quot;, NULL))</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineNoCov"> 0 : if (dt_prop_get_u32(node, DT_PRIVATE &quot;entry_id&quot;) == entry_id)</span></a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : return node;</span></a>
+<a name="453"><span class="lineNum"> 453 </span> : : }</a>
+<a name="454"><span class="lineNum"> 454 </span> : : </a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : }</a>
+<a name="457"><span class="lineNum"> 457 </span> : : </a>
+<a name="458"><span class="lineNum"> 458 </span> : : /*</a>
+<a name="459"><span class="lineNum"> 459 </span> : : * The internal HDAT representation of the various types of slot is kinda</a>
+<a name="460"><span class="lineNum"> 460 </span> : : * dumb, translate it into something more sensible</a>
+<a name="461"><span class="lineNum"> 461 </span> : : */</a>
+<a name="462"><span class="lineNum"> 462 </span> : : enum slot_types {</a>
+<a name="463"><span class="lineNum"> 463 </span> : : st_root,</a>
+<a name="464"><span class="lineNum"> 464 </span> : : st_slot,</a>
+<a name="465"><span class="lineNum"> 465 </span> : : st_rc_slot,</a>
+<a name="466"><span class="lineNum"> 466 </span> : : st_sw_upstream,</a>
+<a name="467"><span class="lineNum"> 467 </span> : : st_sw_downstream,</a>
+<a name="468"><span class="lineNum"> 468 </span> : : st_builtin</a>
+<a name="469"><span class="lineNum"> 469 </span> : : };</a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : static const char *st_name(enum slot_types type)</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : {</a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : switch(type) {</span></a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineNoCov"> 0 : case st_root: return &quot;root-complex&quot;;</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : case st_slot: return &quot;pluggable&quot;;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : case st_rc_slot: return &quot;pluggable&quot;; /* differentiate? */</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineNoCov"> 0 : case st_sw_upstream: return &quot;switch-up&quot;;</span></a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineNoCov"> 0 : case st_sw_downstream: return &quot;switch-down&quot;;</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : case st_builtin: return &quot;builtin&quot;;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : }</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineNoCov"> 0 : return &quot;(none)&quot;;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> : : }</a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : static enum slot_types xlate_type(uint8_t type, u32 features)</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : {</a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineNoCov"> 0 : bool is_slot = features &amp; SLOT_FEAT_SLOT;</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : </a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : switch (type) {</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : case SLOT_TYPE_ROOT_COMPLEX:</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : return is_slot ? st_rc_slot : st_root;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : case SLOT_TYPE_BUILTIN:</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : return st_builtin;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : case SLOT_TYPE_SWITCH_UP:</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : return st_sw_upstream;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : case SLOT_TYPE_SWITCH_DOWN:</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : return is_slot ? st_slot : st_sw_downstream;</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : }</a>
+<a name="499"><span class="lineNum"> 499 </span> : : </a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : return -1; /* shouldn't happen */</span></a>
+<a name="501"><span class="lineNum"> 501 </span> : : }</a>
+<a name="502"><span class="lineNum"> 502 </span> : : </a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : static bool is_port(struct dt_node *n)</span></a>
+<a name="504"><span class="lineNum"> 504 </span> : : {</a>
+<a name="505"><span class="lineNum"> 505 </span> : : //return dt_node_is_compatible(n, &quot;compatible&quot;, &quot;ibm,pcie-port&quot;);</a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : return dt_node_is_compatible(n, &quot;ibm,pcie-port&quot;);</span></a>
+<a name="507"><span class="lineNum"> 507 </span> : : }</a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> : : /* this only works inside parse_one_ioslot() */</a>
+<a name="510"><span class="lineNum"> 510 </span> : : #define SM_LOG(level, fmt, ...) \</a>
+<a name="511"><span class="lineNum"> 511 </span> : : prlog(level, &quot;SLOTMAP: %x:%d:%d &quot; \</a>
+<a name="512"><span class="lineNum"> 512 </span> : : fmt, /* user input */ \</a>
+<a name="513"><span class="lineNum"> 513 </span> : : chip_id, entry-&gt;phb_index, eid, \</a>
+<a name="514"><span class="lineNum"> 514 </span> : : ##__VA_ARGS__ /* user args */)</a>
+<a name="515"><span class="lineNum"> 515 </span> : : </a>
+<a name="516"><span class="lineNum"> 516 </span> : : #define SM_ERR(fmt, ...) SM_LOG(PR_ERR, fmt, ##__VA_ARGS__)</a>
+<a name="517"><span class="lineNum"> 517 </span> : : #define SM_DBG(fmt, ...) SM_LOG(PR_DEBUG, fmt, ##__VA_ARGS__)</a>
+<a name="518"><span class="lineNum"> 518 </span> : : </a>
+<a name="519"><span class="lineNum"> 519 </span> :<span class="lineNoCov"> 0 : static void parse_one_slot(const struct slot_map_entry *entry,</span></a>
+<a name="520"><span class="lineNum"> 520 </span> : : const struct slot_map_details *details, int chip_id)</a>
+<a name="521"><span class="lineNum"> 521 </span> : : {</a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : struct dt_node *node, *parent = NULL;</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : u16 eid, pid, vid, did;</a>
+<a name="524"><span class="lineNum"> 524 </span> : : u32 flags;</a>
+<a name="525"><span class="lineNum"> 525 </span> : : int type;</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : flags = be32_to_cpu(entry-&gt;features);</span></a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : type = xlate_type(entry-&gt;type, flags);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> : : </a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : eid = be16_to_cpu(entry-&gt;entry_id);</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : pid = be16_to_cpu(entry-&gt;parent_id);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : </a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : SM_DBG(&quot;%s - eid = %d, pid = %d, name = %8s\n&quot;,</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : st_name(type), eid, pid,</a>
+<a name="535"><span class="lineNum"> 535 </span> : : strnlen(entry-&gt;name, 8) ? entry-&gt;name : &quot;&quot;);</a>
+<a name="536"><span class="lineNum"> 536 </span> : : </a>
+<a name="537"><span class="lineNum"> 537 </span> : : /* empty slot, ignore it */</a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : if (eid == 0x0 &amp;&amp; pid == 0x0)</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : </a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : if (type != st_root &amp;&amp; type != st_rc_slot) {</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : parent = find_slot_entry_node(dt_slots, pid);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : if (!parent) {</span></a>
+<a name="544"><span class="lineNum"> 544 </span> :<span class="lineNoCov"> 0 : SM_ERR(&quot;Unable to find node for parent slot (id = %d)\n&quot;,</span></a>
+<a name="545"><span class="lineNum"> 545 </span> : : pid);</a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : }</a>
+<a name="548"><span class="lineNum"> 548 </span> : : }</a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : switch (type) {</span></a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : case st_root:</span></a>
+<a name="552"><span class="lineNum"> 552 </span> : : case st_rc_slot:</a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : node = dt_new_2addr(dt_slots, &quot;root-complex&quot;,</span></a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineNoCov"> 0 : chip_id, entry-&gt;phb_index);</span></a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : if (!node) {</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : SM_ERR(&quot;Couldn't add DT node\n&quot;);</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="558"><span class="lineNum"> 558 </span> : : }</a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg&quot;, chip_id, entry-&gt;phb_index);</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;#address-cells&quot;, 2);</span></a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;compatible&quot;,</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : &quot;ibm,pcie-port&quot;, &quot;ibm,pcie-root-port&quot;);</a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,chip-id&quot;, chip_id);</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : parent = node;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> : : </a>
+<a name="567"><span class="lineNum"> 567 </span> : : /*</a>
+<a name="568"><span class="lineNum"> 568 </span> : : * The representation of slots attached directly to the</a>
+<a name="569"><span class="lineNum"> 569 </span> : : * root complex is a bit wierd. If this is just a root</a>
+<a name="570"><span class="lineNum"> 570 </span> : : * complex then stop here, otherwise fall through to create</a>
+<a name="571"><span class="lineNum"> 571 </span> : : * the slot node.</a>
+<a name="572"><span class="lineNum"> 572 </span> : : */</a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : if (type == st_root)</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : </a>
+<a name="576"><span class="lineNum"> 576 </span> : : /* fallthrough*/</a>
+<a name="577"><span class="lineNum"> 577 </span> : : case st_sw_upstream:</a>
+<a name="578"><span class="lineNum"> 578 </span> : : case st_builtin:</a>
+<a name="579"><span class="lineNum"> 579 </span> : : case st_slot:</a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineNoCov"> 0 : if (!is_port(parent)) {</span></a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : SM_ERR(&quot;%s connected to %s (%d), should be %s or %s!\n&quot;,</span></a>
+<a name="582"><span class="lineNum"> 582 </span> : : st_name(type), parent-&gt;name, pid,</a>
+<a name="583"><span class="lineNum"> 583 </span> : : st_name(st_root), st_name(st_sw_downstream));</a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="585"><span class="lineNum"> 585 </span> : : }</a>
+<a name="586"><span class="lineNum"> 586 </span> : : </a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : vid = (be32_to_cpu(entry-&gt;vendor_id) &amp; 0xffff);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : did = (be32_to_cpu(entry-&gt;device_id) &amp; 0xffff);</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;Found %s slot with %x:%x\n&quot;,</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : st_name(type), vid, did);</a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> : : /* The VID:DID is only meaningful for builtins and switches */</a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : if (type == st_sw_upstream &amp;&amp; vid &amp;&amp; did) {</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : node = dt_new_2addr(parent, st_name(type), vid, did);</span></a>
+<a name="596"><span class="lineNum"> 596 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg&quot;, vid, did);</span></a>
+<a name="597"><span class="lineNum"> 597 </span> : : } else {</a>
+<a name="598"><span class="lineNum"> 598 </span> : : /*</a>
+<a name="599"><span class="lineNum"> 599 </span> : : * If we get no vdid then create a &quot;wildcard&quot; slot</a>
+<a name="600"><span class="lineNum"> 600 </span> : : * that matches any device</a>
+<a name="601"><span class="lineNum"> 601 </span> : : */</a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : node = dt_new(parent, st_name(type));</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : }</a>
+<a name="604"><span class="lineNum"> 604 </span> : : </a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : if (type == st_sw_upstream) {</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;#address-cells&quot;, 1);</span></a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;upstream-port&quot;,</span></a>
+<a name="609"><span class="lineNum"> 609 </span> : : entry-&gt;up_port);</a>
+<a name="610"><span class="lineNum"> 610 </span> : : }</a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : case st_sw_downstream: /* slot connected to switch output */</span></a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineNoCov"> 0 : node = dt_new_addr(parent, &quot;down-port&quot;, entry-&gt;down_port);</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;compatible&quot;,</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : &quot;ibm,pcie-port&quot;);</a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg&quot;, entry-&gt;down_port);</span></a>
+<a name="618"><span class="lineNum"> 618 </span> : : </a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="620"><span class="lineNum"> 620 </span> : : </a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineNoCov"> 0 : SM_ERR(&quot;Unknown slot map type %x\n&quot;, entry-&gt;type);</span></a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : }</a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> : : /*</a>
+<a name="627"><span class="lineNum"> 627 </span> : : * Now add any generic slot map properties.</a>
+<a name="628"><span class="lineNum"> 628 </span> : : */</a>
+<a name="629"><span class="lineNum"> 629 </span> : : </a>
+<a name="630"><span class="lineNum"> 630 </span> : : /* private since we don't want hdat stuff leaking */</a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, DT_PRIVATE &quot;entry_id&quot;, eid);</span></a>
+<a name="632"><span class="lineNum"> 632 </span> : : </a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;mrw_slot_id)</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;mrw-slot-id&quot;,</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : be16_to_cpu(entry-&gt;mrw_slot_id));</a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;lane_mask)</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;lane-mask&quot;,</span></a>
+<a name="639"><span class="lineNum"> 639 </span> : : be16_to_cpu(entry-&gt;lane_mask));</a>
+<a name="640"><span class="lineNum"> 640 </span> : : </a>
+<a name="641"><span class="lineNum"> 641 </span> : : /* what is the difference between this and the lane reverse? */</a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;lane_reverse)</span></a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;lanes-reversed&quot;,</span></a>
+<a name="644"><span class="lineNum"> 644 </span> : : be16_to_cpu(entry-&gt;lane_reverse));</a>
+<a name="645"><span class="lineNum"> 645 </span> : : </a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineNoCov"> 0 : if (strnlen(entry-&gt;name, sizeof(entry-&gt;name))) {</span></a>
+<a name="647"><span class="lineNum"> 647 </span> : : /*</a>
+<a name="648"><span class="lineNum"> 648 </span> : : * HACK: On some platforms (witherspoon) the slot label is</a>
+<a name="649"><span class="lineNum"> 649 </span> : : * applied to the device rather than the pcie downstream port</a>
+<a name="650"><span class="lineNum"> 650 </span> : : * that has the slot under it. Hack around this by moving the</a>
+<a name="651"><span class="lineNum"> 651 </span> : : * slot label up if the parent port doesn't have one.</a>
+<a name="652"><span class="lineNum"> 652 </span> : : */</a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : if (dt_node_is_compatible(node-&gt;parent, &quot;ibm,pcie-port&quot;) &amp;&amp;</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : !dt_find_property(node-&gt;parent, &quot;ibm,slot-label&quot;)) {</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : dt_add_property_nstr(node-&gt;parent, &quot;ibm,slot-label&quot;,</span></a>
+<a name="656"><span class="lineNum"> 656 </span> :<span class="lineNoCov"> 0 : entry-&gt;name, sizeof(entry-&gt;name));</span></a>
+<a name="657"><span class="lineNum"> 657 </span> : : }</a>
+<a name="658"><span class="lineNum"> 658 </span> : : </a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineNoCov"> 0 : dt_add_property_nstr(node, &quot;ibm,slot-label&quot;,</span></a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineNoCov"> 0 : entry-&gt;name, sizeof(entry-&gt;name));</span></a>
+<a name="661"><span class="lineNum"> 661 </span> : : }</a>
+<a name="662"><span class="lineNum"> 662 </span> : : </a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;type == st_slot || entry-&gt;type == st_rc_slot)</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;ibm,pluggable&quot;, NULL, 0);</span></a>
+<a name="665"><span class="lineNum"> 665 </span> : : </a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineNoCov"> 0 : if (details)</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineNoCov"> 0 : parse_slot_details(node, details);</span></a>
+<a name="668"><span class="lineNum"> 668 </span> : : }</a>
+<a name="669"><span class="lineNum"> 669 </span> : : </a>
+<a name="670"><span class="lineNum"> 670 </span> : : /*</a>
+<a name="671"><span class="lineNum"> 671 </span> : : * Under the IOHUB structure we have and idata array describing</a>
+<a name="672"><span class="lineNum"> 672 </span> : : * the PHBs under each chip. The IOHUB structure also has a child</a>
+<a name="673"><span class="lineNum"> 673 </span> : : * array called IOSLOT which describes slot map. The i`th element</a>
+<a name="674"><span class="lineNum"> 674 </span> : : * of the IOSLOT array corresponds to the slot map of the i`th</a>
+<a name="675"><span class="lineNum"> 675 </span> : : * element of the iohubs idata array.</a>
+<a name="676"><span class="lineNum"> 676 </span> : : *</a>
+<a name="677"><span class="lineNum"> 677 </span> : : * Probably.</a>
+<a name="678"><span class="lineNum"> 678 </span> : : *</a>
+<a name="679"><span class="lineNum"> 679 </span> : : * Furthermore, arrayarrayarrayarrayarray.</a>
+<a name="680"><span class="lineNum"> 680 </span> : : */</a>
+<a name="681"><span class="lineNum"> 681 </span> : : </a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineNoCov"> 0 : static struct dt_node *get_slot_node(void)</span></a>
+<a name="683"><span class="lineNum"> 683 </span> : : {</a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineNoCov"> 0 : struct dt_node *slots = dt_find_by_name(dt_root, &quot;ibm,pcie-slots&quot;);</span></a>
+<a name="685"><span class="lineNum"> 685 </span> : : </a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : if (!slots) {</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : slots = dt_new(dt_root, &quot;ibm,pcie-slots&quot;);</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(slots, &quot;#address-cells&quot;, 2);</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(slots, &quot;#size-cells&quot;, 0);</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : }</a>
+<a name="691"><span class="lineNum"> 691 </span> : : </a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineNoCov"> 0 : return slots;</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : }</a>
+<a name="694"><span class="lineNum"> 694 </span> : : </a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 6 : static void io_parse_slots(const struct HDIF_common_hdr *sp_iohubs, int hub_id)</span></a>
+<a name="696"><span class="lineNum"> 696 </span> : : {</a>
+<a name="697"><span class="lineNum"> 697 </span> : : const struct HDIF_child_ptr *ioslot_arr;</a>
+<a name="698"><span class="lineNum"> 698 </span> : : const struct HDIF_array_hdr *entry_arr;</a>
+<a name="699"><span class="lineNum"> 699 </span> : : const struct HDIF_common_hdr *ioslot;</a>
+<a name="700"><span class="lineNum"> 700 </span> : : const struct slot_map_entry *entry;</a>
+<a name="701"><span class="lineNum"> 701 </span> : : unsigned int i, count;</a>
+<a name="702"><span class="lineNum"> 702 </span> : : </a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 6 : if (be16_to_cpu(sp_iohubs-&gt;child_count) &lt;= CECHUB_CHILD_IOSLOTS)</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="705"><span class="lineNum"> 705 </span> : : </a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : ioslot_arr = HDIF_child_arr(sp_iohubs, CECHUB_CHILD_IOSLOTS);</span></a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineNoCov"> 0 : if (!ioslot_arr)</span></a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineNoCov"> 0 : count = be32_to_cpu(ioslot_arr-&gt;count); /* should only be 1 */</span></a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (!count)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="713"><span class="lineNum"> 713 </span> : : </a>
+<a name="714"><span class="lineNum"> 714 </span> :<span class="lineNoCov"> 0 : dt_slots = get_slot_node();</span></a>
+<a name="715"><span class="lineNum"> 715 </span> : : </a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;CEC: Found slot map for IOHUB %d\n&quot;, hub_id);</span></a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : if (count &gt; 1)</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CEC: Multiple IOSLOTs found for IO HUB %d\n&quot;, hub_id);</span></a>
+<a name="719"><span class="lineNum"> 719 </span> : : </a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineNoCov"> 0 : ioslot = HDIF_child(sp_iohubs, ioslot_arr, 0, &quot;IOSLOT&quot;);</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineNoCov"> 0 : if (!ioslot)</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="723"><span class="lineNum"> 723 </span> : : </a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : entry_arr = HDIF_get_iarray(ioslot, IOSLOT_IDATA_SLOTMAP, NULL);</span></a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineNoCov"> 0 : HDIF_iarray_for_each(entry_arr, i, entry) {</span></a>
+<a name="726"><span class="lineNum"> 726 </span> : : const struct slot_map_details *details;</a>
+<a name="727"><span class="lineNum"> 727 </span> : : </a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : details = find_slot_details(ioslot,</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : be16_to_cpu(entry-&gt;entry_id));</span></a>
+<a name="730"><span class="lineNum"> 730 </span> :<span class="lineNoCov"> 0 : parse_one_slot(entry, details, hub_id);</span></a>
+<a name="731"><span class="lineNum"> 731 </span> : : }</a>
+<a name="732"><span class="lineNum"> 732 </span> : : }</a>
+<a name="733"><span class="lineNum"> 733 </span> : : </a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineCov"> 3 : static void io_parse_fru(const void *sp_iohubs)</span></a>
+<a name="735"><span class="lineNum"> 735 </span> : : {</a>
+<a name="736"><span class="lineNum"> 736 </span> : : unsigned int i;</a>
+<a name="737"><span class="lineNum"> 737 </span> : : int count;</a>
+<a name="738"><span class="lineNum"> 738 </span> : : </a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineCov"> 3 : count = HDIF_get_iarray_size(sp_iohubs, CECHUB_FRU_IO_HUBS);</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 3 : if (count &lt; 1) {</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CEC: IO FRU with no chips !\n&quot;);</span></a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="743"><span class="lineNum"> 743 </span> : : }</a>
+<a name="744"><span class="lineNum"> 744 </span> : : </a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineCov"> 3 : prlog(PR_INFO, &quot;CEC: %d chips in FRU\n&quot;, count);</span></a>
+<a name="746"><span class="lineNum"> 746 </span> : : </a>
+<a name="747"><span class="lineNum"> 747 </span> : : /* Iterate IO hub array */</a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineCov"> 9 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="749"><span class="lineNum"> 749 </span> : : const struct cechub_io_hub *hub;</a>
+<a name="750"><span class="lineNum"> 750 </span> : : unsigned int size, hub_id;</a>
+<a name="751"><span class="lineNum"> 751 </span> : : uint32_t chip_id;</a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> :<span class="lineCov"> 6 : hub = HDIF_get_iarray_item(sp_iohubs, CECHUB_FRU_IO_HUBS,</span></a>
+<a name="754"><span class="lineNum"> 754 </span> : : i, &amp;size);</a>
+<a name="755"><span class="lineNum"> 755 </span> :<span class="lineCov"> 6 : if (!hub || size &lt; CECHUB_IOHUB_MIN_SIZE) {</span></a>
+<a name="756"><span class="lineNum"> 756 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CEC: IO-HUB Chip %d bad idata\n&quot;, i);</span></a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="758"><span class="lineNum"> 758 </span> : : }</a>
+<a name="759"><span class="lineNum"> 759 </span> : : </a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineCov"> 6 : switch (hub-&gt;flags &amp; CECHUB_HUB_FLAG_STATE_MASK) {</span></a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineCov"> 6 : case CECHUB_HUB_FLAG_STATE_OK:</span></a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineCov"> 6 : prlog(PR_DEBUG, &quot;CEC: IO Hub Chip #%d OK\n&quot;, i);</span></a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="764"><span class="lineNum"> 764 </span> :<span class="lineNoCov"> 0 : case CECHUB_HUB_FLAG_STATE_FAILURES:</span></a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;CEC: IO Hub Chip #%d OK&quot;</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : &quot; with failures\n&quot;, i);</a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : case CECHUB_HUB_FLAG_STATE_NOT_INST:</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;CEC: IO Hub Chip #%d&quot;</span></a>
+<a name="770"><span class="lineNum"> 770 </span> : : &quot; Not installed\n&quot;, i);</a>
+<a name="771"><span class="lineNum"> 771 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : case CECHUB_HUB_FLAG_STATE_UNUSABLE:</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;CEC: IO Hub Chip #%d Unusable\n&quot;, i);</span></a>
+<a name="774"><span class="lineNum"> 774 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="775"><span class="lineNum"> 775 </span> : : }</a>
+<a name="776"><span class="lineNum"> 776 </span> : : </a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 6 : hub_id = be16_to_cpu(hub-&gt;iohub_id);</span></a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> : : /* GX BAR assignment */</a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 6 : prlog(PR_DEBUG, &quot;CEC: PChip: %d HUB ID: %04x [EC=0x%x]&quot;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : &quot; Hub#=%d)\n&quot;,</a>
+<a name="782"><span class="lineNum"> 782 </span> : : be32_to_cpu(hub-&gt;proc_chip_id), hub_id,</a>
+<a name="783"><span class="lineNum"> 783 </span> : : be32_to_cpu(hub-&gt;ec_level), be16_to_cpu(hub-&gt;hub_num));</a>
+<a name="784"><span class="lineNum"> 784 </span> : : </a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 6 : switch(hub_id) {</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineCov"> 6 : case CECHUB_HUB_MURANO:</span></a>
+<a name="787"><span class="lineNum"> 787 </span> : : case CECHUB_HUB_MURANO_SEGU:</a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineCov"> 6 : prlog(PR_INFO, &quot;CEC: Murano !\n&quot;);</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 6 : io_add_p8(hub, sp_iohubs);</span></a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="791"><span class="lineNum"> 791 </span> :<span class="lineNoCov"> 0 : case CECHUB_HUB_VENICE_WYATT:</span></a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;CEC: Venice !\n&quot;);</span></a>
+<a name="793"><span class="lineNum"> 793 </span> :<span class="lineNoCov"> 0 : io_add_p8(hub, sp_iohubs);</span></a>
+<a name="794"><span class="lineNum"> 794 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineNoCov"> 0 : case CECHUB_HUB_NIMBUS_SFORAZ:</span></a>
+<a name="796"><span class="lineNum"> 796 </span> : : case CECHUB_HUB_NIMBUS_MONZA:</a>
+<a name="797"><span class="lineNum"> 797 </span> : : case CECHUB_HUB_NIMBUS_LAGRANGE:</a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;CEC: Nimbus !\n&quot;);</span></a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : io_add_p9(hub, sp_iohubs);</span></a>
+<a name="800"><span class="lineNum"> 800 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : case CECHUB_HUB_CUMULUS_DUOMO:</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;CEC: Cumulus !\n&quot;);</span></a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineNoCov"> 0 : io_add_p9(hub, sp_iohubs);</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : case CECHUB_HUB_AXONE_HOPPER:</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;CEC: Axone !\n&quot;);</span></a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineNoCov"> 0 : io_add_p9(hub, sp_iohubs);</span></a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;CEC: Hub ID 0x%04x unsupported !\n&quot;,</span></a>
+<a name="811"><span class="lineNum"> 811 </span> : : hub_id);</a>
+<a name="812"><span class="lineNum"> 812 </span> : : }</a>
+<a name="813"><span class="lineNum"> 813 </span> : : </a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineCov"> 6 : chip_id = pcid_to_chip_id(be32_to_cpu(hub-&gt;proc_chip_id));</span></a>
+<a name="815"><span class="lineNum"> 815 </span> : : </a>
+<a name="816"><span class="lineNum"> 816 </span> : : /* parse the slot map if we have one */</a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 6 : io_parse_slots(sp_iohubs, chip_id);</span></a>
+<a name="818"><span class="lineNum"> 818 </span> : : }</a>
+<a name="819"><span class="lineNum"> 819 </span> : : </a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineCov"> 3 : if (proc_gen == proc_gen_p8 || proc_gen == proc_gen_p9)</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 3 : io_add_p8_cec_vpd(sp_iohubs);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> : : }</a>
+<a name="823"><span class="lineNum"> 823 </span> : : </a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineCov"> 2 : void io_parse(void)</span></a>
+<a name="825"><span class="lineNum"> 825 </span> : : {</a>
+<a name="826"><span class="lineNum"> 826 </span> : : const struct HDIF_common_hdr *sp_iohubs;</a>
+<a name="827"><span class="lineNum"> 827 </span> : : unsigned int i, size;</a>
+<a name="828"><span class="lineNum"> 828 </span> : : </a>
+<a name="829"><span class="lineNum"> 829 </span> : : /* Look for IO Hubs */</a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineCov"> 2 : if (!get_hdif(&amp;spira.ntuples.cec_iohub_fru, &quot;IO HUB&quot;)) {</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CEC: Cannot locate IO Hub FRU data !\n&quot;);</span></a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> : : }</a>
+<a name="834"><span class="lineNum"> 834 </span> : : </a>
+<a name="835"><span class="lineNum"> 835 </span> : : /*</a>
+<a name="836"><span class="lineNum"> 836 </span> : : * Note about LXRn numbering ...</a>
+<a name="837"><span class="lineNum"> 837 </span> : : *</a>
+<a name="838"><span class="lineNum"> 838 </span> : : * I can't completely make sense of what that is supposed to be, so</a>
+<a name="839"><span class="lineNum"> 839 </span> : : * for now, what we do is look for the first one we can find and</a>
+<a name="840"><span class="lineNum"> 840 </span> : : * increment it for each chip. Works for the machines I have here</a>
+<a name="841"><span class="lineNum"> 841 </span> : : */</a>
+<a name="842"><span class="lineNum"> 842 </span> : : </a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineCov"> 5 : for_each_ntuple_idx(&amp;spira.ntuples.cec_iohub_fru, sp_iohubs, i,</span></a>
+<a name="844"><span class="lineNum"> 844 </span> : : CECHUB_FRU_HDIF_SIG) {</a>
+<a name="845"><span class="lineNum"> 845 </span> : : const struct cechub_hub_fru_id *fru_id_data;</a>
+<a name="846"><span class="lineNum"> 846 </span> : : unsigned int type;</a>
+<a name="847"><span class="lineNum"> 847 </span> : : static const char *typestr[] = {</a>
+<a name="848"><span class="lineNum"> 848 </span> : : &quot;Reservation&quot;,</a>
+<a name="849"><span class="lineNum"> 849 </span> : : &quot;Card&quot;,</a>
+<a name="850"><span class="lineNum"> 850 </span> : : &quot;CPU Card&quot;,</a>
+<a name="851"><span class="lineNum"> 851 </span> : : &quot;Backplane&quot;,</a>
+<a name="852"><span class="lineNum"> 852 </span> : : &quot;Backplane Extension&quot;</a>
+<a name="853"><span class="lineNum"> 853 </span> : : };</a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineCov"> 3 : fru_id_data = HDIF_get_idata(sp_iohubs, CECHUB_FRU_ID_DATA_AREA,</span></a>
+<a name="855"><span class="lineNum"> 855 </span> : : &amp;size);</a>
+<a name="856"><span class="lineNum"> 856 </span> :<span class="lineCov"> 3 : if (!fru_id_data || size &lt; sizeof(struct cechub_hub_fru_id)) {</span></a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CEC: IO-HUB FRU %d, bad ID data\n&quot;, i);</span></a>
+<a name="858"><span class="lineNum"> 858 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="859"><span class="lineNum"> 859 </span> : : }</a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineCov"> 3 : type = be32_to_cpu(fru_id_data-&gt;card_type);</span></a>
+<a name="861"><span class="lineNum"> 861 </span> : : </a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineCov"> 3 : prlog(PR_INFO, &quot;CEC: HUB FRU %d is %s\n&quot;,</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : i, type &gt; 4 ? &quot;Unknown&quot; : typestr[type]);</a>
+<a name="864"><span class="lineNum"> 864 </span> : : </a>
+<a name="865"><span class="lineNum"> 865 </span> : : /*</a>
+<a name="866"><span class="lineNum"> 866 </span> : : * We currently only handle the backplane (Juno) and</a>
+<a name="867"><span class="lineNum"> 867 </span> : : * processor FRU (P8 machines)</a>
+<a name="868"><span class="lineNum"> 868 </span> : : */</a>
+<a name="869"><span class="lineNum"> 869 </span> :<span class="lineCov"> 3 : if (type != CECHUB_FRU_TYPE_CEC_BKPLANE &amp;&amp;</span></a>
+<a name="870"><span class="lineNum"> 870 </span> : : type != CECHUB_FRU_TYPE_CPU_CARD) {</a>
+<a name="871"><span class="lineNum"> 871 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CEC: Unsupported type\n&quot;);</span></a>
+<a name="872"><span class="lineNum"> 872 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="873"><span class="lineNum"> 873 </span> : : }</a>
+<a name="874"><span class="lineNum"> 874 </span> : : </a>
+<a name="875"><span class="lineNum"> 875 </span> : : /* We don't support Hubs connected to pass-through ports */</a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineCov"> 3 : if (fru_id_data-&gt;flags &amp; (CECHUB_FRU_FLAG_HEADLESS |</span></a>
+<a name="877"><span class="lineNum"> 877 </span> : : CECHUB_FRU_FLAG_PASSTHROUGH)) {</a>
+<a name="878"><span class="lineNum"> 878 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CEC: Headless or Passthrough unsupported\n&quot;);</span></a>
+<a name="879"><span class="lineNum"> 879 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="880"><span class="lineNum"> 880 </span> : : }</a>
+<a name="881"><span class="lineNum"> 881 </span> : : </a>
+<a name="882"><span class="lineNum"> 882 </span> : : /* Ok, we have a reasonable candidate */</a>
+<a name="883"><span class="lineNum"> 883 </span> :<span class="lineCov"> 3 : io_parse_fru(sp_iohubs);</span></a>
+<a name="884"><span class="lineNum"> 884 </span> : : }</a>
+<a name="885"><span class="lineNum"> 885 </span> : : }</a>
+<a name="886"><span class="lineNum"> 886 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/memory.c.func-sort-c.html b/coverage-report/hdata/memory.c.func-sort-c.html
new file mode 100644
index 0000000..39e2576
--- /dev/null
+++ b/coverage-report/hdata/memory.c.func-sort-c.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/memory.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - memory.c<span style="font-size: 80%;"> (<a href="memory.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">151</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">36.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryLo">68.4 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="memory.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#388">add_dimm_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#715">add_hb_reserve_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#461">add_memory_controller_p9n</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#454">dt_add_mem_reg_property</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#116">update_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#349">vpd_parse_spd</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#889">__memory_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#749">get_hb_reserved_mem</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#605">get_msareas</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#947">memory_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#836">parse_trace_reservations</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#95">append_chip_id</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#138">add_address_range</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#227">add_bus_freq_to_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#210">add_chip_id_to_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#506">add_memory_buffer_mmio</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#588">add_memory_controller</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#277">add_size_to_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#293">vpd_add_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/memory.c.func.html b/coverage-report/hdata/memory.c.func.html
new file mode 100644
index 0000000..32bab03
--- /dev/null
+++ b/coverage-report/hdata/memory.c.func.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/memory.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - memory.c<span style="font-size: 80%;"> (<a href="memory.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">151</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">36.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryLo">68.4 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="memory.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#889">__memory_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#138">add_address_range</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#227">add_bus_freq_to_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#210">add_chip_id_to_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#388">add_dimm_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#715">add_hb_reserve_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#506">add_memory_buffer_mmio</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#588">add_memory_controller</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#461">add_memory_controller_p9n</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#277">add_size_to_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#95">append_chip_id</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#454">dt_add_mem_reg_property</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#749">get_hb_reserved_mem</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#605">get_msareas</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#947">memory_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#836">parse_trace_reservations</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#116">update_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#293">vpd_add_ram_area</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memory.c.gcov.html#349">vpd_parse_spd</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/memory.c.gcov.html b/coverage-report/hdata/memory.c.gcov.html
new file mode 100644
index 0000000..a884321
--- /dev/null
+++ b/coverage-report/hdata/memory.c.gcov.html
@@ -0,0 +1,1041 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/memory.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - memory.c<span style="font-size: 80%;"> (source / <a href="memory.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">151</td>
+ <td class="headerCovTableEntry">419</td>
+ <td class="headerCovTableEntryLo">36.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryLo">68.4 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;device.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;libfdt/libfdt.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;mem_region.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;processor.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;spira.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : struct HDIF_ram_area_id {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : __be16 id;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define RAM_AREA_INSTALLED 0x8000</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define RAM_AREA_FUNCTIONAL 0x4000</a>
+<a name="21"><span class="lineNum"> 21 </span> : : __be16 flags;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : __be32 dimm_id;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : __be32 speed;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : } __packed;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : struct HDIF_ram_area_size {</a>
+<a name="27"><span class="lineNum"> 27 </span> : : __be32 reserved1;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : __be32 mb;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : } __packed;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : struct HDIF_ms_area_address_range {</a>
+<a name="32"><span class="lineNum"> 32 </span> : : __be64 start;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : __be64 end;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : __be32 chip;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : __be32 mirror_attr;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : __be64 mirror_start;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : __be32 controller_id;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : __be32 phys_attr;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : } __packed;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #define PHYS_ATTR_TYPE_MASK 0xff000000</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define PHYS_ATTR_TYPE_STD 0</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define PHYS_ATTR_TYPE_NVDIMM 1</a>
+<a name="43"><span class="lineNum"> 43 </span> : : #define PHYS_ATTR_TYPE_MRAM 2</a>
+<a name="44"><span class="lineNum"> 44 </span> : : #define PHYS_ATTR_TYPE_PCM 3</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define PHYS_ATTR_STATUS_MASK 0x00ff0000</a>
+<a name="47"><span class="lineNum"> 47 </span> : : /*</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * The values here are mutually exclusive. I have no idea why anyone</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * decided encoding these are flags rather than sequential numbers was</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * a good idea, but here we are.</a>
+<a name="51"><span class="lineNum"> 51 </span> : : */</a>
+<a name="52"><span class="lineNum"> 52 </span> : : #define PHYS_ATTR_STATUS_CANT_SAVE 0x01</a>
+<a name="53"><span class="lineNum"> 53 </span> : : #define PHYS_ATTR_STATUS_SAVE_FAILED 0x02</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #define PHYS_ATTR_STATUS_SAVED 0x04</a>
+<a name="55"><span class="lineNum"> 55 </span> : : #define PHYS_ATTR_STATUS_NOT_SAVED 0x08</a>
+<a name="56"><span class="lineNum"> 56 </span> : : #define PHYS_ATTR_STATUS_MEM_INVALID 0xff</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : /* Memory Controller ID for Nimbus P9 systems */</a>
+<a name="59"><span class="lineNum"> 59 </span> : : #define MS_CONTROLLER_MCBIST_ID(id) GETFIELD(PPC_BITMASK32(0, 1), id)</a>
+<a name="60"><span class="lineNum"> 60 </span> : : #define MS_CONTROLLER_MCS_ID(id) GETFIELD(PPC_BITMASK32(4, 7), id)</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define MS_CONTROLLER_MCA_ID(id) GETFIELD(PPC_BITMASK32(8, 15), id)</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : /* Memory Controller ID for P9 AXONE systems */</a>
+<a name="64"><span class="lineNum"> 64 </span> : : #define MS_CONTROLLER_MC_ID(id) GETFIELD(PPC_BITMASK32(0, 1), id)</a>
+<a name="65"><span class="lineNum"> 65 </span> : : #define MS_CONTROLLER_MI_ID(id) GETFIELD(PPC_BITMASK32(4, 7), id)</a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define MS_CONTROLLER_MCC_ID(id) GETFIELD(PPC_BITMASK32(8, 15), id)</a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define MS_CONTROLLER_OMI_ID(id) GETFIELD(PPC_BITMASK32(16, 31), id)</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : struct HDIF_ms_area_id {</a>
+<a name="70"><span class="lineNum"> 70 </span> : : __be16 id;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : #define MS_PTYPE_RISER_CARD 0x8000</a>
+<a name="72"><span class="lineNum"> 72 </span> : : #define MS_PTYPE_MEM_CARD 0x4000</a>
+<a name="73"><span class="lineNum"> 73 </span> : : #define MS_PTYPE_CEC_FRU 0x2000</a>
+<a name="74"><span class="lineNum"> 74 </span> : : #define MS_PTYPE_HYBRID_CARD 0x1000</a>
+<a name="75"><span class="lineNum"> 75 </span> : : __be16 parent_type;</a>
+<a name="76"><span class="lineNum"> 76 </span> : : #define MS_AREA_INSTALLED 0x8000</a>
+<a name="77"><span class="lineNum"> 77 </span> : : #define MS_AREA_FUNCTIONAL 0x4000</a>
+<a name="78"><span class="lineNum"> 78 </span> : : #define MS_AREA_SHARED 0x2000</a>
+<a name="79"><span class="lineNum"> 79 </span> : : __be16 flags;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : __be16 share_id;</a>
+<a name="81"><span class="lineNum"> 81 </span> : : } __packed;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : // FIXME: it should be 9, current HDATs are broken</a>
+<a name="85"><span class="lineNum"> 85 </span> : : #define MSAREA_IDATA_MMIO_IDX 8</a>
+<a name="86"><span class="lineNum"> 86 </span> : : struct HDIF_ms_area_ocmb_mmio {</a>
+<a name="87"><span class="lineNum"> 87 </span> : : __be64 range_start;</a>
+<a name="88"><span class="lineNum"> 88 </span> : : __be64 range_end;</a>
+<a name="89"><span class="lineNum"> 89 </span> : : __be32 controller_id;</a>
+<a name="90"><span class="lineNum"> 90 </span> : : __be32 proc_chip_id;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : __be64 hbrt_id;</a>
+<a name="92"><span class="lineNum"> 92 </span> : : #define OCMB_SCOM_8BYTE_ACCESS PPC_BIT(0)</a>
+<a name="93"><span class="lineNum"> 93 </span> : : #define OCMB_SCOM_4BYTE_ACCESS PPC_BIT(1)</a>
+<a name="94"><span class="lineNum"> 94 </span> : : __be64 flags;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : } __packed;</a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 3 : static void append_chip_id(struct dt_node *mem, u32 id)</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : {</a>
+<a name="99"><span class="lineNum"> 99 </span> : : struct dt_property *prop;</a>
+<a name="100"><span class="lineNum"> 100 </span> : : size_t len, i;</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 3 : prop = __dt_find_property(mem, &quot;ibm,chip-id&quot;);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 3 : if (!prop)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 3 : return;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 3 : len = prop-&gt;len &gt;&gt; 2;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* Check if it exists already */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 3 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 3 : if (dt_property_get_cell(prop, i) == id)</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 3 : return;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : /* Add it to the list */</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : dt_resize_property(&amp;prop, (len + 1) &lt;&lt; 2);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : dt_property_set_cell(prop, len, id);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : }</a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : static void update_status(struct dt_node *mem, uint32_t status)</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : {</a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineNoCov"> 0 : switch (status) {</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineNoCov"> 0 : case PHYS_ATTR_STATUS_CANT_SAVE:</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineNoCov"> 0 : if (!dt_find_property(mem, &quot;save-trigged-unarmed&quot;))</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineNoCov"> 0 : dt_add_property(mem, &quot;save-trigger-unarmed&quot;, NULL, 0);</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : case PHYS_ATTR_STATUS_SAVE_FAILED:</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : if (!dt_find_property(mem, &quot;save-failed&quot;))</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : dt_add_property(mem, &quot;save-failed&quot;, NULL, 0);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : case PHYS_ATTR_STATUS_MEM_INVALID:</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : if (dt_find_property(mem, &quot;save-trigged-unarmed&quot;))</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(mem, &quot;status&quot;,</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : &quot;disabled-memory-invalid&quot;);</a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : }</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 6 : static bool add_address_range(struct dt_node *root,</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : const struct HDIF_ms_area_id *id,</a>
+<a name="142"><span class="lineNum"> 142 </span> : : const struct HDIF_ms_area_address_range *arange,</a>
+<a name="143"><span class="lineNum"> 143 </span> : : uint32_t mem_type, uint32_t mem_status)</a>
+<a name="144"><span class="lineNum"> 144 </span> : : {</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 6 : const char *compat = NULL, *dev_type = NULL, *name = NULL;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : struct dt_node *mem;</a>
+<a name="147"><span class="lineNum"> 147 </span> : : u32 chip_id;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : u64 reg[2];</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 6 : chip_id = pcid_to_chip_id(be32_to_cpu(arange-&gt;chip));</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 6 : prlog(PR_DEBUG, &quot; Range: 0x%016llx..0x%016llx &quot;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : &quot;on Chip 0x%x mattr: 0x%x pattr: 0x%x status:0x%x\n&quot;,</a>
+<a name="154"><span class="lineNum"> 154 </span> : : (long long)be64_to_cpu(arange-&gt;start),</a>
+<a name="155"><span class="lineNum"> 155 </span> : : (long long)be64_to_cpu(arange-&gt;end),</a>
+<a name="156"><span class="lineNum"> 156 </span> : : chip_id, be32_to_cpu(arange-&gt;mirror_attr),</a>
+<a name="157"><span class="lineNum"> 157 </span> : : mem_type, mem_status);</a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> : : /* reg contains start and length */</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 6 : reg[0] = cleanup_addr(be64_to_cpu(arange-&gt;start));</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 6 : reg[1] = cleanup_addr(be64_to_cpu(arange-&gt;end)) - reg[0];</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 6 : switch (mem_type) {</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 6 : case PHYS_ATTR_TYPE_STD:</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 6 : name = &quot;memory&quot;;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 6 : dev_type = &quot;memory&quot;;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : case PHYS_ATTR_TYPE_NVDIMM:</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : case PHYS_ATTR_TYPE_MRAM:</a>
+<a name="171"><span class="lineNum"> 171 </span> : : case PHYS_ATTR_TYPE_PCM:</a>
+<a name="172"><span class="lineNum"> 172 </span> : : /* fall through */</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : name = &quot;nvdimm&quot;;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : compat = &quot;pmem-region&quot;;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : </a>
+<a name="177"><span class="lineNum"> 177 </span> : : /*</a>
+<a name="178"><span class="lineNum"> 178 </span> : : * Future memory types could be volatile or non-volatile. Bail if don't</a>
+<a name="179"><span class="lineNum"> 179 </span> : : * recognise the type so we don't end up trashing data accidently.</a>
+<a name="180"><span class="lineNum"> 180 </span> : : */</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 6 : if (be16_to_cpu(id-&gt;flags) &amp; MS_AREA_SHARED) {</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 6 : mem = dt_find_by_name_addr(dt_root, name, reg[0]);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 6 : if (mem) {</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 3 : append_chip_id(mem, chip_id);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 3 : if (mem_type == PHYS_ATTR_TYPE_NVDIMM)</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : update_status(mem, mem_status);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 3 : return true;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : }</a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 3 : mem = dt_new_addr(root, name, reg[0]);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 3 : if (compat)</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(mem, &quot;compatible&quot;, compat);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 3 : if (dev_type)</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 3 : dt_add_property_string(mem, &quot;device_type&quot;, dev_type);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* add in the nvdimm backup status flags */</a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 3 : if (mem_type == PHYS_ATTR_TYPE_NVDIMM)</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : update_status(mem, mem_status);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> : : /* common properties */</a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 3 : dt_add_property_u64s(mem, &quot;reg&quot;, reg[0], reg[1]);</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 3 : dt_add_property_cells(mem, &quot;ibm,chip-id&quot;, chip_id);</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 3 : return true;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : }</a>
+<a name="211"><span class="lineNum"> 211 </span> : : </a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 6 : static u32 add_chip_id_to_ram_area(const struct HDIF_common_hdr *msarea,</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : struct dt_node *ram_area)</a>
+<a name="214"><span class="lineNum"> 214 </span> : : {</a>
+<a name="215"><span class="lineNum"> 215 </span> : : const struct HDIF_array_hdr *arr;</a>
+<a name="216"><span class="lineNum"> 216 </span> : : const struct HDIF_ms_area_address_range *arange;</a>
+<a name="217"><span class="lineNum"> 217 </span> : : unsigned int size;</a>
+<a name="218"><span class="lineNum"> 218 </span> : : u32 chip_id;</a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> : : /* Safe to assume pointers are valid here. */</a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 6 : arr = HDIF_get_idata(msarea, 4, &amp;size);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 6 : arange = (void *)arr + be32_to_cpu(arr-&gt;offset);</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 6 : chip_id = pcid_to_chip_id(be32_to_cpu(arange-&gt;chip));</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 6 : dt_add_property_cells(ram_area, &quot;ibm,chip-id&quot;, chip_id);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 6 : return chip_id;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 6 : static void add_bus_freq_to_ram_area(struct dt_node *ram_node, u32 chip_id)</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : {</a>
+<a name="231"><span class="lineNum"> 231 </span> : : const struct sppcia_cpu_timebase *timebase;</a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 6 : bool got_pcia = false;</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : const void *pcia;</a>
+<a name="234"><span class="lineNum"> 234 </span> : : u64 freq;</a>
+<a name="235"><span class="lineNum"> 235 </span> : : u32 size;</a>
+<a name="236"><span class="lineNum"> 236 </span> : : </a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 6 : pcia = get_hdif(&amp;spira.ntuples.pcia, SPPCIA_HDIF_SIG);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 6 : if (!pcia) {</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;HDAT: Failed to add memory bus frequency &quot;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : &quot;as PCIA does not exist\n&quot;);</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : }</a>
+<a name="243"><span class="lineNum"> 243 </span> : : </a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 26 : for_each_pcia(pcia) {</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : const struct sppcia_core_unique *id;</a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 26 : id = HDIF_get_idata(pcia, SPPCIA_IDATA_CORE_UNIQUE, &amp;size);</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 26 : if (!id || size &lt; sizeof(*id)) {</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;HDAT: Bad id size %u @ %p\n&quot;, size, id);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : }</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 26 : if (chip_id == pcid_to_chip_id(be32_to_cpu(id-&gt;proc_chip_id))) {</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 6 : got_pcia = true;</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : }</a>
+<a name="257"><span class="lineNum"> 257 </span> : : }</a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 6 : if (got_pcia == false)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 6 : timebase = HDIF_get_idata(pcia, SPPCIA_IDATA_TIMEBASE, &amp;size);</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 6 : if (!timebase || size &lt; sizeof(*timebase)) {</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : /**</a>
+<a name="265"><span class="lineNum"> 265 </span> : : * @fwts-label HDATBadTimebaseSize</a>
+<a name="266"><span class="lineNum"> 266 </span> : : * @fwts-advice HDAT described an invalid size for timebase,</a>
+<a name="267"><span class="lineNum"> 267 </span> : : * which means there's a disagreement between HDAT and OPAL.</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * This is most certainly a firmware bug.</a>
+<a name="269"><span class="lineNum"> 269 </span> : : */</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;HDAT: Bad timebase size %u @ %p\n&quot;, size,</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : timebase);</a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : }</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 6 : freq = ((u64)be32_to_cpu(timebase-&gt;memory_bus_frequency)) * 1000000ul;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 6 : dt_add_property_u64(ram_node, &quot;ibm,memory-bus-frequency&quot;, freq);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : }</a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 6 : static void add_size_to_ram_area(struct dt_node *ram_node,</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : const struct HDIF_common_hdr *ramarea)</a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : char str[16];</a>
+<a name="283"><span class="lineNum"> 283 </span> : : const struct HDIF_ram_area_size *ram_area_sz;</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> : : /* DIMM size */</a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 6 : ram_area_sz = HDIF_get_idata(ramarea, 3, NULL);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(ram_area_sz))</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 6 : memset(str, 0, 16);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 6 : snprintf(str, 16, &quot;%d&quot;, be32_to_cpu(ram_area_sz-&gt;mb));</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 6 : dt_add_property_string(ram_node, &quot;size&quot;, str);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 6 : static void vpd_add_ram_area(const struct HDIF_common_hdr *msarea)</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : {</a>
+<a name="297"><span class="lineNum"> 297 </span> : : unsigned int i;</a>
+<a name="298"><span class="lineNum"> 298 </span> : : unsigned int ram_sz;</a>
+<a name="299"><span class="lineNum"> 299 </span> : : const struct HDIF_common_hdr *ramarea;</a>
+<a name="300"><span class="lineNum"> 300 </span> : : const struct HDIF_child_ptr *ramptr;</a>
+<a name="301"><span class="lineNum"> 301 </span> : : const struct HDIF_ram_area_id *ram_id;</a>
+<a name="302"><span class="lineNum"> 302 </span> : : struct dt_node *ram_node;</a>
+<a name="303"><span class="lineNum"> 303 </span> : : u32 chip_id;</a>
+<a name="304"><span class="lineNum"> 304 </span> : : const void *vpd_blob;</a>
+<a name="305"><span class="lineNum"> 305 </span> : : </a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 6 : ramptr = HDIF_child_arr(msarea, 0);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(ramptr)) {</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS AREA: No RAM area at %p\n&quot;, msarea);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 12 : for (i = 0; i &lt; be32_to_cpu(ramptr-&gt;count); i++) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 6 : ramarea = HDIF_child(msarea, ramptr, i, &quot;RAM &quot;);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(ramarea))</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 6 : ram_id = HDIF_get_idata(ramarea, 2, &amp;ram_sz);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(ram_id))</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Don't add VPD for non-existent RAM */</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 6 : if (!(be16_to_cpu(ram_id-&gt;flags) &amp; RAM_AREA_INSTALLED))</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 6 : ram_node = dt_add_vpd_node(ramarea, 0, 1);</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 6 : if (!ram_node)</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : </a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 6 : chip_id = add_chip_id_to_ram_area(msarea, ram_node);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 6 : add_bus_freq_to_ram_area(ram_node, chip_id);</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 6 : if (ram_sz &gt;= offsetof(struct HDIF_ram_area_id, speed)) {</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(ram_node, &quot;frequency&quot;,</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : be32_to_cpu(ram_id-&gt;speed)*1000000);</a>
+<a name="335"><span class="lineNum"> 335 </span> : : }</a>
+<a name="336"><span class="lineNum"> 336 </span> : : </a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 6 : vpd_blob = HDIF_get_idata(ramarea, 1, &amp;ram_sz);</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : </a>
+<a name="339"><span class="lineNum"> 339 </span> : : /* DIMM size */</a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 6 : add_size_to_ram_area(ram_node, ramarea);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> : : /*</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * For direct-attached memory we have a DDR &quot;Serial</a>
+<a name="343"><span class="lineNum"> 343 </span> : : * Presence Detection&quot; blob rather than an IBM keyword</a>
+<a name="344"><span class="lineNum"> 344 </span> : : * blob.</a>
+<a name="345"><span class="lineNum"> 345 </span> : : */</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 6 : if (!vpd_valid(vpd_blob, ram_sz))</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : dt_add_property(ram_node, &quot;spd&quot;, vpd_blob, ram_sz);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : }</a>
+<a name="349"><span class="lineNum"> 349 </span> : : }</a>
+<a name="350"><span class="lineNum"> 350 </span> : : </a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : static void vpd_parse_spd(struct dt_node *dimm, const char *spd, u32 size)</span></a>
+<a name="352"><span class="lineNum"> 352 </span> : : {</a>
+<a name="353"><span class="lineNum"> 353 </span> : : __be16 *vendor;</a>
+<a name="354"><span class="lineNum"> 354 </span> : : __be32 *sn;</a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> : : /* SPD is too small */</a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : if (size &lt; 512) {</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;MSVPD: Invalid SPD size. &quot;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> : : &quot;Expected 512 bytes, got %d\n&quot;, size);</a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> : : }</a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> : : /* Supports DDR4 format pasing only */</a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : if (spd[0x2] &lt; 0xc) {</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING,</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : &quot;MSVPD: SPD format (%x) not supported\n&quot;, spd[0x2]);</a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : }</a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dimm, &quot;device_type&quot;, &quot;memory-dimm-ddr4&quot;);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : </a>
+<a name="372"><span class="lineNum"> 372 </span> : : /* DRAM device type */</a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dimm, &quot;memory-id&quot;, spd[0x2]);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : </a>
+<a name="375"><span class="lineNum"> 375 </span> : : /* Module revision code */</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dimm, &quot;product-version&quot;, spd[0x15d]);</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : </a>
+<a name="378"><span class="lineNum"> 378 </span> : : /* Serial number */</a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : sn = (__be32 *)&amp;spd[0x145];</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dimm, &quot;serial-number&quot;, be32_to_cpu(*sn));</span></a>
+<a name="381"><span class="lineNum"> 381 </span> : : </a>
+<a name="382"><span class="lineNum"> 382 </span> : : /* Part number */</a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : dt_add_property_nstr(dimm, &quot;part-number&quot;, &amp;spd[0x149], 20);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> : : </a>
+<a name="385"><span class="lineNum"> 385 </span> : : /* Module manufacturer ID */</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : vendor = (__be16 *)&amp;spd[0x140];</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dimm, &quot;manufacturer-id&quot;, be16_to_cpu(*vendor));</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : static void add_dimm_info(struct dt_node *parent,</span></a>
+<a name="391"><span class="lineNum"> 391 </span> : : const struct HDIF_common_hdr *msarea)</a>
+<a name="392"><span class="lineNum"> 392 </span> : : {</a>
+<a name="393"><span class="lineNum"> 393 </span> : : unsigned int i, size;</a>
+<a name="394"><span class="lineNum"> 394 </span> : : const struct HDIF_child_ptr *ramptr;</a>
+<a name="395"><span class="lineNum"> 395 </span> : : const struct HDIF_common_hdr *ramarea;</a>
+<a name="396"><span class="lineNum"> 396 </span> : : const struct spira_fru_id *fru_id;</a>
+<a name="397"><span class="lineNum"> 397 </span> : : const struct HDIF_ram_area_id *ram_id;</a>
+<a name="398"><span class="lineNum"> 398 </span> : : const struct HDIF_ram_area_size *ram_area_sz;</a>
+<a name="399"><span class="lineNum"> 399 </span> : : struct dt_node *dimm;</a>
+<a name="400"><span class="lineNum"> 400 </span> : : const void *vpd_blob;</a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : ramptr = HDIF_child_arr(msarea, 0);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(ramptr)) {</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS AREA: No RAM area at %p\n&quot;, msarea);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : }</a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; be32_to_cpu(ramptr-&gt;count); i++) {</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineNoCov"> 0 : ramarea = HDIF_child(msarea, ramptr, i, &quot;RAM &quot;);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(ramarea))</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : fru_id = HDIF_get_idata(ramarea, 0, NULL);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : if (!fru_id)</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : </a>
+<a name="417"><span class="lineNum"> 417 </span> : : /* Use Resource ID to add dimm node */</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : dimm = dt_find_by_name_addr(parent, &quot;dimm&quot;,</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : be16_to_cpu(fru_id-&gt;rsrc_id));</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : if (dimm)</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineNoCov"> 0 : dimm= dt_new_addr(parent, &quot;dimm&quot;, be16_to_cpu(fru_id-&gt;rsrc_id));</span></a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : assert(dimm);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dimm, &quot;reg&quot;, be16_to_cpu(fru_id-&gt;rsrc_id));</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : </a>
+<a name="426"><span class="lineNum"> 426 </span> : : /* Add location code */</a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : slca_vpd_add_loc_code(dimm, be16_to_cpu(fru_id-&gt;slca_index));</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : /* DIMM size */</a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : ram_area_sz = HDIF_get_idata(ramarea, 3, NULL);</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(ram_area_sz))</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dimm, &quot;size&quot;, be32_to_cpu(ram_area_sz-&gt;mb));</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /* DIMM state */</a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : ram_id = HDIF_get_idata(ramarea, 2, NULL);</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(ram_id))</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="439"><span class="lineNum"> 439 </span> : : </a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : if ((be16_to_cpu(ram_id-&gt;flags) &amp; RAM_AREA_INSTALLED) &amp;&amp;</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : (be16_to_cpu(ram_id-&gt;flags) &amp; RAM_AREA_FUNCTIONAL))</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dimm, &quot;status&quot;, &quot;okay&quot;);</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : else</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dimm, &quot;status&quot;, &quot;disabled&quot;);</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : </a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : vpd_blob = HDIF_get_idata(ramarea, 1, &amp;size);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(vpd_blob))</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : if (vpd_valid(vpd_blob, size))</span></a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineNoCov"> 0 : vpd_data_parse(dimm, vpd_blob, size);</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : else</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : vpd_parse_spd(dimm, vpd_blob, size);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> : : }</a>
+<a name="454"><span class="lineNum"> 454 </span> : : }</a>
+<a name="455"><span class="lineNum"> 455 </span> : : </a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : static inline void dt_add_mem_reg_property(struct dt_node *node, u64 addr)</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : {</a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;#address-cells&quot;, 1);</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg&quot;, addr);</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="462"><span class="lineNum"> 462 </span> : : </a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineNoCov"> 0 : static void add_memory_controller_p9n(const struct HDIF_common_hdr *msarea,</span></a>
+<a name="464"><span class="lineNum"> 464 </span> : : const struct HDIF_ms_area_address_range *arange)</a>
+<a name="465"><span class="lineNum"> 465 </span> : : {</a>
+<a name="466"><span class="lineNum"> 466 </span> : : uint32_t chip_id;</a>
+<a name="467"><span class="lineNum"> 467 </span> : : uint32_t controller_id, mcbist_id, mcs_id, mca_id;</a>
+<a name="468"><span class="lineNum"> 468 </span> : : struct dt_node *xscom, *mcbist, *mcs, *mca;</a>
+<a name="469"><span class="lineNum"> 469 </span> : : </a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : chip_id = pcid_to_chip_id(be32_to_cpu(arange-&gt;chip));</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : controller_id = be32_to_cpu(arange-&gt;controller_id);</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : xscom = find_xscom_for_chip(chip_id);</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : if (!xscom) {</span></a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING,</span></a>
+<a name="475"><span class="lineNum"> 475 </span> : : &quot;MS AREA: Can't find XSCOM for chip %d\n&quot;, chip_id);</a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : }</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : mcbist_id = MS_CONTROLLER_MCBIST_ID(controller_id);</span></a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineNoCov"> 0 : mcbist = dt_find_by_name_addr(xscom, &quot;mcbist&quot;, mcbist_id);</span></a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineNoCov"> 0 : if (!mcbist) {</span></a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineNoCov"> 0 : mcbist = dt_new_addr(xscom, &quot;mcbist&quot;, mcbist_id);</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineNoCov"> 0 : assert(mcbist);</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(mcbist, &quot;#address-cells&quot;, 1);</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(mcbist, &quot;#size-cells&quot;, 0);</span></a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(mcbist, &quot;reg&quot;, mcbist_id, 0);</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : }</a>
+<a name="488"><span class="lineNum"> 488 </span> : : </a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : mcs_id = MS_CONTROLLER_MCS_ID(controller_id);</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : mcs = dt_find_by_name_addr(mcbist, &quot;mcs&quot;, mcs_id);</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : if (!mcs) {</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : mcs = dt_new_addr(mcbist, &quot;mcs&quot;, mcs_id);</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : assert(mcs);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : dt_add_mem_reg_property(mcs, mcs_id);</span></a>
+<a name="495"><span class="lineNum"> 495 </span> : : }</a>
+<a name="496"><span class="lineNum"> 496 </span> : : </a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : mca_id = MS_CONTROLLER_MCA_ID(controller_id);</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : mca = dt_find_by_name_addr(mcs, &quot;mca&quot;, mca_id);</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : if (!mca) {</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : mca = dt_new_addr(mcs, &quot;mca&quot;, mca_id);</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : assert(mca);</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : dt_add_mem_reg_property(mca, mca_id);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : }</a>
+<a name="504"><span class="lineNum"> 504 </span> : : </a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : add_dimm_info(mca, msarea);</span></a>
+<a name="506"><span class="lineNum"> 506 </span> : : }</a>
+<a name="507"><span class="lineNum"> 507 </span> : : </a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 6 : static void add_memory_buffer_mmio(const struct HDIF_common_hdr *msarea)</span></a>
+<a name="509"><span class="lineNum"> 509 </span> : : {</a>
+<a name="510"><span class="lineNum"> 510 </span> : : const struct HDIF_ms_area_ocmb_mmio *mmio;</a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 6 : uint64_t min_addr = ~0ull, hbrt_id = 0;</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : const struct HDIF_array_hdr *array;</a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 6 : unsigned int i, count, ranges = 0;</span></a>
+<a name="514"><span class="lineNum"> 514 </span> : : struct dt_node *membuf;</a>
+<a name="515"><span class="lineNum"> 515 </span> : : beint64_t *reg, *flags;</a>
+<a name="516"><span class="lineNum"> 516 </span> : : </a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 6 : if (PVR_TYPE(mfspr(SPR_PVR)) != PVR_TYPE_P9P)</span></a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : if (be16_to_cpu(msarea-&gt;version) &lt; 0x50) {</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;MS AREA: Inconsistent MSAREA version %x for P9P system&quot;,</span></a>
+<a name="522"><span class="lineNum"> 522 </span> : : be16_to_cpu(msarea-&gt;version));</a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="524"><span class="lineNum"> 524 </span> : : }</a>
+<a name="525"><span class="lineNum"> 525 </span> : : </a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineNoCov"> 0 : array = HDIF_get_iarray(msarea, MSAREA_IDATA_MMIO_IDX, &amp;count);</span></a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : if (!array || count &lt;= 0) {</span></a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS AREA: No OCMB MMIO array at MS Area %p\n&quot;, msarea);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="530"><span class="lineNum"> 530 </span> : : }</a>
+<a name="531"><span class="lineNum"> 531 </span> : : </a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : reg = zalloc(count * 2 * sizeof(*reg));</span></a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : flags = zalloc(count * sizeof(*flags));</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : </a>
+<a name="535"><span class="lineNum"> 535 </span> : : /* grab the hbrt id from the first range. */</a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : HDIF_iarray_for_each(array, i, mmio) {</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineNoCov"> 0 : hbrt_id = be64_to_cpu(mmio-&gt;hbrt_id);</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : }</a>
+<a name="540"><span class="lineNum"> 540 </span> : : </a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;Adding memory buffer MMIO ranges for %&quot;PRIx64&quot;\n&quot;,</span></a>
+<a name="542"><span class="lineNum"> 542 </span> : : hbrt_id);</a>
+<a name="543"><span class="lineNum"> 543 </span> : : </a>
+<a name="544"><span class="lineNum"> 544 </span> :<span class="lineNoCov"> 0 : HDIF_iarray_for_each(array, i, mmio) {</span></a>
+<a name="545"><span class="lineNum"> 545 </span> : : uint64_t start, end;</a>
+<a name="546"><span class="lineNum"> 546 </span> : : </a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : if (hbrt_id != be64_to_cpu(mmio-&gt;hbrt_id)) {</span></a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : prerror(&quot;HBRT ID mismatch!\n&quot;);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : }</a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : start = cleanup_addr(be64_to_cpu(mmio-&gt;range_start));</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : end = cleanup_addr(be64_to_cpu(mmio-&gt;range_end));</span></a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineNoCov"> 0 : if (start &lt; min_addr)</span></a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : min_addr = start;</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : </a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot; %&quot;PRIx64&quot; - [%016&quot;PRIx64&quot;-%016&quot;PRIx64&quot;)\n&quot;,</span></a>
+<a name="558"><span class="lineNum"> 558 </span> : : hbrt_id, start, end);</a>
+<a name="559"><span class="lineNum"> 559 </span> : : </a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : reg[2 * ranges ] = cpu_to_be64(start);</span></a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : reg[2 * ranges + 1] = cpu_to_be64(end - start + 1);</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : flags[ranges] = mmio-&gt;flags; /* both are BE */</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineNoCov"> 0 : ranges++;</span></a>
+<a name="564"><span class="lineNum"> 564 </span> : : }</a>
+<a name="565"><span class="lineNum"> 565 </span> : : </a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : membuf = dt_find_by_name_addr(dt_root, &quot;memory-buffer&quot;, min_addr);</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : if (membuf) {</span></a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineNoCov"> 0 : prerror(&quot;attempted to duplicate %s\n&quot;, membuf-&gt;name);</span></a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="570"><span class="lineNum"> 570 </span> : : }</a>
+<a name="571"><span class="lineNum"> 571 </span> : : </a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : membuf = dt_new_addr(dt_root, &quot;memory-buffer&quot;, min_addr);</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : assert(membuf);</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : </a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(membuf, &quot;compatible&quot;, &quot;ibm,explorer&quot;);</span></a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(membuf, &quot;ibm,chip-id&quot;, hbrt_id);</span></a>
+<a name="577"><span class="lineNum"> 577 </span> : : </a>
+<a name="578"><span class="lineNum"> 578 </span> : : /*</a>
+<a name="579"><span class="lineNum"> 579 </span> : : * FIXME: We should probably be sorting the address ranges based</a>
+<a name="580"><span class="lineNum"> 580 </span> : : * on the starting address.</a>
+<a name="581"><span class="lineNum"> 581 </span> : : */</a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : dt_add_property(membuf, &quot;reg&quot;, reg, sizeof(*reg) * 2 * ranges);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : dt_add_property(membuf, &quot;flags&quot;, flags, sizeof(*flags) * ranges);</span></a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : free(flags);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : free(reg);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : }</a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 6 : static void add_memory_controller(const struct HDIF_common_hdr *msarea,</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : const struct HDIF_ms_area_address_range *arange)</a>
+<a name="592"><span class="lineNum"> 592 </span> : : {</a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 6 : const uint32_t version = PVR_TYPE(mfspr(SPR_PVR));</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : /*</a>
+<a name="595"><span class="lineNum"> 595 </span> : : * Memory hierarchy may change between processor version. Presently</a>
+<a name="596"><span class="lineNum"> 596 </span> : : * it's only creating memory hierarchy for P9 (Nimbus) and P9P (Axone).</a>
+<a name="597"><span class="lineNum"> 597 </span> : : */</a>
+<a name="598"><span class="lineNum"> 598 </span> : : </a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineCov"> 6 : if (version == PVR_TYPE_P9)</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : return add_memory_controller_p9n(msarea, arange);</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 6 : else if (version == PVR_TYPE_P9P)</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : return; //return add_memory_controller_p9p(msarea, arange);</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : else</a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="605"><span class="lineNum"> 605 </span> : : }</a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineCov"> 2 : static void get_msareas(struct dt_node *root,</span></a>
+<a name="608"><span class="lineNum"> 608 </span> : : const struct HDIF_common_hdr *ms_vpd)</a>
+<a name="609"><span class="lineNum"> 609 </span> : : {</a>
+<a name="610"><span class="lineNum"> 610 </span> : : unsigned int i;</a>
+<a name="611"><span class="lineNum"> 611 </span> : : const struct HDIF_child_ptr *msptr;</a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> : : /* First childptr refers to msareas. */</a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 2 : msptr = HDIF_child_arr(ms_vpd, MSVPD_CHILD_MS_AREAS);</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(msptr)) {</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: no children at %p\n&quot;, ms_vpd);</span></a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="618"><span class="lineNum"> 618 </span> : : }</a>
+<a name="619"><span class="lineNum"> 619 </span> : : </a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineCov"> 8 : for (i = 0; i &lt; be32_to_cpu(msptr-&gt;count); i++) {</span></a>
+<a name="621"><span class="lineNum"> 621 </span> : : const struct HDIF_common_hdr *msarea;</a>
+<a name="622"><span class="lineNum"> 622 </span> : : const struct HDIF_array_hdr *arr;</a>
+<a name="623"><span class="lineNum"> 623 </span> : : const struct HDIF_ms_area_address_range *arange;</a>
+<a name="624"><span class="lineNum"> 624 </span> : : const struct HDIF_ms_area_id *id;</a>
+<a name="625"><span class="lineNum"> 625 </span> : : const void *fruid;</a>
+<a name="626"><span class="lineNum"> 626 </span> : : unsigned int size, j, offset;</a>
+<a name="627"><span class="lineNum"> 627 </span> : : u16 flags;</a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 6 : msarea = HDIF_child(ms_vpd, msptr, i, &quot;MSAREA&quot;);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(msarea))</span></a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="632"><span class="lineNum"> 632 </span> : : </a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineCov"> 6 : id = HDIF_get_idata(msarea, 2, &amp;size);</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(id))</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineCov"> 6 : if (size &lt; sizeof(*id)) {</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: %p msarea #%i id size too small!\n&quot;,</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : ms_vpd, i);</a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="640"><span class="lineNum"> 640 </span> : : }</a>
+<a name="641"><span class="lineNum"> 641 </span> : : </a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineCov"> 6 : flags = be16_to_cpu(id-&gt;flags);</span></a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 6 : prlog(PR_DEBUG, &quot;MS VPD: %p, area %i: %s %s %s\n&quot;,</span></a>
+<a name="644"><span class="lineNum"> 644 </span> : : ms_vpd, i,</a>
+<a name="645"><span class="lineNum"> 645 </span> : : flags &amp; MS_AREA_INSTALLED ?</a>
+<a name="646"><span class="lineNum"> 646 </span> : : &quot;installed&quot; : &quot;not installed&quot;,</a>
+<a name="647"><span class="lineNum"> 647 </span> : : flags &amp; MS_AREA_FUNCTIONAL ?</a>
+<a name="648"><span class="lineNum"> 648 </span> : : &quot;functional&quot; : &quot;not functional&quot;,</a>
+<a name="649"><span class="lineNum"> 649 </span> : : flags &amp; MS_AREA_SHARED ?</a>
+<a name="650"><span class="lineNum"> 650 </span> : : &quot;shared&quot; : &quot;not shared&quot;);</a>
+<a name="651"><span class="lineNum"> 651 </span> : : </a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 6 : if ((flags &amp; (MS_AREA_INSTALLED|MS_AREA_FUNCTIONAL))</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : != (MS_AREA_INSTALLED|MS_AREA_FUNCTIONAL))</a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : </a>
+<a name="656"><span class="lineNum"> 656 </span> :<span class="lineCov"> 6 : arr = HDIF_get_idata(msarea, 4, &amp;size);</span></a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(arr))</span></a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="659"><span class="lineNum"> 659 </span> : : </a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineCov"> 6 : if (size &lt; sizeof(*arr)) {</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: %p msarea #%i arr size too small!\n&quot;,</span></a>
+<a name="662"><span class="lineNum"> 662 </span> : : ms_vpd, i);</a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> : : }</a>
+<a name="665"><span class="lineNum"> 665 </span> : : </a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineCov"> 6 : offset = offsetof(struct HDIF_ms_area_address_range, mirror_start);</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineCov"> 6 : if (be32_to_cpu(arr-&gt;eactsz) &lt; offset) {</span></a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: %p msarea #%i arange size too small!\n&quot;,</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : ms_vpd, i);</a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> : : }</a>
+<a name="672"><span class="lineNum"> 672 </span> : : </a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineCov"> 6 : fruid = HDIF_get_idata(msarea, 0, &amp;size);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(fruid))</span></a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> : : /* Add Raiser card VPD */</a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineCov"> 6 : if (be16_to_cpu(id-&gt;parent_type) &amp; MS_PTYPE_RISER_CARD)</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : dt_add_vpd_node(msarea, 0, 1);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> : : </a>
+<a name="681"><span class="lineNum"> 681 </span> : : /* Add RAM Area VPD */</a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 6 : vpd_add_ram_area(msarea);</span></a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineCov"> 6 : add_memory_buffer_mmio(msarea);</span></a>
+<a name="685"><span class="lineNum"> 685 </span> : : </a>
+<a name="686"><span class="lineNum"> 686 </span> : : /* This offset is from the arr, not the header! */</a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 6 : arange = (void *)arr + be32_to_cpu(arr-&gt;offset);</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineCov"> 12 : for (j = 0; j &lt; be32_to_cpu(arr-&gt;ecnt); j++) {</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineCov"> 6 : uint32_t type = 0, status = 0;</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : </a>
+<a name="691"><span class="lineNum"> 691 </span> : : /*</a>
+<a name="692"><span class="lineNum"> 692 </span> : : * Check that the required fields are present in this</a>
+<a name="693"><span class="lineNum"> 693 </span> : : * version of the HDAT structure.</a>
+<a name="694"><span class="lineNum"> 694 </span> : : */</a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 6 : offset = offsetof(struct HDIF_ms_area_address_range, controller_id);</span></a>
+<a name="696"><span class="lineNum"> 696 </span> :<span class="lineCov"> 6 : if (be32_to_cpu(arr-&gt;eactsz) &gt;= offset)</span></a>
+<a name="697"><span class="lineNum"> 697 </span> :<span class="lineCov"> 6 : add_memory_controller(msarea, arange);</span></a>
+<a name="698"><span class="lineNum"> 698 </span> : : </a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineCov"> 6 : offset = offsetof(struct HDIF_ms_area_address_range, phys_attr);</span></a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 6 : if (be32_to_cpu(arr-&gt;eactsz) &gt;= offset) {</span></a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineNoCov"> 0 : uint32_t attr = be32_to_cpu(arange-&gt;phys_attr);</span></a>
+<a name="702"><span class="lineNum"> 702 </span> : : </a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : type = GETFIELD(PHYS_ATTR_TYPE_MASK, attr);</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineNoCov"> 0 : status = GETFIELD(PHYS_ATTR_STATUS_MASK, attr);</span></a>
+<a name="705"><span class="lineNum"> 705 </span> : : }</a>
+<a name="706"><span class="lineNum"> 706 </span> : : </a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineCov"> 6 : if (!add_address_range(root, id, arange, type, status))</span></a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Unable to use memory range %d from MSAREA %d\n&quot;, j, i);</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 6 : arange = (void *)arange + be32_to_cpu(arr-&gt;esize);</span></a>
+<a name="711"><span class="lineNum"> 711 </span> : : }</a>
+<a name="712"><span class="lineNum"> 712 </span> : : }</a>
+<a name="713"><span class="lineNum"> 713 </span> : : }</a>
+<a name="714"><span class="lineNum"> 714 </span> : : </a>
+<a name="715"><span class="lineNum"> 715 </span> : : static struct dt_node *dt_hb_reserves;</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : static struct dt_node *add_hb_reserve_node(const char *name, u64 start, u64 end)</span></a>
+<a name="718"><span class="lineNum"> 718 </span> : : {</a>
+<a name="719"><span class="lineNum"> 719 </span> : : /* label size + &quot;ibm,&quot; + NULL */</a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineNoCov"> 0 : char node_name[HB_RESERVE_MEM_LABEL_SIZE + 5] = { 0 };</span></a>
+<a name="721"><span class="lineNum"> 721 </span> : : struct dt_node *node, *hb;</a>
+<a name="722"><span class="lineNum"> 722 </span> : : </a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : if (!dt_hb_reserves) {</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : hb = dt_new_check(dt_root, &quot;ibm,hostboot&quot;);</span></a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(hb, &quot;#size-cells&quot;, 2);</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(hb, &quot;#address-cells&quot;, 2);</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : </a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : dt_hb_reserves = dt_new_check(hb, &quot;reserved-memory&quot;);</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : dt_add_property(dt_hb_reserves, &quot;ranges&quot;, NULL, 0);</span></a>
+<a name="730"><span class="lineNum"> 730 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dt_hb_reserves, &quot;#size-cells&quot;, 2);</span></a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dt_hb_reserves, &quot;#address-cells&quot;, 2);</span></a>
+<a name="732"><span class="lineNum"> 732 </span> : : }</a>
+<a name="733"><span class="lineNum"> 733 </span> : : </a>
+<a name="734"><span class="lineNum"> 734 </span> : : /* Add &quot;ibm,&quot; to reserved node name */</a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : if (strncasecmp(name, &quot;ibm&quot;, 3))</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : snprintf(node_name, 5, &quot;ibm,&quot;);</span></a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineNoCov"> 0 : strcat(node_name, name);</span></a>
+<a name="738"><span class="lineNum"> 738 </span> : : </a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineNoCov"> 0 : node = dt_new_addr(dt_hb_reserves, node_name, start);</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineNoCov"> 0 : if (!node) {</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Unable to create node for %s@%llx\n&quot;,</span></a>
+<a name="742"><span class="lineNum"> 742 </span> : : node_name, (unsigned long long) start);</a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="744"><span class="lineNum"> 744 </span> : : }</a>
+<a name="745"><span class="lineNum"> 745 </span> : : </a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64s(node, &quot;reg&quot;, start, end - start + 1);</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineNoCov"> 0 : return node;</span></a>
+<a name="749"><span class="lineNum"> 749 </span> : : }</a>
+<a name="750"><span class="lineNum"> 750 </span> : : </a>
+<a name="751"><span class="lineNum"> 751 </span> :<span class="lineCov"> 2 : static void get_hb_reserved_mem(struct HDIF_common_hdr *ms_vpd)</span></a>
+<a name="752"><span class="lineNum"> 752 </span> : : {</a>
+<a name="753"><span class="lineNum"> 753 </span> : : const struct msvpd_hb_reserved_mem *hb_resv_mem;</a>
+<a name="754"><span class="lineNum"> 754 </span> : : u64 start_addr, end_addr, label_size;</a>
+<a name="755"><span class="lineNum"> 755 </span> : : struct dt_node *node;</a>
+<a name="756"><span class="lineNum"> 756 </span> : : int count, i;</a>
+<a name="757"><span class="lineNum"> 757 </span> : : char label[HB_RESERVE_MEM_LABEL_SIZE + 1];</a>
+<a name="758"><span class="lineNum"> 758 </span> : : </a>
+<a name="759"><span class="lineNum"> 759 </span> : : /*</a>
+<a name="760"><span class="lineNum"> 760 </span> : : * XXX: Reservation names only exist on P9 and on P7/8 we get the</a>
+<a name="761"><span class="lineNum"> 761 </span> : : * reserved ranges through the hostboot mini-FDT instead.</a>
+<a name="762"><span class="lineNum"> 762 </span> : : */</a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 2 : if (proc_gen &lt; proc_gen_p9)</span></a>
+<a name="764"><span class="lineNum"> 764 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="765"><span class="lineNum"> 765 </span> : : </a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineNoCov"> 0 : count = HDIF_get_iarray_size(ms_vpd, MSVPD_IDATA_HB_RESERVED_MEM);</span></a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineNoCov"> 0 : if (count &lt;= 0) {</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: No hostboot reserved memory found\n&quot;);</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="770"><span class="lineNum"> 770 </span> : : }</a>
+<a name="771"><span class="lineNum"> 771 </span> : : </a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineNoCov"> 0 : hb_resv_mem = HDIF_get_iarray_item(ms_vpd,</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : MSVPD_IDATA_HB_RESERVED_MEM,</a>
+<a name="775"><span class="lineNum"> 775 </span> : : i, NULL);</a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(hb_resv_mem))</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : label_size = be32_to_cpu(hb_resv_mem-&gt;label_size);</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineNoCov"> 0 : start_addr = be64_to_cpu(hb_resv_mem-&gt;start_addr);</span></a>
+<a name="781"><span class="lineNum"> 781 </span> :<span class="lineNoCov"> 0 : end_addr = be64_to_cpu(hb_resv_mem-&gt;end_addr);</span></a>
+<a name="782"><span class="lineNum"> 782 </span> : : </a>
+<a name="783"><span class="lineNum"> 783 </span> : : /* Zero length regions are a normal, but should be ignored */</a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineNoCov"> 0 : if (start_addr - end_addr == 0) {</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;MEM: Ignoring zero length range\n&quot;);</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> : : }</a>
+<a name="788"><span class="lineNum"> 788 </span> : : </a>
+<a name="789"><span class="lineNum"> 789 </span> : : /*</a>
+<a name="790"><span class="lineNum"> 790 </span> : : * Workaround broken HDAT reserve regions which are</a>
+<a name="791"><span class="lineNum"> 791 </span> : : * bigger than 512MB</a>
+<a name="792"><span class="lineNum"> 792 </span> : : */</a>
+<a name="793"><span class="lineNum"> 793 </span> :<span class="lineNoCov"> 0 : if ((end_addr - start_addr) &gt; 0x20000000) {</span></a>
+<a name="794"><span class="lineNum"> 794 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;MEM: Ignoring Bad HDAT reserve: too big\n&quot;);</span></a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="796"><span class="lineNum"> 796 </span> : : }</a>
+<a name="797"><span class="lineNum"> 797 </span> : : </a>
+<a name="798"><span class="lineNum"> 798 </span> : : /* remove the HRMOR bypass bit */</a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : start_addr &amp;= ~HRMOR_BIT;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> :<span class="lineNoCov"> 0 : end_addr &amp;= ~HRMOR_BIT;</span></a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : if (label_size &gt; HB_RESERVE_MEM_LABEL_SIZE)</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineNoCov"> 0 : label_size = HB_RESERVE_MEM_LABEL_SIZE;</span></a>
+<a name="803"><span class="lineNum"> 803 </span> : : </a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineNoCov"> 0 : memset(label, 0, HB_RESERVE_MEM_LABEL_SIZE + 1);</span></a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : memcpy(label, hb_resv_mem-&gt;label, label_size);</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : label[label_size] = '\0';</span></a>
+<a name="807"><span class="lineNum"> 807 </span> : : </a>
+<a name="808"><span class="lineNum"> 808 </span> : : /* Unnamed reservations are always broken. Ignore them. */</a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineNoCov"> 0 : if (strlen(label) == 0)</span></a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="811"><span class="lineNum"> 811 </span> : : </a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;MEM: Reserve '%s' %#&quot; PRIx64 &quot;-%#&quot; PRIx64 &quot; (type/inst=0x%08x)\n&quot;,</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : label, start_addr, end_addr, be32_to_cpu(hb_resv_mem-&gt;type_instance));</a>
+<a name="814"><span class="lineNum"> 814 </span> : : </a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineNoCov"> 0 : node = add_hb_reserve_node(label, start_addr, end_addr);</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : if (!node) {</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineNoCov"> 0 : prerror(&quot;unable to add node?\n&quot;);</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : }</a>
+<a name="820"><span class="lineNum"> 820 </span> : : </a>
+<a name="821"><span class="lineNum"> 821 </span> : : /* the three low bytes of type_instance is the instance data */</a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,prd-instance&quot;,</span></a>
+<a name="823"><span class="lineNum"> 823 </span> : : (be32_to_cpu(hb_resv_mem-&gt;type_instance) &amp; 0xffffff));</a>
+<a name="824"><span class="lineNum"> 824 </span> : : </a>
+<a name="825"><span class="lineNum"> 825 </span> : : /*</a>
+<a name="826"><span class="lineNum"> 826 </span> : : * Most reservations are used by HBRT itself so we should leave</a>
+<a name="827"><span class="lineNum"> 827 </span> : : * the label as-is. The exception is hbrt-code-image which is</a>
+<a name="828"><span class="lineNum"> 828 </span> : : * used by opal-prd to locate the HBRT image. Older versions</a>
+<a name="829"><span class="lineNum"> 829 </span> : : * of opal-prd expect this to be &quot;ibm,hbrt-code-image&quot; so make</a>
+<a name="830"><span class="lineNum"> 830 </span> : : * sure the prefix is there.</a>
+<a name="831"><span class="lineNum"> 831 </span> : : */</a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineNoCov"> 0 : if (!strcmp(label, &quot;hbrt-code-image&quot;))</span></a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineNoCov"> 0 : strcpy(label, &quot;ibm,hbrt-code-image&quot;);</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;ibm,prd-label&quot;, label);</span></a>
+<a name="835"><span class="lineNum"> 835 </span> : : }</a>
+<a name="836"><span class="lineNum"> 836 </span> : : }</a>
+<a name="837"><span class="lineNum"> 837 </span> : : </a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineCov"> 2 : static void parse_trace_reservations(struct HDIF_common_hdr *ms_vpd)</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : {</a>
+<a name="840"><span class="lineNum"> 840 </span> : : unsigned int size;</a>
+<a name="841"><span class="lineNum"> 841 </span> : : int count, i;</a>
+<a name="842"><span class="lineNum"> 842 </span> : : </a>
+<a name="843"><span class="lineNum"> 843 </span> : : /*</a>
+<a name="844"><span class="lineNum"> 844 </span> : : * The trace arrays are only setup when hostboot is explicitly</a>
+<a name="845"><span class="lineNum"> 845 </span> : : * configured to enable them. We need to check and gracefully handle</a>
+<a name="846"><span class="lineNum"> 846 </span> : : * when they're not present.</a>
+<a name="847"><span class="lineNum"> 847 </span> : : */</a>
+<a name="848"><span class="lineNum"> 848 </span> : : </a>
+<a name="849"><span class="lineNum"> 849 </span> :<span class="lineCov"> 2 : if (!HDIF_get_idata(ms_vpd, MSVPD_IDATA_TRACE_AREAS, &amp;size) || !size) {</span></a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;MS VPD: No trace areas found\n&quot;);</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="852"><span class="lineNum"> 852 </span> : : }</a>
+<a name="853"><span class="lineNum"> 853 </span> : : </a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineCov"> 2 : count = HDIF_get_iarray_size(ms_vpd, MSVPD_IDATA_TRACE_AREAS);</span></a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineCov"> 2 : if (count &lt;= 0) {</span></a>
+<a name="856"><span class="lineNum"> 856 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;MS VPD: No trace areas found\n&quot;);</span></a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="858"><span class="lineNum"> 858 </span> : : }</a>
+<a name="859"><span class="lineNum"> 859 </span> : : </a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;MS VPD: Found %d trace areas\n&quot;, count);</span></a>
+<a name="861"><span class="lineNum"> 861 </span> : : </a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : const struct msvpd_trace *trace_area;</a>
+<a name="864"><span class="lineNum"> 864 </span> : : struct dt_node *node;</a>
+<a name="865"><span class="lineNum"> 865 </span> : : u64 start, end;</a>
+<a name="866"><span class="lineNum"> 866 </span> : : </a>
+<a name="867"><span class="lineNum"> 867 </span> :<span class="lineNoCov"> 0 : trace_area = HDIF_get_iarray_item(ms_vpd,</span></a>
+<a name="868"><span class="lineNum"> 868 </span> : : MSVPD_IDATA_TRACE_AREAS, i, &amp;size);</a>
+<a name="869"><span class="lineNum"> 869 </span> : : </a>
+<a name="870"><span class="lineNum"> 870 </span> :<span class="lineNoCov"> 0 : if (!trace_area)</span></a>
+<a name="871"><span class="lineNum"> 871 </span> :<span class="lineNoCov"> 0 : return; /* shouldn't happen */</span></a>
+<a name="872"><span class="lineNum"> 872 </span> : : </a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineNoCov"> 0 : start = be64_to_cpu(trace_area-&gt;start) &amp; ~HRMOR_BIT;</span></a>
+<a name="874"><span class="lineNum"> 874 </span> :<span class="lineNoCov"> 0 : end = be64_to_cpu(trace_area-&gt;end) &amp; ~HRMOR_BIT;</span></a>
+<a name="875"><span class="lineNum"> 875 </span> : : </a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO,</span></a>
+<a name="877"><span class="lineNum"> 877 </span> : : &quot;MS VPD: Trace area: 0x%.16&quot;PRIx64&quot;-0x%.16&quot;PRIx64&quot;\n&quot;,</a>
+<a name="878"><span class="lineNum"> 878 </span> : : start, end);</a>
+<a name="879"><span class="lineNum"> 879 </span> : : </a>
+<a name="880"><span class="lineNum"> 880 </span> :<span class="lineNoCov"> 0 : node = add_hb_reserve_node(&quot;trace-area&quot;, start, end);</span></a>
+<a name="881"><span class="lineNum"> 881 </span> :<span class="lineNoCov"> 0 : if (!node) {</span></a>
+<a name="882"><span class="lineNum"> 882 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MEM: Unable to reserve trace area %p-%p\n&quot;,</span></a>
+<a name="883"><span class="lineNum"> 883 </span> : : (void *) start, (void *) end);</a>
+<a name="884"><span class="lineNum"> 884 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="885"><span class="lineNum"> 885 </span> : : }</a>
+<a name="886"><span class="lineNum"> 886 </span> : : </a>
+<a name="887"><span class="lineNum"> 887 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;no-map&quot;, NULL, 0);</span></a>
+<a name="888"><span class="lineNum"> 888 </span> : : }</a>
+<a name="889"><span class="lineNum"> 889 </span> : : }</a>
+<a name="890"><span class="lineNum"> 890 </span> : : </a>
+<a name="891"><span class="lineNum"> 891 </span> :<span class="lineCov"> 2 : static bool __memory_parse(struct dt_node *root)</span></a>
+<a name="892"><span class="lineNum"> 892 </span> : : {</a>
+<a name="893"><span class="lineNum"> 893 </span> : : struct HDIF_common_hdr *ms_vpd;</a>
+<a name="894"><span class="lineNum"> 894 </span> : : const struct msvpd_ms_addr_config *msac;</a>
+<a name="895"><span class="lineNum"> 895 </span> : : const struct msvpd_total_config_ms *tcms;</a>
+<a name="896"><span class="lineNum"> 896 </span> : : unsigned int size;</a>
+<a name="897"><span class="lineNum"> 897 </span> : : </a>
+<a name="898"><span class="lineNum"> 898 </span> :<span class="lineCov"> 2 : ms_vpd = get_hdif(&amp;spira.ntuples.ms_vpd, MSVPD_HDIF_SIG);</span></a>
+<a name="899"><span class="lineNum"> 899 </span> :<span class="lineCov"> 2 : if (!ms_vpd) {</span></a>
+<a name="900"><span class="lineNum"> 900 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: invalid\n&quot;);</span></a>
+<a name="901"><span class="lineNum"> 901 </span> :<span class="lineNoCov"> 0 : op_display(OP_FATAL, OP_MOD_MEM, 0x0000);</span></a>
+<a name="902"><span class="lineNum"> 902 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="903"><span class="lineNum"> 903 </span> : : }</a>
+<a name="904"><span class="lineNum"> 904 </span> :<span class="lineCov"> 2 : if (be32_to_cpu(spira.ntuples.ms_vpd.act_len) &lt; sizeof(*ms_vpd)) {</span></a>
+<a name="905"><span class="lineNum"> 905 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: invalid size %u\n&quot;,</span></a>
+<a name="906"><span class="lineNum"> 906 </span> : : be32_to_cpu(spira.ntuples.ms_vpd.act_len));</a>
+<a name="907"><span class="lineNum"> 907 </span> :<span class="lineNoCov"> 0 : op_display(OP_FATAL, OP_MOD_MEM, 0x0001);</span></a>
+<a name="908"><span class="lineNum"> 908 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="909"><span class="lineNum"> 909 </span> : : }</a>
+<a name="910"><span class="lineNum"> 910 </span> : : </a>
+<a name="911"><span class="lineNum"> 911 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;MS VPD: is at %p\n&quot;, ms_vpd);</span></a>
+<a name="912"><span class="lineNum"> 912 </span> : : </a>
+<a name="913"><span class="lineNum"> 913 </span> :<span class="lineCov"> 2 : msac = HDIF_get_idata(ms_vpd, MSVPD_IDATA_MS_ADDR_CONFIG, &amp;size);</span></a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(msac) || size &lt; sizeof(*msac)) {</span></a>
+<a name="915"><span class="lineNum"> 915 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: bad msac size %u @ %p\n&quot;, size, msac);</span></a>
+<a name="916"><span class="lineNum"> 916 </span> :<span class="lineNoCov"> 0 : op_display(OP_FATAL, OP_MOD_MEM, 0x0002);</span></a>
+<a name="917"><span class="lineNum"> 917 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="918"><span class="lineNum"> 918 </span> : : }</a>
+<a name="919"><span class="lineNum"> 919 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;MS VPD: MSAC is at %p\n&quot;, msac);</span></a>
+<a name="920"><span class="lineNum"> 920 </span> : : </a>
+<a name="921"><span class="lineNum"> 921 </span> :<span class="lineCov"> 2 : dt_add_property_u64(dt_root, DT_PRIVATE &quot;maxmem&quot;,</span></a>
+<a name="922"><span class="lineNum"> 922 </span> : : be64_to_cpu(msac-&gt;max_configured_ms_address));</a>
+<a name="923"><span class="lineNum"> 923 </span> : : </a>
+<a name="924"><span class="lineNum"> 924 </span> :<span class="lineCov"> 2 : tcms = HDIF_get_idata(ms_vpd, MSVPD_IDATA_TOTAL_CONFIG_MS, &amp;size);</span></a>
+<a name="925"><span class="lineNum"> 925 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(tcms) || size &lt; sizeof(*tcms)) {</span></a>
+<a name="926"><span class="lineNum"> 926 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: Bad tcms size %u @ %p\n&quot;, size, tcms);</span></a>
+<a name="927"><span class="lineNum"> 927 </span> :<span class="lineNoCov"> 0 : op_display(OP_FATAL, OP_MOD_MEM, 0x0003);</span></a>
+<a name="928"><span class="lineNum"> 928 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="929"><span class="lineNum"> 929 </span> : : }</a>
+<a name="930"><span class="lineNum"> 930 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;MS VPD: TCMS is at %p\n&quot;, tcms);</span></a>
+<a name="931"><span class="lineNum"> 931 </span> : : </a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;MS VPD: Maximum configured address: 0x%llx\n&quot;,</span></a>
+<a name="933"><span class="lineNum"> 933 </span> : : (long long)be64_to_cpu(msac-&gt;max_configured_ms_address));</a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;MS VPD: Maximum possible address: 0x%llx\n&quot;,</span></a>
+<a name="935"><span class="lineNum"> 935 </span> : : (long long)be64_to_cpu(msac-&gt;max_possible_ms_address));</a>
+<a name="936"><span class="lineNum"> 936 </span> : : </a>
+<a name="937"><span class="lineNum"> 937 </span> :<span class="lineCov"> 2 : get_msareas(root, ms_vpd);</span></a>
+<a name="938"><span class="lineNum"> 938 </span> : : </a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineCov"> 2 : get_hb_reserved_mem(ms_vpd);</span></a>
+<a name="940"><span class="lineNum"> 940 </span> : : </a>
+<a name="941"><span class="lineNum"> 941 </span> :<span class="lineCov"> 2 : parse_trace_reservations(ms_vpd);</span></a>
+<a name="942"><span class="lineNum"> 942 </span> : : </a>
+<a name="943"><span class="lineNum"> 943 </span> :<span class="lineCov"> 2 : prlog(PR_INFO, &quot;MS VPD: Total MB of RAM: 0x%llx\n&quot;,</span></a>
+<a name="944"><span class="lineNum"> 944 </span> : : (long long)be64_to_cpu(tcms-&gt;total_in_mb));</a>
+<a name="945"><span class="lineNum"> 945 </span> : : </a>
+<a name="946"><span class="lineNum"> 946 </span> :<span class="lineCov"> 2 : return true;</span></a>
+<a name="947"><span class="lineNum"> 947 </span> : : }</a>
+<a name="948"><span class="lineNum"> 948 </span> : : </a>
+<a name="949"><span class="lineNum"> 949 </span> :<span class="lineCov"> 2 : void memory_parse(void)</span></a>
+<a name="950"><span class="lineNum"> 950 </span> : : {</a>
+<a name="951"><span class="lineNum"> 951 </span> :<span class="lineCov"> 2 : if (!__memory_parse(dt_root)) {</span></a>
+<a name="952"><span class="lineNum"> 952 </span> :<span class="lineNoCov"> 0 : prerror(&quot;MS VPD: Failed memory init !\n&quot;);</span></a>
+<a name="953"><span class="lineNum"> 953 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="954"><span class="lineNum"> 954 </span> : : }</a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="956"><span class="lineNum"> 956 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/pcia.c.func-sort-c.html b/coverage-report/hdata/pcia.c.func-sort-c.html
new file mode 100644
index 0000000..1fe3498
--- /dev/null
+++ b/coverage-report/hdata/pcia.c.func-sort-c.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/pcia.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - pcia.c<span style="font-size: 80%;"> (<a href="pcia.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntryMed">80.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="pcia.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#175">pcia_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#86">add_core_node</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#43">add_xics_icp</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#14">pcia_index</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#20">find_tada</a></td>
+ <td class="coverFnHi">442</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/pcia.c.func.html b/coverage-report/hdata/pcia.c.func.html
new file mode 100644
index 0000000..8f4ce3e
--- /dev/null
+++ b/coverage-report/hdata/pcia.c.func.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/pcia.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - pcia.c<span style="font-size: 80%;"> (<a href="pcia.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntryMed">80.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="pcia.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#86">add_core_node</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#43">add_xics_icp</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#20">find_tada</a></td>
+ <td class="coverFnHi">442</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#14">pcia_index</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pcia.c.gcov.html#175">pcia_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/pcia.c.gcov.html b/coverage-report/hdata/pcia.c.gcov.html
new file mode 100644
index 0000000..69a3831
--- /dev/null
+++ b/coverage-report/hdata/pcia.c.gcov.html
@@ -0,0 +1,311 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/pcia.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - pcia.c<span style="font-size: 80%;"> (source / <a href="pcia.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">84</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntryMed">80.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;spira.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;fsp.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;opal.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;device.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define PCIA_MAX_THREADS 8</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 52 : static unsigned int pcia_index(const void *pcia)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 52 : return (pcia - (void *)get_hdif(&amp;spira.ntuples.pcia, &quot;SPPCIA&quot;))</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 52 : / be32_to_cpu(spira.ntuples.pcia.alloc_len);</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : }</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 442 : static const struct sppcia_cpu_thread *find_tada(const void *pcia,</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : unsigned int thread)</a>
+<a name="24"><span class="lineNum"> 24 </span> : : {</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 442 : int count = HDIF_get_iarray_size(pcia, SPPCIA_IDATA_THREAD_ARRAY);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : int i;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 442 : if (count &lt; 0)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1898 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : const struct sppcia_cpu_thread *t;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : unsigned int size;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1898 : t = HDIF_get_iarray_item(pcia, SPPCIA_IDATA_THREAD_ARRAY,</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : i, &amp;size);</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1898 : if (!t || size &lt; sizeof(*t))</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1898 : if (be32_to_cpu(t-&gt;phys_thread_id) == thread)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 442 : return t;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 26 : static void add_xics_icp(const void *pcia, u32 tcount, const char *compat)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> : : const struct sppcia_cpu_thread *t;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : struct dt_node *icp;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : __be64 *reg;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : u32 i, irange[2], rsize;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 26 : rsize = tcount * 2 * sizeof(__be64);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 26 : reg = malloc(rsize);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 26 : assert(reg);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : /* Suppresses uninitialized warning from gcc */</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 26 : irange[0] = 0;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 234 : for (i = 0; i &lt; tcount; i++) {</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 208 : t = find_tada(pcia, i);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 208 : assert(t);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 208 : if (i == 0)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 26 : irange[0] = be32_to_cpu(t-&gt;pir);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 208 : reg[i * 2] = cpu_to_be64(cleanup_addr(be64_to_cpu(t-&gt;ibase)));</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 208 : reg[i * 2 + 1] = cpu_to_be64(0x1000);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 26 : irange[1] = tcount;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 26 : icp = dt_new_addr(dt_root, &quot;interrupt-controller&quot;, be64_to_cpu(reg[0]));</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 26 : if (!icp) {</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : free(reg);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : }</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 26 : if (compat)</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 26 : dt_add_property_strings(icp, &quot;compatible&quot;, &quot;ibm,ppc-xicp&quot;, compat);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : else</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(icp, &quot;compatible&quot;, &quot;ibm,ppc-xicp&quot;);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 26 : dt_add_property_cells(icp, &quot;ibm,interrupt-server-ranges&quot;,</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : irange[0], irange[1]);</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 26 : dt_add_property(icp, &quot;interrupt-controller&quot;, NULL, 0);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 26 : dt_add_property(icp, &quot;reg&quot;, reg, rsize);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 26 : dt_add_property_cells(icp, &quot;#address-cells&quot;, 0);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 26 : dt_add_property_string(icp, &quot;device_type&quot;,</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : &quot;PowerPC-External-Interrupt-Presentation&quot;);</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 26 : free(reg);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 26 : static struct dt_node *add_core_node(struct dt_node *cpus,</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : const void *pcia,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : const struct sppcia_core_unique *id,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : bool okay)</a>
+<a name="92"><span class="lineNum"> 92 </span> : : {</a>
+<a name="93"><span class="lineNum"> 93 </span> : : const struct sppcia_cpu_thread *t;</a>
+<a name="94"><span class="lineNum"> 94 </span> : : const struct sppcia_cpu_timebase *timebase;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : const struct sppcia_cpu_cache *cache;</a>
+<a name="96"><span class="lineNum"> 96 </span> : : const struct sppcia_cpu_attr *attr;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : struct dt_node *cpu;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : const char *icp_compat;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : u32 i, size, threads, ve_flags, l2_phandle, chip_id;</a>
+<a name="100"><span class="lineNum"> 100 </span> : : __be32 iserv[PCIA_MAX_THREADS];</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /* Look for thread 0 */</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 26 : t = find_tada(pcia, 0);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 26 : if (!t) {</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CORE[%i]: Failed to find thread 0 !\n&quot;,</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : pcia_index(pcia));</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : }</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 26 : ve_flags = be32_to_cpu(id-&gt;verif_exist_flags);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 26 : threads = ((ve_flags &amp; CPU_ID_NUM_SECONDARY_THREAD_MASK)</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 26 : &gt;&gt; CPU_ID_NUM_SECONDARY_THREAD_SHIFT) + 1;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 26 : assert(threads &lt;= PCIA_MAX_THREADS);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 26 : prlog(PR_INFO, &quot;CORE[%i]: PIR=%.8x %s %s(%u threads)\n&quot;,</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : pcia_index(pcia), be32_to_cpu(t-&gt;pir),</a>
+<a name="117"><span class="lineNum"> 117 </span> : : ve_flags &amp; CPU_ID_PCIA_RESERVED</a>
+<a name="118"><span class="lineNum"> 118 </span> : : ? &quot;**RESERVED**&quot; : cpu_state(ve_flags),</a>
+<a name="119"><span class="lineNum"> 119 </span> : : be32_to_cpu(t-&gt;pir) == boot_cpu-&gt;pir ? &quot;[boot] &quot; : &quot;&quot;, threads);</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 26 : timebase = HDIF_get_idata(pcia, SPPCIA_IDATA_TIMEBASE, &amp;size);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 26 : if (!timebase || size &lt; sizeof(*timebase)) {</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CORE[%i]: bad timebase size %u @ %p\n&quot;,</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : pcia_index(pcia), size, timebase);</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : }</a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 26 : cache = HDIF_get_idata(pcia, SPPCIA_IDATA_CPU_CACHE, &amp;size);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 26 : if (!cache || size &lt; sizeof(*cache)) {</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CORE[%i]: bad cache size %u @ %p\n&quot;,</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : pcia_index(pcia), size, cache);</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : }</a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 26 : cpu = add_core_common(cpus, cache, timebase,</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : be32_to_cpu(t-&gt;pir), okay);</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> : : /* Core attributes */</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 26 : attr = HDIF_get_idata(pcia, SPPCIA_IDATA_CPU_ATTR, &amp;size);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 26 : if (attr)</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 26 : add_core_attr(cpu, be32_to_cpu(attr-&gt;attr));</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : /* Add cache info */</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 26 : l2_phandle = add_core_cache_info(cpus, cache,</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : be32_to_cpu(t-&gt;pir), okay);</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;l2-cache&quot;, l2_phandle);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 26 : if (proc_gen == proc_gen_p8)</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 26 : icp_compat = &quot;IBM,power8-icp&quot;;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /* Get HW Chip ID */</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 26 : chip_id = pcid_to_chip_id(be32_to_cpu(id-&gt;proc_chip_id));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,pir&quot;, be32_to_cpu(t-&gt;pir));</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 26 : dt_add_property_cells(cpu, &quot;ibm,chip-id&quot;, chip_id);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* Build ibm,ppc-interrupt-server#s with all threads */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 234 : for (i = 0; i &lt; threads; i++) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 208 : t = find_tada(pcia, i);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 208 : if (!t) {</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : threads = i;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : }</a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 208 : iserv[i] = t-&gt;pir;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 26 : dt_add_property(cpu, &quot;ibm,ppc-interrupt-server#s&quot;, iserv, 4 * threads);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : </a>
+<a name="170"><span class="lineNum"> 170 </span> : : /* Add the ICP node for this CPU for P8 */</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 26 : if (proc_gen == proc_gen_p8)</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 26 : add_xics_icp(pcia, threads, icp_compat);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 26 : return cpu;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : }</a>
+<a name="176"><span class="lineNum"> 176 </span> : : </a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 2 : bool pcia_parse(void)</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : {</a>
+<a name="179"><span class="lineNum"> 179 </span> : : const void *pcia;</a>
+<a name="180"><span class="lineNum"> 180 </span> : : struct dt_node *cpus;</a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 2 : pcia = get_hdif(&amp;spira.ntuples.pcia, &quot;SPPCIA&quot;);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 2 : if (!pcia)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 2 : prlog(PR_INFO, &quot;Got PCIA !\n&quot;);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 2 : cpus = dt_new(dt_root, &quot;cpus&quot;);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 2 : dt_add_property_cells(cpus, &quot;#address-cells&quot;, 1);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 2 : dt_add_property_cells(cpus, &quot;#size-cells&quot;, 0);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 28 : for_each_pcia(pcia) {</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : const struct sppcia_core_unique *id;</a>
+<a name="194"><span class="lineNum"> 194 </span> : : u32 size, ve_flags;</a>
+<a name="195"><span class="lineNum"> 195 </span> : : bool okay;</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 26 : id = HDIF_get_idata(pcia, SPPCIA_IDATA_CORE_UNIQUE, &amp;size);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 26 : if (!id || size &lt; sizeof(*id)) {</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CORE[%i]: bad id size %u @ %p\n&quot;,</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : pcia_index(pcia), size, id);</a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : }</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 26 : ve_flags = be32_to_cpu(id-&gt;verif_exist_flags);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 26 : switch ((ve_flags &amp; CPU_ID_VERIFY_MASK)</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 26 : &gt;&gt; CPU_ID_VERIFY_SHIFT) {</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 26 : case CPU_ID_VERIFY_USABLE_NO_FAILURES:</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : case CPU_ID_VERIFY_USABLE_FAILURES:</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 26 : okay = true;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 26 : break;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineNoCov"> 0 : okay = false;</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : }</a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 26 : prlog(okay ? PR_INFO : PR_WARNING,</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : &quot;CORE[%i]: HW_PROC_ID=%i PROC_CHIP_ID=%i EC=0x%x %s\n&quot;,</a>
+<a name="217"><span class="lineNum"> 217 </span> : : pcia_index(pcia), be32_to_cpu(id-&gt;hw_proc_id),</a>
+<a name="218"><span class="lineNum"> 218 </span> : : be32_to_cpu(id-&gt;proc_chip_id),</a>
+<a name="219"><span class="lineNum"> 219 </span> : : be32_to_cpu(id-&gt;chip_ec_level),</a>
+<a name="220"><span class="lineNum"> 220 </span> : : okay ? &quot;OK&quot; : &quot;UNAVAILABLE&quot;);</a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 26 : if (!add_core_node(cpus, pcia, id, okay))</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : }</a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 2 : return true;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/slca.c.func-sort-c.html b/coverage-report/hdata/slca.c.func-sort-c.html
new file mode 100644
index 0000000..184d0fb
--- /dev/null
+++ b/coverage-report/hdata/slca.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/slca.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - slca.c<span style="font-size: 80%;"> (<a href="slca.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryLo">64.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="slca.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#40">slca_get_vpd_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#130">slca_dt_add_sai_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#83">slca_get_sai_entry</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#66">slca_vpd_add_loc_code</a></td>
+ <td class="coverFnHi">74</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#53">slca_get_loc_code_index</a></td>
+ <td class="coverFnHi">88</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#9">slca_get_entry</a></td>
+ <td class="coverFnHi">318</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/slca.c.func.html b/coverage-report/hdata/slca.c.func.html
new file mode 100644
index 0000000..a77ae90
--- /dev/null
+++ b/coverage-report/hdata/slca.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/slca.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - slca.c<span style="font-size: 80%;"> (<a href="slca.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryLo">64.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="slca.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#130">slca_dt_add_sai_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#9">slca_get_entry</a></td>
+ <td class="coverFnHi">318</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#53">slca_get_loc_code_index</a></td>
+ <td class="coverFnHi">88</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#83">slca_get_sai_entry</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#40">slca_get_vpd_name</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="slca.c.gcov.html#66">slca_vpd_add_loc_code</a></td>
+ <td class="coverFnHi">74</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/slca.c.gcov.html b/coverage-report/hdata/slca.c.gcov.html
new file mode 100644
index 0000000..f7ee502
--- /dev/null
+++ b/coverage-report/hdata/slca.c.gcov.html
@@ -0,0 +1,245 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/slca.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - slca.c<span style="font-size: 80%;"> (source / <a href="slca.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">70</td>
+ <td class="headerCovTableEntryLo">64.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2015 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;device.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;include/opal-internal.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;fsp-leds.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &quot;spira.h&quot;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineCov"> 318 : const struct slca_entry *slca_get_entry(uint16_t slca_index)</span></a>
+<a name="12"><span class="lineNum"> 12 </span> : : {</a>
+<a name="13"><span class="lineNum"> 13 </span> : : struct HDIF_common_hdr *slca_hdr;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : int count;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 318 : slca_hdr = get_hdif(&amp;spira.ntuples.slca, SLCA_HDIF_SIG);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 318 : if (!slca_hdr) {</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SLCA Invalid\n&quot;);</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : }</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 318 : count = HDIF_get_iarray_size(slca_hdr, SLCA_IDATA_ARRAY);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 318 : if (count &lt; 0) {</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SLCA: Can't find SLCA array size!\n&quot;);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 318 : if (slca_index &lt; count) {</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : const struct slca_entry *s_entry;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : unsigned int entry_sz;</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 318 : s_entry = HDIF_get_iarray_item(slca_hdr, SLCA_IDATA_ARRAY,</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : slca_index, &amp;entry_sz);</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 318 : if (s_entry &amp;&amp; entry_sz &gt;= sizeof(*s_entry))</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 318 : return s_entry;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : } else</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE,</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : &quot;SLCA: Can't find slca_entry for index %d\n&quot;, slca_index);</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : const char *slca_get_vpd_name(uint16_t slca_index)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> : : const struct slca_entry *s_entry;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : s_entry = slca_get_entry(slca_index);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : if (s_entry)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : return (const char *)s_entry-&gt;fru_id;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : else</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE,</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : &quot;SLCA: Can't find fru_id for index %d\n&quot;, slca_index);</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 88 : const char *slca_get_loc_code_index(uint16_t slca_index)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> : : const struct slca_entry *s_entry;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 88 : s_entry = slca_get_entry(slca_index);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 88 : if (s_entry)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 88 : return s_entry-&gt;loc_code;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : else</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;SLCA: Entry %d bad idata\n&quot;, slca_index);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : }</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 74 : void slca_vpd_add_loc_code(struct dt_node *node, uint16_t slca_index)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : {</a>
+<a name="70"><span class="lineNum"> 70 </span> : : const char *fru_loc_code;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : char loc_code[LOC_CODE_SIZE];</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 74 : memset(loc_code, 0, sizeof(loc_code));</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 74 : fru_loc_code = slca_get_loc_code_index(slca_index);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 74 : if (!fru_loc_code)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 74 : strncpy(loc_code, fru_loc_code, LOC_CODE_SIZE - 1);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 74 : dt_add_property(node, &quot;ibm,loc-code&quot;, loc_code, strlen(loc_code) + 1);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : /*</a>
+<a name="83"><span class="lineNum"> 83 </span> : : * Get System Attention Indicator SLCA entry</a>
+<a name="84"><span class="lineNum"> 84 </span> : : */</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 2 : static const struct slca_entry *slca_get_sai_entry(void)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : {</a>
+<a name="87"><span class="lineNum"> 87 </span> : : int count;</a>
+<a name="88"><span class="lineNum"> 88 </span> : : unsigned int i;</a>
+<a name="89"><span class="lineNum"> 89 </span> : : struct HDIF_common_hdr *slca_hdr;</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 2 : uint16_t sai_fru_id = SLCA_SAI_INDICATOR_ID;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 2 : slca_hdr = get_hdif(&amp;spira.ntuples.slca, SLCA_HDIF_SIG);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 2 : if (!slca_hdr) {</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SLCA Invalid\n&quot;);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : }</a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 2 : count = HDIF_get_iarray_size(slca_hdr, SLCA_IDATA_ARRAY);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 2 : if (count &lt; 0) {</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SLCA: Can't find SLCA array size!\n&quot;);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : }</a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 2 : if (proc_gen &gt;= proc_gen_p9 &amp;&amp; dt_find_by_path(dt_root, &quot;fsps&quot;))</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : sai_fru_id = SLCA_SYSTEM_VPD_ID;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 16 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : const struct slca_entry *s_entry;</a>
+<a name="109"><span class="lineNum"> 109 </span> : : unsigned int entry_sz;</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 16 : s_entry = HDIF_get_iarray_item(slca_hdr, SLCA_IDATA_ARRAY,</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : i, &amp;entry_sz);</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 16 : if (s_entry &amp;&amp;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 16 : VPD_ID(s_entry-&gt;fru_id[0],</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 16 : s_entry-&gt;fru_id[1]) == sai_fru_id) {</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 2 : prlog(PR_TRACE, &quot;SLCA: SAI index: 0x%x\n&quot;,</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : s_entry-&gt;my_index);</a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 2 : prlog(PR_TRACE, &quot;SLCA: SAI location code: %s\n&quot;,</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : s_entry-&gt;loc_code);</a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 2 : return s_entry;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : }</a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> : : /*</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * SLCA structure contains System Attention Indicator location</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * code (FRU ID = SA). Add this information to device tree</a>
+<a name="130"><span class="lineNum"> 130 </span> : : * (under '/ibm,opal/led').</a>
+<a name="131"><span class="lineNum"> 131 </span> : : */</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 2 : void slca_dt_add_sai_node(void)</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : {</a>
+<a name="134"><span class="lineNum"> 134 </span> : : const struct slca_entry *s_entry;</a>
+<a name="135"><span class="lineNum"> 135 </span> : : struct dt_node *led_node, *sai_node;</a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 2 : s_entry = slca_get_sai_entry();</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 2 : if (!s_entry)</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : /* Create /ibm,opal node, if its not created already */</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 2 : if (!opal_node)</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /* Crete LED parent node */</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 2 : led_node = dt_find_by_path(opal_node, DT_PROPERTY_LED_NODE);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 2 : if (!led_node)</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 2 : if (s_entry-&gt;loc_code_len == 0 ||</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 2 : s_entry-&gt;loc_code_len &gt; LOC_CODE_SIZE)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> : : /* Create SAI node */</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 2 : sai_node = dt_new(led_node, s_entry-&gt;loc_code);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 2 : assert(sai_node);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 2 : dt_add_property_string(sai_node,</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : DT_PROPERTY_LED_TYPES, LED_TYPE_ATTENTION);</a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/spira.c.func-sort-c.html b/coverage-report/hdata/spira.c.func-sort-c.html
new file mode 100644
index 0000000..796ee7f
--- /dev/null
+++ b/coverage-report/hdata/spira.c.func-sort-c.html
@@ -0,0 +1,221 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/spira.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - spira.c<span style="font-size: 80%;"> (<a href="spira.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">379</td>
+ <td class="headerCovTableEntry">728</td>
+ <td class="headerCovTableEntryLo">52.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="spira.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#462">add_ecid_data</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1462">add_npu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1004">add_opal_dump_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#453">add_vas_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#437">add_xive_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#916">dt_init_secureboot_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#355">xscom_to_pcrd</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#776">add_chiptod_new</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#748">add_chiptod_old</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1296">add_iplparams</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1244">add_iplparams_features</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1127">add_iplparams_ipl_params</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1221">add_iplparams_platform_dump</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1180">add_iplparams_serials</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1021">add_iplparams_sys_params</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#901">add_nmmu</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1630">add_npus</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#874">add_nx</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1400">add_stop_levels</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#666">add_xscom</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#550">add_xscom_sppcrd</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1351">dt_init_led_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1668">fixup_spira</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1366">hostservices_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#964">opal_dump_add_mpipl_boot</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1724">parse_hdat</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1711">update_spirah_addr</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#700">add_chiptod_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#832">add_nx_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#399">add_psihb_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#507">add_xscom_add_pcia_assoc</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#289">add_xscom_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#385">find_xscom_for_chip</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1324">pcid_to_chip_id</a></td>
+ <td class="coverFnHi">79</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#253">__get_hdif</a></td>
+ <td class="coverFnHi">545</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/spira.c.func.html b/coverage-report/hdata/spira.c.func.html
new file mode 100644
index 0000000..e74437e
--- /dev/null
+++ b/coverage-report/hdata/spira.c.func.html
@@ -0,0 +1,221 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/spira.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - spira.c<span style="font-size: 80%;"> (<a href="spira.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">379</td>
+ <td class="headerCovTableEntry">728</td>
+ <td class="headerCovTableEntryLo">52.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="spira.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#253">__get_hdif</a></td>
+ <td class="coverFnHi">545</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#776">add_chiptod_new</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#700">add_chiptod_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#748">add_chiptod_old</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#462">add_ecid_data</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1296">add_iplparams</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1244">add_iplparams_features</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1127">add_iplparams_ipl_params</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1221">add_iplparams_platform_dump</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1180">add_iplparams_serials</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1021">add_iplparams_sys_params</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#901">add_nmmu</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1462">add_npu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1630">add_npus</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#874">add_nx</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#832">add_nx_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1004">add_opal_dump_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#399">add_psihb_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1400">add_stop_levels</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#453">add_vas_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#437">add_xive_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#666">add_xscom</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#507">add_xscom_add_pcia_assoc</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#289">add_xscom_node</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#550">add_xscom_sppcrd</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1351">dt_init_led_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#916">dt_init_secureboot_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#385">find_xscom_for_chip</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1668">fixup_spira</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1366">hostservices_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#964">opal_dump_add_mpipl_boot</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1724">parse_hdat</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1324">pcid_to_chip_id</a></td>
+ <td class="coverFnHi">79</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#1711">update_spirah_addr</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.c.gcov.html#355">xscom_to_pcrd</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/spira.c.gcov.html b/coverage-report/hdata/spira.c.gcov.html
new file mode 100644
index 0000000..acbf05a
--- /dev/null
+++ b/coverage-report/hdata/spira.c.gcov.html
@@ -0,0 +1,1889 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/spira.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - spira.c<span style="font-size: 80%;"> (source / <a href="spira.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">379</td>
+ <td class="headerCovTableEntry">728</td>
+ <td class="headerCovTableEntryLo">52.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;device.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;cpu.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;interrupts.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;chip.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;opal-dump.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;fsp-attn.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;fsp-leds.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;hostservices.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;naca.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &quot;spira.h&quot;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : /* Processor Initialization structure, contains</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * the initial NIA and MSR values for the entry</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * point</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * Note: It appears to be ignoring the entry point</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * and always going to 0x180</a>
+<a name="27"><span class="lineNum"> 27 </span> : : */</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : static int cpu_type;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : extern struct proc_init_data proc_init_data;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : __section(&quot;.procin.data&quot;) struct proc_init_data proc_init_data = {</a>
+<a name="34"><span class="lineNum"> 34 </span> : : .hdr = HDIF_SIMPLE_HDR(&quot;PROCIN&quot;, 1, struct proc_init_data),</a>
+<a name="35"><span class="lineNum"> 35 </span> : : .regs_ptr = HDIF_IDATA_PTR(offsetof(struct proc_init_data, regs), 0x10),</a>
+<a name="36"><span class="lineNum"> 36 </span> : : .regs = {</a>
+<a name="37"><span class="lineNum"> 37 </span> : : .nia = CPU_TO_BE64(0x180),</a>
+<a name="38"><span class="lineNum"> 38 </span> : : .msr = CPU_TO_BE64(MSR_SF | MSR_HV),</a>
+<a name="39"><span class="lineNum"> 39 </span> : : },</a>
+<a name="40"><span class="lineNum"> 40 </span> : : };</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : extern struct cpu_ctl_init_data cpu_ctl_init_data;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : extern struct sp_addr_table cpu_ctl_spat_area;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : extern struct sp_attn_area cpu_ctl_sp_attn_area1;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : extern struct sp_attn_area cpu_ctl_sp_attn_area2;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : extern struct hsr_data_area cpu_ctl_hsr_area;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : /*</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * cpuctrl.data begins at CPU_CTL_OFF - cpu_ctl_init_data is located there.</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * + sizeof(struct cpu_ctl_init_data) - cpu_ctl_spat_area</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * + sizeof(struct sp_addr_table) - cpu_ctl_sp_attn_area1</a>
+<a name="52"><span class="lineNum"> 52 </span> : : * + sizeof(struct sp_attn_area) - cpu_ctl_sp_attn_area2</a>
+<a name="53"><span class="lineNum"> 53 </span> : : * + sizeof(struct sp_attn_area) - cpu_ctl_hsr_area</a>
+<a name="54"><span class="lineNum"> 54 </span> : : *</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * Can't use CPU_TO_BE64 directly on the labels as a constant initialiser.</a>
+<a name="56"><span class="lineNum"> 56 </span> : : *</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * CPU_CTL_INIT_DATA_OFF is offset from 0, the others are addressed from the</a>
+<a name="58"><span class="lineNum"> 58 </span> : : * relocated address (+SKIBOOT_BASE)</a>
+<a name="59"><span class="lineNum"> 59 </span> : : */</a>
+<a name="60"><span class="lineNum"> 60 </span> : : #define CPU_CTL_INIT_DATA_OFF (CPU_CTL_OFF)</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define CPU_CTL_SPAT_AREA_OFF (CPU_CTL_INIT_DATA_OFF + sizeof(struct cpu_ctl_init_data) + SKIBOOT_BASE)</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #define CPU_CTL_SP_ATTN_AREA1_OFF (ALIGN_UP((CPU_CTL_SPAT_AREA_OFF + sizeof(struct sp_addr_table)), ATTN_AREA_SZ))</a>
+<a name="63"><span class="lineNum"> 63 </span> : : #define CPU_CTL_SP_ATTN_AREA2_OFF (CPU_CTL_SP_ATTN_AREA1_OFF + sizeof(struct sp_attn_area))</a>
+<a name="64"><span class="lineNum"> 64 </span> : : #define CPU_CTL_HSR_AREA_OFF (CPU_CTL_SP_ATTN_AREA2_OFF + sizeof(struct sp_attn_area))</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : __section(&quot;.cpuctrl.data&quot;) struct hsr_data_area cpu_ctl_hsr_area;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : __section(&quot;.cpuctrl.data&quot;) struct sp_attn_area cpu_ctl_sp_attn_area2;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : __section(&quot;.cpuctrl.data&quot;) struct sp_attn_area cpu_ctl_sp_attn_area1;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : __section(&quot;.cpuctrl.data&quot;) struct sp_addr_table cpu_ctl_spat_area;</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> : : __section(&quot;.cpuctrl.data&quot;) struct cpu_ctl_init_data cpu_ctl_init_data = {</a>
+<a name="72"><span class="lineNum"> 72 </span> : : .hdr = HDIF_SIMPLE_HDR(CPU_CTL_HDIF_SIG, 2, struct cpu_ctl_init_data),</a>
+<a name="73"><span class="lineNum"> 73 </span> : : .cpu_ctl = HDIF_IDATA_PTR(offsetof(struct cpu_ctl_init_data, cpu_ctl_lt),</a>
+<a name="74"><span class="lineNum"> 74 </span> : : sizeof(struct cpu_ctl_legacy_table)),</a>
+<a name="75"><span class="lineNum"> 75 </span> : : .cpu_ctl_lt = {</a>
+<a name="76"><span class="lineNum"> 76 </span> : : .spat = {</a>
+<a name="77"><span class="lineNum"> 77 </span> : : .addr = CPU_TO_BE64(CPU_CTL_SPAT_AREA_OFF),</a>
+<a name="78"><span class="lineNum"> 78 </span> : : .size = CPU_TO_BE64(sizeof(struct sp_addr_table)),</a>
+<a name="79"><span class="lineNum"> 79 </span> : : },</a>
+<a name="80"><span class="lineNum"> 80 </span> : : .sp_attn_area1 = {</a>
+<a name="81"><span class="lineNum"> 81 </span> : : .addr = CPU_TO_BE64(CPU_CTL_SP_ATTN_AREA1_OFF),</a>
+<a name="82"><span class="lineNum"> 82 </span> : : .size = CPU_TO_BE64(sizeof(struct sp_attn_area)),</a>
+<a name="83"><span class="lineNum"> 83 </span> : : },</a>
+<a name="84"><span class="lineNum"> 84 </span> : : .sp_attn_area2 = {</a>
+<a name="85"><span class="lineNum"> 85 </span> : : .addr = CPU_TO_BE64(CPU_CTL_SP_ATTN_AREA2_OFF),</a>
+<a name="86"><span class="lineNum"> 86 </span> : : .size = CPU_TO_BE64(sizeof(struct sp_attn_area)),</a>
+<a name="87"><span class="lineNum"> 87 </span> : : },</a>
+<a name="88"><span class="lineNum"> 88 </span> : : .hsr_area = {</a>
+<a name="89"><span class="lineNum"> 89 </span> : : .addr = CPU_TO_BE64(CPU_CTL_HSR_AREA_OFF),</a>
+<a name="90"><span class="lineNum"> 90 </span> : : .size = CPU_TO_BE64(sizeof(struct hsr_data_area)),</a>
+<a name="91"><span class="lineNum"> 91 </span> : : },</a>
+<a name="92"><span class="lineNum"> 92 </span> : : },</a>
+<a name="93"><span class="lineNum"> 93 </span> : : };</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : /* Populate MDST table</a>
+<a name="96"><span class="lineNum"> 96 </span> : : *</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * Note that we only pass sapphire console buffer here so that we can</a>
+<a name="98"><span class="lineNum"> 98 </span> : : * capture early failure logs. Later dump component (fsp_dump_mdst_init)</a>
+<a name="99"><span class="lineNum"> 99 </span> : : * creates new table with all the memory sections we are interested and</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * sends updated table to FSP via MBOX.</a>
+<a name="101"><span class="lineNum"> 101 </span> : : *</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * To help the FSP distinguishing between TCE tokens and actual physical</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * addresses, we set the top bit to 1 on physical addresses</a>
+<a name="104"><span class="lineNum"> 104 </span> : : */</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : extern struct mdst_table init_mdst_table[];</a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> : : __section(&quot;.mdst.data&quot;) struct mdst_table init_mdst_table[2] = {</a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> : : .addr = CPU_TO_BE64(INMEM_CON_START | HRMOR_BIT),</a>
+<a name="111"><span class="lineNum"> 111 </span> : : .data_region = DUMP_REGION_CONSOLE,</a>
+<a name="112"><span class="lineNum"> 112 </span> : : .dump_type = DUMP_TYPE_SYSDUMP,</a>
+<a name="113"><span class="lineNum"> 113 </span> : : .size = CPU_TO_BE32(INMEM_CON_LEN),</a>
+<a name="114"><span class="lineNum"> 114 </span> : : },</a>
+<a name="115"><span class="lineNum"> 115 </span> : : {</a>
+<a name="116"><span class="lineNum"> 116 </span> : : .addr = CPU_TO_BE64(HBRT_CON_START | HRMOR_BIT),</a>
+<a name="117"><span class="lineNum"> 117 </span> : : .data_region = DUMP_REGION_HBRT_LOG,</a>
+<a name="118"><span class="lineNum"> 118 </span> : : .dump_type = DUMP_TYPE_SYSDUMP,</a>
+<a name="119"><span class="lineNum"> 119 </span> : : .size = CPU_TO_BE32(HBRT_CON_LEN),</a>
+<a name="120"><span class="lineNum"> 120 </span> : : },</a>
+<a name="121"><span class="lineNum"> 121 </span> : : };</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> : : /* SP Interface Root Array, aka SPIRA */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : __section(&quot;.spira.data&quot;) struct spira spira = {</a>
+<a name="125"><span class="lineNum"> 125 </span> : : .hdr = HDIF_SIMPLE_HDR(&quot;SPIRA &quot;, SPIRA_VERSION, struct spira),</a>
+<a name="126"><span class="lineNum"> 126 </span> : : .ntuples_ptr = HDIF_IDATA_PTR(offsetof(struct spira, ntuples),</a>
+<a name="127"><span class="lineNum"> 127 </span> : : sizeof(struct spira_ntuples)),</a>
+<a name="128"><span class="lineNum"> 128 </span> : : .ntuples = {</a>
+<a name="129"><span class="lineNum"> 129 </span> : : .array_hdr = {</a>
+<a name="130"><span class="lineNum"> 130 </span> : : .offset = CPU_TO_BE32(HDIF_ARRAY_OFFSET),</a>
+<a name="131"><span class="lineNum"> 131 </span> : : .ecnt = CPU_TO_BE32(SPIRA_NTUPLES_COUNT),</a>
+<a name="132"><span class="lineNum"> 132 </span> : : .esize</a>
+<a name="133"><span class="lineNum"> 133 </span> : : = CPU_TO_BE32(sizeof(struct spira_ntuple)),</a>
+<a name="134"><span class="lineNum"> 134 </span> : : .eactsz = CPU_TO_BE32(0x18),</a>
+<a name="135"><span class="lineNum"> 135 </span> : : },</a>
+<a name="136"><span class="lineNum"> 136 </span> : : /* We only populate some n-tuples */</a>
+<a name="137"><span class="lineNum"> 137 </span> : : .proc_init = {</a>
+<a name="138"><span class="lineNum"> 138 </span> : : .addr = CPU_TO_BE64(PROCIN_OFF),</a>
+<a name="139"><span class="lineNum"> 139 </span> : : .alloc_cnt = CPU_TO_BE16(1),</a>
+<a name="140"><span class="lineNum"> 140 </span> : : .act_cnt = CPU_TO_BE16(1),</a>
+<a name="141"><span class="lineNum"> 141 </span> : : .alloc_len</a>
+<a name="142"><span class="lineNum"> 142 </span> : : = CPU_TO_BE32(sizeof(struct proc_init_data)),</a>
+<a name="143"><span class="lineNum"> 143 </span> : : },</a>
+<a name="144"><span class="lineNum"> 144 </span> : : .heap = {</a>
+<a name="145"><span class="lineNum"> 145 </span> : : .addr = CPU_TO_BE64(SPIRA_HEAP_BASE),</a>
+<a name="146"><span class="lineNum"> 146 </span> : : .alloc_cnt = CPU_TO_BE16(1),</a>
+<a name="147"><span class="lineNum"> 147 </span> : : .alloc_len = CPU_TO_BE32(SPIRA_HEAP_SIZE),</a>
+<a name="148"><span class="lineNum"> 148 </span> : : },</a>
+<a name="149"><span class="lineNum"> 149 </span> : : .mdump_src = {</a>
+<a name="150"><span class="lineNum"> 150 </span> : : .addr = CPU_TO_BE64(MDST_TABLE_OFF),</a>
+<a name="151"><span class="lineNum"> 151 </span> : : .alloc_cnt = CPU_TO_BE16(ARRAY_SIZE(init_mdst_table)),</a>
+<a name="152"><span class="lineNum"> 152 </span> : : .act_cnt = CPU_TO_BE16(ARRAY_SIZE(init_mdst_table)),</a>
+<a name="153"><span class="lineNum"> 153 </span> : : .alloc_len =</a>
+<a name="154"><span class="lineNum"> 154 </span> : : CPU_TO_BE32(sizeof(init_mdst_table)),</a>
+<a name="155"><span class="lineNum"> 155 </span> : : },</a>
+<a name="156"><span class="lineNum"> 156 </span> : : .cpu_ctrl = {</a>
+<a name="157"><span class="lineNum"> 157 </span> : : .addr = CPU_TO_BE64(CPU_CTL_INIT_DATA_OFF),</a>
+<a name="158"><span class="lineNum"> 158 </span> : : .alloc_cnt = CPU_TO_BE16(1),</a>
+<a name="159"><span class="lineNum"> 159 </span> : : .act_cnt = CPU_TO_BE16(1),</a>
+<a name="160"><span class="lineNum"> 160 </span> : : .alloc_len = CPU_TO_BE32(sizeof(cpu_ctl_init_data)),</a>
+<a name="161"><span class="lineNum"> 161 </span> : : },</a>
+<a name="162"><span class="lineNum"> 162 </span> : : },</a>
+<a name="163"><span class="lineNum"> 163 </span> : : };</a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* The Hypervisor SPIRA-H Structure */</a>
+<a name="166"><span class="lineNum"> 166 </span> : : __section(&quot;.spirah.data&quot;) struct spirah spirah = {</a>
+<a name="167"><span class="lineNum"> 167 </span> : : .hdr = HDIF_SIMPLE_HDR(SPIRAH_HDIF_SIG, SPIRAH_VERSION, struct spirah),</a>
+<a name="168"><span class="lineNum"> 168 </span> : : .ntuples_ptr = HDIF_IDATA_PTR(offsetof(struct spirah, ntuples),</a>
+<a name="169"><span class="lineNum"> 169 </span> : : sizeof(struct spirah_ntuples)),</a>
+<a name="170"><span class="lineNum"> 170 </span> : : .ntuples = {</a>
+<a name="171"><span class="lineNum"> 171 </span> : : .array_hdr = {</a>
+<a name="172"><span class="lineNum"> 172 </span> : : .offset = CPU_TO_BE32(HDIF_ARRAY_OFFSET),</a>
+<a name="173"><span class="lineNum"> 173 </span> : : .ecnt = CPU_TO_BE32(SPIRAH_NTUPLES_COUNT),</a>
+<a name="174"><span class="lineNum"> 174 </span> : : .esize</a>
+<a name="175"><span class="lineNum"> 175 </span> : : = CPU_TO_BE32(sizeof(struct spira_ntuple)),</a>
+<a name="176"><span class="lineNum"> 176 </span> : : .eactsz = CPU_TO_BE32(0x18),</a>
+<a name="177"><span class="lineNum"> 177 </span> : : },</a>
+<a name="178"><span class="lineNum"> 178 </span> : : /* Host Data Areas */</a>
+<a name="179"><span class="lineNum"> 179 </span> : : .hs_data_area = {</a>
+<a name="180"><span class="lineNum"> 180 </span> : : .addr = CPU_TO_BE64(SPIRA_HEAP_BASE),</a>
+<a name="181"><span class="lineNum"> 181 </span> : : .alloc_cnt = CPU_TO_BE16(1),</a>
+<a name="182"><span class="lineNum"> 182 </span> : : .alloc_len = CPU_TO_BE32(SPIRA_HEAP_SIZE),</a>
+<a name="183"><span class="lineNum"> 183 </span> : : },</a>
+<a name="184"><span class="lineNum"> 184 </span> : : /* We only populate some n-tuples */</a>
+<a name="185"><span class="lineNum"> 185 </span> : : .proc_init = {</a>
+<a name="186"><span class="lineNum"> 186 </span> : : .addr = CPU_TO_BE64(PROCIN_OFF),</a>
+<a name="187"><span class="lineNum"> 187 </span> : : .alloc_cnt = CPU_TO_BE16(1),</a>
+<a name="188"><span class="lineNum"> 188 </span> : : .act_cnt = CPU_TO_BE16(1),</a>
+<a name="189"><span class="lineNum"> 189 </span> : : .alloc_len</a>
+<a name="190"><span class="lineNum"> 190 </span> : : = CPU_TO_BE32(sizeof(struct proc_init_data)),</a>
+<a name="191"><span class="lineNum"> 191 </span> : : },</a>
+<a name="192"><span class="lineNum"> 192 </span> : : .cpu_ctrl = {</a>
+<a name="193"><span class="lineNum"> 193 </span> : : .addr = CPU_TO_BE64(CPU_CTL_INIT_DATA_OFF),</a>
+<a name="194"><span class="lineNum"> 194 </span> : : .alloc_cnt = CPU_TO_BE16(1),</a>
+<a name="195"><span class="lineNum"> 195 </span> : : .act_cnt = CPU_TO_BE16(1),</a>
+<a name="196"><span class="lineNum"> 196 </span> : : .alloc_len =</a>
+<a name="197"><span class="lineNum"> 197 </span> : : CPU_TO_BE32(sizeof(cpu_ctl_init_data)),</a>
+<a name="198"><span class="lineNum"> 198 </span> : : },</a>
+<a name="199"><span class="lineNum"> 199 </span> : : .mdump_src = {</a>
+<a name="200"><span class="lineNum"> 200 </span> : : .addr = CPU_TO_BE64(MDST_TABLE_OFF),</a>
+<a name="201"><span class="lineNum"> 201 </span> : : .alloc_cnt = CPU_TO_BE16(MDST_TABLE_SIZE / sizeof(struct mdst_table)),</a>
+<a name="202"><span class="lineNum"> 202 </span> : : .act_cnt = CPU_TO_BE16(ARRAY_SIZE(init_mdst_table)),</a>
+<a name="203"><span class="lineNum"> 203 </span> : : .alloc_len = CPU_TO_BE32(sizeof(struct mdst_table)),</a>
+<a name="204"><span class="lineNum"> 204 </span> : : .act_len = CPU_TO_BE32(sizeof(struct mdst_table)),</a>
+<a name="205"><span class="lineNum"> 205 </span> : : },</a>
+<a name="206"><span class="lineNum"> 206 </span> : : .mdump_dst = {</a>
+<a name="207"><span class="lineNum"> 207 </span> : : .addr = CPU_TO_BE64(MDDT_TABLE_OFF),</a>
+<a name="208"><span class="lineNum"> 208 </span> : : .alloc_cnt = CPU_TO_BE16(MDDT_TABLE_SIZE / sizeof(struct mddt_table)),</a>
+<a name="209"><span class="lineNum"> 209 </span> : : .act_cnt = CPU_TO_BE16(0),</a>
+<a name="210"><span class="lineNum"> 210 </span> : : .alloc_len = CPU_TO_BE32(sizeof(struct mddt_table)),</a>
+<a name="211"><span class="lineNum"> 211 </span> : : .act_len = CPU_TO_BE32(sizeof(struct mddt_table)),</a>
+<a name="212"><span class="lineNum"> 212 </span> : : },</a>
+<a name="213"><span class="lineNum"> 213 </span> : : .mdump_res = {</a>
+<a name="214"><span class="lineNum"> 214 </span> : : .addr = CPU_TO_BE64(MDRT_TABLE_BASE),</a>
+<a name="215"><span class="lineNum"> 215 </span> : : .alloc_cnt = CPU_TO_BE16(MDRT_TABLE_SIZE / sizeof(struct mdrt_table)),</a>
+<a name="216"><span class="lineNum"> 216 </span> : : /*</a>
+<a name="217"><span class="lineNum"> 217 </span> : : * XXX: Ideally hostboot should use allocated count and</a>
+<a name="218"><span class="lineNum"> 218 </span> : : * length. But looks like hostboot uses actual count</a>
+<a name="219"><span class="lineNum"> 219 </span> : : * and length to get MDRT table size. And post dump</a>
+<a name="220"><span class="lineNum"> 220 </span> : : * hostboot will update act_cnt. Hence update both</a>
+<a name="221"><span class="lineNum"> 221 </span> : : * alloc_cnt and act_cnt.</a>
+<a name="222"><span class="lineNum"> 222 </span> : : */</a>
+<a name="223"><span class="lineNum"> 223 </span> : : .act_cnt = CPU_TO_BE16(MDRT_TABLE_SIZE / sizeof(struct mdrt_table)),</a>
+<a name="224"><span class="lineNum"> 224 </span> : : .alloc_len = CPU_TO_BE32(sizeof(struct mdrt_table)),</a>
+<a name="225"><span class="lineNum"> 225 </span> : : .act_len = CPU_TO_BE32(sizeof(struct mdrt_table)),</a>
+<a name="226"><span class="lineNum"> 226 </span> : : },</a>
+<a name="227"><span class="lineNum"> 227 </span> : : .proc_dump_area = {</a>
+<a name="228"><span class="lineNum"> 228 </span> : : .addr = CPU_TO_BE64(PROC_DUMP_AREA_OFF),</a>
+<a name="229"><span class="lineNum"> 229 </span> : : .alloc_cnt = CPU_TO_BE16(1),</a>
+<a name="230"><span class="lineNum"> 230 </span> : : .act_cnt = CPU_TO_BE16(1),</a>
+<a name="231"><span class="lineNum"> 231 </span> : : .alloc_len = CPU_TO_BE32(sizeof(struct proc_dump_area)),</a>
+<a name="232"><span class="lineNum"> 232 </span> : : .act_len = CPU_TO_BE32(sizeof(struct proc_dump_area)),</a>
+<a name="233"><span class="lineNum"> 233 </span> : : },</a>
+<a name="234"><span class="lineNum"> 234 </span> : : },</a>
+<a name="235"><span class="lineNum"> 235 </span> : : };</a>
+<a name="236"><span class="lineNum"> 236 </span> : : </a>
+<a name="237"><span class="lineNum"> 237 </span> : : /* The service processor SPIRA-S structure */</a>
+<a name="238"><span class="lineNum"> 238 </span> : : struct spiras *spiras;</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /* Overridden for testing. */</a>
+<a name="241"><span class="lineNum"> 241 </span> : : #ifndef spira_check_ptr</a>
+<a name="242"><span class="lineNum"> 242 </span> : : bool spira_check_ptr(const void *ptr, const char *file, unsigned int line)</a>
+<a name="243"><span class="lineNum"> 243 </span> : : {</a>
+<a name="244"><span class="lineNum"> 244 </span> : : if (!ptr)</a>
+<a name="245"><span class="lineNum"> 245 </span> : : return false;</a>
+<a name="246"><span class="lineNum"> 246 </span> : : if (((unsigned long)ptr) &gt;= SPIRA_HEAP_BASE &amp;&amp;</a>
+<a name="247"><span class="lineNum"> 247 </span> : : ((unsigned long)ptr) &lt; (SPIRA_HEAP_BASE + SPIRA_HEAP_SIZE))</a>
+<a name="248"><span class="lineNum"> 248 </span> : : return true;</a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> : : prerror(&quot;SPIRA: Bad pointer %p at %s line %d\n&quot;, ptr, file, line);</a>
+<a name="251"><span class="lineNum"> 251 </span> : : return false;</a>
+<a name="252"><span class="lineNum"> 252 </span> : : }</a>
+<a name="253"><span class="lineNum"> 253 </span> : : #endif</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 545 : struct HDIF_common_hdr *__get_hdif(struct spira_ntuple *n, const char id[],</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : const char *file, int line)</a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 545 : struct HDIF_common_hdr *h = ntuple_addr(n);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : u16 act_cnt, alloc_cnt;</a>
+<a name="260"><span class="lineNum"> 260 </span> : : u32 act_len, alloc_len;</a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 545 : if (!spira_check_ptr(h, file, line))</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 6 : return NULL;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 539 : act_cnt = be16_to_cpu(n-&gt;act_cnt);</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 539 : alloc_cnt = be16_to_cpu(n-&gt;alloc_cnt);</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 539 : if (act_cnt &gt; alloc_cnt) {</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SPIRA: bad ntuple, act_cnt &gt; alloc_cnt (%u &gt; %u)\n&quot;,</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : act_cnt, alloc_cnt);</a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 539 : act_len = be32_to_cpu(n-&gt;act_len);</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 539 : alloc_len = be32_to_cpu(n-&gt;alloc_len);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 539 : if (act_len &gt; alloc_len) {</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SPIRA: bad ntuple, act_len &gt; alloc_len (%u &gt; %u)\n&quot;,</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : act_len, alloc_len);</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : }</a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 539 : if (!HDIF_check(h, id)) {</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SPIRA: bad tuple %p: expected %s at %s line %d\n&quot;,</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : h, id, file, line);</a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : }</a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 539 : return h;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : }</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 6 : static struct dt_node *add_xscom_node(uint64_t base, uint32_t hw_id,</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : uint32_t proc_chip_id)</a>
+<a name="293"><span class="lineNum"> 293 </span> : : {</a>
+<a name="294"><span class="lineNum"> 294 </span> : : struct dt_node *node;</a>
+<a name="295"><span class="lineNum"> 295 </span> : : uint64_t addr, size;</a>
+<a name="296"><span class="lineNum"> 296 </span> : : uint64_t freq;</a>
+<a name="297"><span class="lineNum"> 297 </span> : : </a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 6 : switch (proc_gen) {</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 6 : case proc_gen_p8:</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : /* On P8 all the chip SCOMs share single region */</a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 6 : addr = base | ((uint64_t)hw_id &lt;&lt; PPC_BITLSHIFT(28));</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : case proc_gen_p9:</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : default:</a>
+<a name="305"><span class="lineNum"> 305 </span> : : /* On P9 we need to put the chip ID in the natural powerbus</a>
+<a name="306"><span class="lineNum"> 306 </span> : : * position.</a>
+<a name="307"><span class="lineNum"> 307 </span> : : */</a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : addr = base | (((uint64_t)hw_id) &lt;&lt; 42);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : };</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 6 : size = (u64)1 &lt;&lt; PPC_BITLSHIFT(28);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 6 : prlog(PR_INFO, &quot;XSCOM: Found HW ID 0x%x (PCID 0x%x) @ 0x%llx\n&quot;,</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : hw_id, proc_chip_id, (long long)addr);</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 6 : node = dt_new_addr(dt_root, &quot;xscom&quot;, addr);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 6 : assert(node);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 6 : dt_add_property_cells(node, &quot;ibm,chip-id&quot;, hw_id);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 6 : dt_add_property_cells(node, &quot;ibm,proc-chip-id&quot;, proc_chip_id);</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 6 : dt_add_property_cells(node, &quot;#address-cells&quot;, 1);</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 6 : dt_add_property_cells(node, &quot;#size-cells&quot;, 1);</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 6 : dt_add_property(node, &quot;scom-controller&quot;, NULL, 0);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 6 : switch(proc_gen) {</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 6 : case proc_gen_p8:</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 6 : dt_add_property_strings(node, &quot;compatible&quot;,</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : &quot;ibm,xscom&quot;, &quot;ibm,power8-xscom&quot;);</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : case proc_gen_p9:</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;compatible&quot;,</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : &quot;ibm,xscom&quot;, &quot;ibm,power9-xscom&quot;);</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;compatible&quot;, &quot;ibm,xscom&quot;);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : }</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 6 : dt_add_property_u64s(node, &quot;reg&quot;, addr, size);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> : : </a>
+<a name="340"><span class="lineNum"> 340 </span> : : /*</a>
+<a name="341"><span class="lineNum"> 341 </span> : : * The bus-frequency of the xscom node is actually the PIB/PCB</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * frequency. It is derived from the nest-clock via a 4:1 divider</a>
+<a name="343"><span class="lineNum"> 343 </span> : : */</a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 6 : freq = dt_prop_get_u64_def(dt_root, &quot;nest-frequency&quot;, 0);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 6 : freq /= 4;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 6 : if (freq)</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 6 : dt_add_property_u64(node, &quot;bus-frequency&quot;, freq);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : </a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 6 : return node;</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : }</a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : /*</a>
+<a name="353"><span class="lineNum"> 353 </span> : : * Given a xscom@ node this will return a pointer into the SPPCRD</a>
+<a name="354"><span class="lineNum"> 354 </span> : : * structure corresponding to that node</a>
+<a name="355"><span class="lineNum"> 355 </span> : : */</a>
+<a name="356"><span class="lineNum"> 356 </span> : : #define GET_HDIF_HDR -1</a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : static const void *xscom_to_pcrd(struct dt_node *xscom, int idata_index)</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : {</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : struct spira_ntuple *t = &amp;spira.ntuples.proc_chip;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : const struct HDIF_common_hdr *hdif;</a>
+<a name="361"><span class="lineNum"> 361 </span> : : const void *idata;</a>
+<a name="362"><span class="lineNum"> 362 </span> : : unsigned int size;</a>
+<a name="363"><span class="lineNum"> 363 </span> : : uint32_t i;</a>
+<a name="364"><span class="lineNum"> 364 </span> : : void *base;</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : i = dt_prop_get_u32_def(xscom, DT_PRIVATE &quot;sppcrd-index&quot;, 0xffffffff);</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : if (i == 0xffffffff)</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : base = get_hdif(t, &quot;SPPCRD&quot;);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineNoCov"> 0 : assert(base);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : assert(i &lt; be16_to_cpu(t-&gt;act_cnt));</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : hdif = base + i * be32_to_cpu(t-&gt;alloc_len);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : assert(hdif);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> : : </a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineNoCov"> 0 : if (idata_index == GET_HDIF_HDR)</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : return hdif;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : </a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : idata = HDIF_get_idata(hdif, idata_index, &amp;size);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : if (!idata || !size)</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : </a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : return idata;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 18 : struct dt_node *find_xscom_for_chip(uint32_t chip_id)</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : {</a>
+<a name="389"><span class="lineNum"> 389 </span> : : struct dt_node *node;</a>
+<a name="390"><span class="lineNum"> 390 </span> : : uint32_t id;</a>
+<a name="391"><span class="lineNum"> 391 </span> : : </a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 39 : dt_for_each_compatible(dt_root, node, &quot;ibm,xscom&quot;) {</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 39 : id = dt_get_chip_id(node);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 39 : if (id == chip_id)</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 18 : return node;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> : : }</a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : }</a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 6 : static void add_psihb_node(struct dt_node *np)</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : {</a>
+<a name="403"><span class="lineNum"> 403 </span> : : u32 psi_scom, psi_slen;</a>
+<a name="404"><span class="lineNum"> 404 </span> : : const char *psi_comp;</a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> : : /*</a>
+<a name="407"><span class="lineNum"> 407 </span> : : * We add a few things under XSCOM that aren't added</a>
+<a name="408"><span class="lineNum"> 408 </span> : : * by any other HDAT path</a>
+<a name="409"><span class="lineNum"> 409 </span> : : */</a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : /* PSI host bridge */</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 6 : switch(proc_gen) {</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 6 : case proc_gen_p8:</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 6 : psi_scom = 0x2010900;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 6 : psi_slen = 0x20;</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 6 : psi_comp = &quot;ibm,power8-psihb-x&quot;;</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : case proc_gen_p9:</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : psi_scom = 0x5012900;</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : psi_slen = 0x100;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : psi_comp = &quot;ibm,power9-psihb-x&quot;;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : psi_comp = NULL;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : }</a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 6 : if (psi_comp) {</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : struct dt_node *psi_np;</a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 6 : psi_np = dt_new_addr(np, &quot;psihb&quot;, psi_scom);</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 6 : if (!psi_np)</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="432"><span class="lineNum"> 432 </span> : : </a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 6 : dt_add_property_cells(psi_np, &quot;reg&quot;, psi_scom, psi_slen);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 6 : dt_add_property_strings(psi_np, &quot;compatible&quot;, psi_comp,</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : &quot;ibm,psihb-x&quot;);</a>
+<a name="436"><span class="lineNum"> 436 </span> : : }</a>
+<a name="437"><span class="lineNum"> 437 </span> : : }</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : static void add_xive_node(struct dt_node *np)</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : {</a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : struct dt_node *xive = dt_new_addr(np, &quot;xive&quot;, 0x5013000);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(xive, &quot;reg&quot;, 0x5013000, 0x300);</span></a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(xive, &quot;compatible&quot;, &quot;ibm,power9-xive-x&quot;);</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : </a>
+<a name="446"><span class="lineNum"> 446 </span> : : /* HACK: required for simics */</a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : dt_add_property(xive, &quot;force-assign-bars&quot;, NULL, 0);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> : : /*</a>
+<a name="451"><span class="lineNum"> 451 </span> : : * SCOM Base Address from P9 SCOM Assignment spreadsheet</a>
+<a name="452"><span class="lineNum"> 452 </span> : : */</a>
+<a name="453"><span class="lineNum"> 453 </span> : : #define VAS_SCOM_BASE_ADDR 0x03011800</a>
+<a name="454"><span class="lineNum"> 454 </span> : : </a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : static void add_vas_node(struct dt_node *np, int idx)</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : {</a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineNoCov"> 0 : struct dt_node *vas = dt_new_addr(np, &quot;vas&quot;, VAS_SCOM_BASE_ADDR);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> : : </a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(vas, &quot;reg&quot;, VAS_SCOM_BASE_ADDR, 0x300);</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(vas, &quot;compatible&quot;, &quot;ibm,power9-vas-x&quot;);</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(vas, &quot;ibm,vas-id&quot;, idx);</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : </a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : static void add_ecid_data(const struct HDIF_common_hdr *hdr,</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : struct dt_node *xscom)</a>
+<a name="466"><span class="lineNum"> 466 </span> : : {</a>
+<a name="467"><span class="lineNum"> 467 </span> : : char wafer_id[11];</a>
+<a name="468"><span class="lineNum"> 468 </span> : : uint8_t tmp;</a>
+<a name="469"><span class="lineNum"> 469 </span> : : int i;</a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : uint32_t size = 0;</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : struct sppcrd_ecid *ecid;</a>
+<a name="472"><span class="lineNum"> 472 </span> : : const struct HDIF_array_hdr *ec_hdr;</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineNoCov"> 0 : ec_hdr = HDIF_get_idata(hdr, SPPCRD_IDATA_EC_LEVEL, &amp;size);</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : if (!ec_hdr || !size)</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : </a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineNoCov"> 0 : ecid = (void *)ec_hdr + be32_to_cpu(ec_hdr-&gt;offset);</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64s(xscom, &quot;ecid&quot;, be64_to_cpu(ecid-&gt;low),</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : be64_to_cpu(ecid-&gt;high));</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> : : /*</a>
+<a name="483"><span class="lineNum"> 483 </span> : : * bits 4:63 of ECID data contains wafter ID data (ten 6 bit fields</a>
+<a name="484"><span class="lineNum"> 484 </span> : : * each containing a code).</a>
+<a name="485"><span class="lineNum"> 485 </span> : : */</a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; 10; i++) {</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineNoCov"> 0 : tmp = (u8)((be64_to_cpu(ecid-&gt;low) &gt;&gt; (i * 6)) &amp; 0x3f);</span></a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : if (tmp &lt;= 9)</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : wafer_id[9 - i] = tmp + '0';</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : else if (tmp &gt;= 0xA &amp;&amp; tmp &lt;= 0x23)</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : wafer_id[9 - i] = tmp + '0' + 7;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : else if (tmp == 0x3D)</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : wafer_id[9 - i] = '-';</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : else if (tmp == 0x3E)</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : wafer_id[9 - i] = '.';</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : else if (tmp == 0x3F)</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : wafer_id[9 - i] = ' ';</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : else /* Unknown code */</a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : wafer_id[9 - i] = tmp + '0';</span></a>
+<a name="500"><span class="lineNum"> 500 </span> : : }</a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineNoCov"> 0 : wafer_id[10] = '\0';</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : dt_add_property_nstr(xscom, &quot;wafer-id&quot;, wafer_id, 10);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(xscom, &quot;wafer-location&quot;,</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : (u32)((be64_to_cpu(ecid-&gt;high) &gt;&gt; 56) &amp; 0xff),</a>
+<a name="506"><span class="lineNum"> 506 </span> : : (u32)((be64_to_cpu(ecid-&gt;high) &gt;&gt; 48) &amp; 0xff));</a>
+<a name="507"><span class="lineNum"> 507 </span> : : }</a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 6 : static void add_xscom_add_pcia_assoc(struct dt_node *np, uint32_t pcid)</span></a>
+<a name="510"><span class="lineNum"> 510 </span> : : {</a>
+<a name="511"><span class="lineNum"> 511 </span> : : const struct HDIF_common_hdr *hdr;</a>
+<a name="512"><span class="lineNum"> 512 </span> : : u32 size;</a>
+<a name="513"><span class="lineNum"> 513 </span> : : </a>
+<a name="514"><span class="lineNum"> 514 </span> : : </a>
+<a name="515"><span class="lineNum"> 515 </span> : : /*</a>
+<a name="516"><span class="lineNum"> 516 </span> : : * The SPPCRD doesn't contain all the affinity data, we have</a>
+<a name="517"><span class="lineNum"> 517 </span> : : * to dig it out of a core. I assume this is so that node</a>
+<a name="518"><span class="lineNum"> 518 </span> : : * affinity can be different for groups of cores within the</a>
+<a name="519"><span class="lineNum"> 519 </span> : : * chip, but for now we are going to ignore that</a>
+<a name="520"><span class="lineNum"> 520 </span> : : */</a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineCov"> 6 : hdr = get_hdif(&amp;spira.ntuples.pcia, SPPCIA_HDIF_SIG);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 6 : if (!hdr)</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="524"><span class="lineNum"> 524 </span> : : </a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineCov"> 39 : for_each_pcia(hdr) {</span></a>
+<a name="526"><span class="lineNum"> 526 </span> : : const struct sppcia_core_unique *id;</a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 39 : id = HDIF_get_idata(hdr, SPPCIA_IDATA_CORE_UNIQUE, &amp;size);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 39 : if (!id || size &lt; sizeof(*id))</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 33 : continue;</span></a>
+<a name="531"><span class="lineNum"> 531 </span> : : </a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineCov"> 39 : if (be32_to_cpu(id-&gt;proc_chip_id) != pcid)</span></a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineCov"> 33 : continue;</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : </a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineCov"> 6 : dt_add_property_cells(np, &quot;ibm,ccm-node-id&quot;,</span></a>
+<a name="536"><span class="lineNum"> 536 </span> : : be32_to_cpu(id-&gt;ccm_node_id));</a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineCov"> 6 : dt_add_property_cells(np, &quot;ibm,hw-card-id&quot;,</span></a>
+<a name="538"><span class="lineNum"> 538 </span> : : be32_to_cpu(id-&gt;hw_card_id));</a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineCov"> 6 : dt_add_property_cells(np, &quot;ibm,hw-module-id&quot;,</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : be32_to_cpu(id-&gt;hw_module_id));</a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineCov"> 6 : if (!dt_find_property(np, &quot;ibm,dbob-id&quot;))</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(np, &quot;ibm,dbob-id&quot;,</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : be32_to_cpu(id-&gt;drawer_book_octant_blade_id));</a>
+<a name="544"><span class="lineNum"> 544 </span> :<span class="lineCov"> 6 : if (proc_gen &lt; proc_gen_p9) {</span></a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 6 : dt_add_property_cells(np, &quot;ibm,mem-interleave-scope&quot;,</span></a>
+<a name="546"><span class="lineNum"> 546 </span> : : be32_to_cpu(id-&gt;memory_interleaving_scope));</a>
+<a name="547"><span class="lineNum"> 547 </span> : : }</a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : }</a>
+<a name="550"><span class="lineNum"> 550 </span> : : }</a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineCov"> 2 : static bool add_xscom_sppcrd(uint64_t xscom_base)</span></a>
+<a name="553"><span class="lineNum"> 553 </span> : : {</a>
+<a name="554"><span class="lineNum"> 554 </span> : : const struct HDIF_common_hdr *hdif;</a>
+<a name="555"><span class="lineNum"> 555 </span> : : unsigned int i, vpd_sz;</a>
+<a name="556"><span class="lineNum"> 556 </span> : : const void *vpd;</a>
+<a name="557"><span class="lineNum"> 557 </span> : : struct dt_node *np, *vpd_node;</a>
+<a name="558"><span class="lineNum"> 558 </span> : : </a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 66 : for_each_ntuple_idx(&amp;spira.ntuples.proc_chip, hdif, i,</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : SPPCRD_HDIF_SIG) {</a>
+<a name="561"><span class="lineNum"> 561 </span> : : const struct sppcrd_chip_info *cinfo;</a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineCov"> 64 : const struct spira_fru_id *fru_id = NULL;</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : unsigned int csize;</a>
+<a name="564"><span class="lineNum"> 564 </span> : : u32 ve, version;</a>
+<a name="565"><span class="lineNum"> 565 </span> : : </a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 64 : cinfo = HDIF_get_idata(hdif, SPPCRD_IDATA_CHIP_INFO, &amp;csize);</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineCov"> 64 : if (!CHECK_SPPTR(cinfo)) {</span></a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineNoCov"> 0 : prerror(&quot;XSCOM: Bad ChipID data %d\n&quot;, i);</span></a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineCov"> 58 : continue;</span></a>
+<a name="570"><span class="lineNum"> 570 </span> : : }</a>
+<a name="571"><span class="lineNum"> 571 </span> : : </a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineCov"> 64 : ve = be32_to_cpu(cinfo-&gt;verif_exist_flags) &amp; CHIP_VERIFY_MASK;</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineCov"> 64 : ve &gt;&gt;= CHIP_VERIFY_SHIFT;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineCov"> 64 : if (ve == CHIP_VERIFY_NOT_INSTALLED ||</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : ve == CHIP_VERIFY_UNUSABLE)</a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineCov"> 58 : continue;</span></a>
+<a name="577"><span class="lineNum"> 577 </span> : : </a>
+<a name="578"><span class="lineNum"> 578 </span> : : /* Create the XSCOM node */</a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineCov"> 6 : np = add_xscom_node(xscom_base,</span></a>
+<a name="580"><span class="lineNum"> 580 </span> : : be32_to_cpu(cinfo-&gt;xscom_id),</a>
+<a name="581"><span class="lineNum"> 581 </span> : : be32_to_cpu(cinfo-&gt;proc_chip_id));</a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineCov"> 6 : if (!np)</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 6 : dt_add_property_cells(np, DT_PRIVATE &quot;sppcrd-index&quot;, i);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> : : </a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineCov"> 6 : version = be16_to_cpu(hdif-&gt;version);</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> : : /* Version 0A has additional OCC related stuff */</a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineCov"> 6 : if (version &gt;= 0x000a) {</span></a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 6 : if (!dt_find_property(np, &quot;ibm,dbob-id&quot;))</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 6 : dt_add_property_cells(np, &quot;ibm,dbob-id&quot;,</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : be32_to_cpu(cinfo-&gt;dbob_id));</a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineCov"> 6 : dt_add_property_cells(np, &quot;ibm,occ-functional-state&quot;,</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : be32_to_cpu(cinfo-&gt;occ_state));</a>
+<a name="597"><span class="lineNum"> 597 </span> : : }</a>
+<a name="598"><span class="lineNum"> 598 </span> : : </a>
+<a name="599"><span class="lineNum"> 599 </span> : : /* Add chip VPD */</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineCov"> 6 : vpd_node = dt_add_vpd_node(hdif, SPPCRD_IDATA_FRU_ID,</span></a>
+<a name="601"><span class="lineNum"> 601 </span> : : SPPCRD_IDATA_KW_VPD);</a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 6 : if (vpd_node)</span></a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineCov"> 6 : dt_add_property_cells(vpd_node, &quot;ibm,chip-id&quot;,</span></a>
+<a name="604"><span class="lineNum"> 604 </span> : : be32_to_cpu(cinfo-&gt;xscom_id));</a>
+<a name="605"><span class="lineNum"> 605 </span> : : </a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineCov"> 6 : fru_id = HDIF_get_idata(hdif, SPPCRD_IDATA_FRU_ID, NULL);</span></a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineCov"> 6 : if (fru_id)</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineCov"> 6 : slca_vpd_add_loc_code(np, be16_to_cpu(fru_id-&gt;slca_index));</span></a>
+<a name="609"><span class="lineNum"> 609 </span> : : </a>
+<a name="610"><span class="lineNum"> 610 </span> : : /* Add module VPD on version A and later */</a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineCov"> 6 : if (version &gt;= 0x000a) {</span></a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineCov"> 6 : vpd = HDIF_get_idata(hdif, SPPCRD_IDATA_MODULE_VPD,</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : &amp;vpd_sz);</a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 6 : if (CHECK_SPPTR(vpd)) {</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 6 : dt_add_property(np, &quot;ibm,module-vpd&quot;, vpd,</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : vpd_sz);</a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineCov"> 6 : vpd_data_parse(np, vpd, vpd_sz);</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineCov"> 6 : if (vpd_node)</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineCov"> 6 : dt_add_proc_vendor(vpd_node, vpd, vpd_sz);</span></a>
+<a name="620"><span class="lineNum"> 620 </span> : : }</a>
+<a name="621"><span class="lineNum"> 621 </span> : : }</a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> : : /*</a>
+<a name="624"><span class="lineNum"> 624 </span> : : * Extract additional associativity information from</a>
+<a name="625"><span class="lineNum"> 625 </span> : : * the core data. Pick one core on that chip</a>
+<a name="626"><span class="lineNum"> 626 </span> : : */</a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 6 : add_xscom_add_pcia_assoc(np, be32_to_cpu(cinfo-&gt;proc_chip_id));</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> : : /* Add PSI Host bridge */</a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 6 : add_psihb_node(np);</span></a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 6 : if (proc_gen &gt;= proc_gen_p9) {</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : add_xive_node(np);</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : parse_i2c_devs(hdif, SPPCRD_IDATA_HOST_I2C, np);</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : add_vas_node(np, i);</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineNoCov"> 0 : add_ecid_data(hdif, np);</span></a>
+<a name="637"><span class="lineNum"> 637 </span> : : </a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(cinfo-&gt;verif_exist_flags) &amp; CHIP_VERIFY_MASTER_PROC)</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : dt_add_property(np, &quot;primary&quot;, NULL, 0);</span></a>
+<a name="640"><span class="lineNum"> 640 </span> : : }</a>
+<a name="641"><span class="lineNum"> 641 </span> : : </a>
+<a name="642"><span class="lineNum"> 642 </span> : : /*</a>
+<a name="643"><span class="lineNum"> 643 </span> : : * Add sw checkstop scom address (ibm,sw-checkstop-fir)</a>
+<a name="644"><span class="lineNum"> 644 </span> : : *</a>
+<a name="645"><span class="lineNum"> 645 </span> : : * The latest HDAT versions have sw checkstop scom address</a>
+<a name="646"><span class="lineNum"> 646 </span> : : * info. But not sure from which version onwards (at least</a>
+<a name="647"><span class="lineNum"> 647 </span> : : * HDAT spec do not mention that explicitly). Hence use the</a>
+<a name="648"><span class="lineNum"> 648 </span> : : * sppcrd struct size returned by HDIF_get_idata to figure out</a>
+<a name="649"><span class="lineNum"> 649 </span> : : * whether it contains sw checkstop scom address info. Also</a>
+<a name="650"><span class="lineNum"> 650 </span> : : * check if sw_xstop_fir_scom address is non-zero.</a>
+<a name="651"><span class="lineNum"> 651 </span> : : */</a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 6 : if ((csize &gt;= (offsetof(struct sppcrd_chip_info,</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : sw_xstop_fir_bitpos) + 1)) &amp;&amp;</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : cinfo-&gt;sw_xstop_fir_scom) {</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : uint8_t fir_bit = cinfo-&gt;sw_xstop_fir_bitpos;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineNoCov"> 0 : if (!dt_find_property(dt_root, &quot;ibm,sw-checkstop-fir&quot;))</span></a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dt_root,</span></a>
+<a name="659"><span class="lineNum"> 659 </span> : : &quot;ibm,sw-checkstop-fir&quot;,</a>
+<a name="660"><span class="lineNum"> 660 </span> : : be32_to_cpu(cinfo-&gt;sw_xstop_fir_scom),</a>
+<a name="661"><span class="lineNum"> 661 </span> : : fir_bit);</a>
+<a name="662"><span class="lineNum"> 662 </span> : : }</a>
+<a name="663"><span class="lineNum"> 663 </span> : : }</a>
+<a name="664"><span class="lineNum"> 664 </span> : : </a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineCov"> 2 : return i &gt; 0;</span></a>
+<a name="666"><span class="lineNum"> 666 </span> : : }</a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 2 : static void add_xscom(void)</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : {</a>
+<a name="670"><span class="lineNum"> 670 </span> : : const void *ms_vpd;</a>
+<a name="671"><span class="lineNum"> 671 </span> : : const struct msvpd_pmover_bsr_synchro *pmbs;</a>
+<a name="672"><span class="lineNum"> 672 </span> : : unsigned int size;</a>
+<a name="673"><span class="lineNum"> 673 </span> : : uint64_t xscom_base;</a>
+<a name="674"><span class="lineNum"> 674 </span> : : </a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineCov"> 2 : ms_vpd = get_hdif(&amp;spira.ntuples.ms_vpd, MSVPD_HDIF_SIG);</span></a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineCov"> 2 : if (!ms_vpd) {</span></a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineNoCov"> 0 : prerror(&quot;XSCOM: Can't find MS VPD\n&quot;);</span></a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="679"><span class="lineNum"> 679 </span> : : }</a>
+<a name="680"><span class="lineNum"> 680 </span> : : </a>
+<a name="681"><span class="lineNum"> 681 </span> :<span class="lineCov"> 2 : pmbs = HDIF_get_idata(ms_vpd, MSVPD_IDATA_PMOVER_SYNCHRO, &amp;size);</span></a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(pmbs) || size &lt; sizeof(*pmbs)) {</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : prerror(&quot;XSCOM: absent or bad PMBS size %u @ %p\n&quot;, size, pmbs);</span></a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="685"><span class="lineNum"> 685 </span> : : }</a>
+<a name="686"><span class="lineNum"> 686 </span> : : </a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 2 : if (!(be32_to_cpu(pmbs-&gt;flags) &amp; MSVPD_PMS_FLAG_XSCOMBASE_VALID)) {</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : prerror(&quot;XSCOM: No XSCOM base in PMBS, using default\n&quot;);</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : }</a>
+<a name="691"><span class="lineNum"> 691 </span> : : </a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineCov"> 2 : xscom_base = be64_to_cpu(pmbs-&gt;xscom_addr);</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : </a>
+<a name="694"><span class="lineNum"> 694 </span> : : /* Get rid of the top bits */</a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 2 : xscom_base = cleanup_addr(xscom_base);</span></a>
+<a name="696"><span class="lineNum"> 696 </span> : : </a>
+<a name="697"><span class="lineNum"> 697 </span> : : /* First, try the new proc_chip ntuples for chip data */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineCov"> 2 : if (add_xscom_sppcrd(xscom_base))</span></a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="700"><span class="lineNum"> 700 </span> : : }</a>
+<a name="701"><span class="lineNum"> 701 </span> : : </a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineCov"> 6 : static void add_chiptod_node(unsigned int chip_id, int flags)</span></a>
+<a name="703"><span class="lineNum"> 703 </span> : : {</a>
+<a name="704"><span class="lineNum"> 704 </span> : : struct dt_node *node, *xscom_node;</a>
+<a name="705"><span class="lineNum"> 705 </span> : : const char *compat_str;</a>
+<a name="706"><span class="lineNum"> 706 </span> : : uint32_t addr, len;</a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 6 : if ((flags &amp; CHIPTOD_ID_FLAGS_STATUS_MASK) !=</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : CHIPTOD_ID_FLAGS_STATUS_OK)</a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="711"><span class="lineNum"> 711 </span> : : </a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineCov"> 6 : xscom_node = find_xscom_for_chip(chip_id);</span></a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 6 : if (!xscom_node) {</span></a>
+<a name="714"><span class="lineNum"> 714 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CHIPTOD: No xscom for chiptod %d?\n&quot;, chip_id);</span></a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="716"><span class="lineNum"> 716 </span> : : }</a>
+<a name="717"><span class="lineNum"> 717 </span> : : </a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 6 : addr = 0x40000;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 6 : len = 0x34;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 6 : switch(proc_gen) {</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 6 : case proc_gen_p8:</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 6 : compat_str = &quot;ibm,power8-chiptod&quot;;</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineNoCov"> 0 : case proc_gen_p9:</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineNoCov"> 0 : compat_str = &quot;ibm,power9-chiptod&quot;;</span></a>
+<a name="727"><span class="lineNum"> 727 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : }</a>
+<a name="731"><span class="lineNum"> 731 </span> : : </a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineCov"> 6 : prlog(PR_DEBUG, &quot;CHIPTOD: Found on chip 0x%x %s\n&quot;, chip_id,</span></a>
+<a name="733"><span class="lineNum"> 733 </span> : : (flags &amp; CHIPTOD_ID_FLAGS_PRIMARY) ? &quot;[primary]&quot; :</a>
+<a name="734"><span class="lineNum"> 734 </span> : : ((flags &amp; CHIPTOD_ID_FLAGS_SECONDARY) ? &quot;[secondary]&quot; : &quot;&quot;));</a>
+<a name="735"><span class="lineNum"> 735 </span> : : </a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineCov"> 6 : node = dt_new_addr(xscom_node, &quot;chiptod&quot;, addr);</span></a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineCov"> 6 : if (!node)</span></a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="739"><span class="lineNum"> 739 </span> : : </a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 6 : dt_add_property_cells(node, &quot;reg&quot;, addr, len);</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 6 : dt_add_property_strings(node, &quot;compatible&quot;, &quot;ibm,power-chiptod&quot;,</span></a>
+<a name="742"><span class="lineNum"> 742 </span> : : compat_str);</a>
+<a name="743"><span class="lineNum"> 743 </span> : : </a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineCov"> 6 : if (flags &amp; CHIPTOD_ID_FLAGS_PRIMARY)</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineCov"> 2 : dt_add_property(node, &quot;primary&quot;, NULL, 0);</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineCov"> 6 : if (flags &amp; CHIPTOD_ID_FLAGS_SECONDARY)</span></a>
+<a name="747"><span class="lineNum"> 747 </span> :<span class="lineCov"> 2 : dt_add_property(node, &quot;secondary&quot;, NULL, 0);</span></a>
+<a name="748"><span class="lineNum"> 748 </span> : : }</a>
+<a name="749"><span class="lineNum"> 749 </span> : : </a>
+<a name="750"><span class="lineNum"> 750 </span> :<span class="lineCov"> 2 : static bool add_chiptod_old(void)</span></a>
+<a name="751"><span class="lineNum"> 751 </span> : : {</a>
+<a name="752"><span class="lineNum"> 752 </span> : : const void *hdif;</a>
+<a name="753"><span class="lineNum"> 753 </span> : : unsigned int i;</a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineCov"> 2 : bool found = false;</span></a>
+<a name="755"><span class="lineNum"> 755 </span> : : </a>
+<a name="756"><span class="lineNum"> 756 </span> : : /*</a>
+<a name="757"><span class="lineNum"> 757 </span> : : * Locate chiptod ID structures in SPIRA</a>
+<a name="758"><span class="lineNum"> 758 </span> : : */</a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineCov"> 2 : if (!get_hdif(&amp;spira.ntuples.chip_tod, &quot;TOD &quot;))</span></a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineCov"> 2 : return found;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : </a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : for_each_ntuple_idx(&amp;spira.ntuples.chip_tod, hdif, i, &quot;TOD &quot;) {</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : const struct chiptod_chipid *id;</a>
+<a name="764"><span class="lineNum"> 764 </span> : : </a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineNoCov"> 0 : id = HDIF_get_idata(hdif, CHIPTOD_IDATA_CHIPID, NULL);</span></a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineNoCov"> 0 : if (!CHECK_SPPTR(id)) {</span></a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CHIPTOD: Bad ChipID data %d\n&quot;, i);</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="769"><span class="lineNum"> 769 </span> : : }</a>
+<a name="770"><span class="lineNum"> 770 </span> : : </a>
+<a name="771"><span class="lineNum"> 771 </span> :<span class="lineNoCov"> 0 : add_chiptod_node(pcid_to_chip_id(be32_to_cpu(id-&gt;chip_id)),</span></a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : be32_to_cpu(id-&gt;flags));</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineNoCov"> 0 : found = true;</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : }</a>
+<a name="775"><span class="lineNum"> 775 </span> :<span class="lineNoCov"> 0 : return found;</span></a>
+<a name="776"><span class="lineNum"> 776 </span> : : }</a>
+<a name="777"><span class="lineNum"> 777 </span> : : </a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineCov"> 2 : static bool add_chiptod_new(void)</span></a>
+<a name="779"><span class="lineNum"> 779 </span> : : {</a>
+<a name="780"><span class="lineNum"> 780 </span> : : const void *hdif;</a>
+<a name="781"><span class="lineNum"> 781 </span> : : unsigned int i;</a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 2 : bool found = false;</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : </a>
+<a name="784"><span class="lineNum"> 784 </span> : : /*</a>
+<a name="785"><span class="lineNum"> 785 </span> : : * Locate Proc Chip ID structures in SPIRA</a>
+<a name="786"><span class="lineNum"> 786 </span> : : */</a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineCov"> 2 : if (!get_hdif(&amp;spira.ntuples.proc_chip, SPPCRD_HDIF_SIG))</span></a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineNoCov"> 0 : return found;</span></a>
+<a name="789"><span class="lineNum"> 789 </span> : : </a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineCov"> 66 : for_each_ntuple_idx(&amp;spira.ntuples.proc_chip, hdif, i,</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : SPPCRD_HDIF_SIG) {</a>
+<a name="792"><span class="lineNum"> 792 </span> : : const struct sppcrd_chip_info *cinfo;</a>
+<a name="793"><span class="lineNum"> 793 </span> : : const struct sppcrd_chip_tod *tinfo;</a>
+<a name="794"><span class="lineNum"> 794 </span> : : unsigned int size;</a>
+<a name="795"><span class="lineNum"> 795 </span> : : u32 ve, flags;</a>
+<a name="796"><span class="lineNum"> 796 </span> : : </a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineCov"> 64 : cinfo = HDIF_get_idata(hdif, SPPCRD_IDATA_CHIP_INFO, NULL);</span></a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineCov"> 64 : if (!CHECK_SPPTR(cinfo)) {</span></a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CHIPTOD: Bad ChipID data %d\n&quot;, i);</span></a>
+<a name="800"><span class="lineNum"> 800 </span> :<span class="lineCov"> 58 : continue;</span></a>
+<a name="801"><span class="lineNum"> 801 </span> : : }</a>
+<a name="802"><span class="lineNum"> 802 </span> : : </a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineCov"> 64 : ve = be32_to_cpu(cinfo-&gt;verif_exist_flags) &amp; CHIP_VERIFY_MASK;</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineCov"> 64 : ve &gt;&gt;= CHIP_VERIFY_SHIFT;</span></a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineCov"> 64 : if (ve == CHIP_VERIFY_NOT_INSTALLED ||</span></a>
+<a name="806"><span class="lineNum"> 806 </span> : : ve == CHIP_VERIFY_UNUSABLE)</a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineCov"> 58 : continue;</span></a>
+<a name="808"><span class="lineNum"> 808 </span> : : </a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineCov"> 6 : tinfo = HDIF_get_idata(hdif, SPPCRD_IDATA_CHIP_TOD, &amp;size);</span></a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineCov"> 6 : if (!CHECK_SPPTR(tinfo)) {</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CHIPTOD: Bad TOD data %d\n&quot;, i);</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : }</a>
+<a name="814"><span class="lineNum"> 814 </span> : : </a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineCov"> 6 : flags = be32_to_cpu(tinfo-&gt;flags);</span></a>
+<a name="816"><span class="lineNum"> 816 </span> : : </a>
+<a name="817"><span class="lineNum"> 817 </span> : : /* The FSP may strip the chiptod info from HDAT; if we find</a>
+<a name="818"><span class="lineNum"> 818 </span> : : * a zero-ed out entry, assume that the chiptod is</a>
+<a name="819"><span class="lineNum"> 819 </span> : : * present, but we don't have any primary/secondary info. In</a>
+<a name="820"><span class="lineNum"> 820 </span> : : * this case, pick chip zero as the master.</a>
+<a name="821"><span class="lineNum"> 821 </span> : : */</a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineCov"> 6 : if (!size) {</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : flags = CHIPTOD_ID_FLAGS_STATUS_OK;</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(cinfo-&gt;xscom_id) == 0x0)</span></a>
+<a name="825"><span class="lineNum"> 825 </span> :<span class="lineNoCov"> 0 : flags |= CHIPTOD_ID_FLAGS_PRIMARY;</span></a>
+<a name="826"><span class="lineNum"> 826 </span> : : }</a>
+<a name="827"><span class="lineNum"> 827 </span> : : </a>
+<a name="828"><span class="lineNum"> 828 </span> :<span class="lineCov"> 6 : add_chiptod_node(be32_to_cpu(cinfo-&gt;xscom_id), flags);</span></a>
+<a name="829"><span class="lineNum"> 829 </span> :<span class="lineCov"> 6 : found = true;</span></a>
+<a name="830"><span class="lineNum"> 830 </span> : : }</a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineCov"> 2 : return found;</span></a>
+<a name="832"><span class="lineNum"> 832 </span> : : }</a>
+<a name="833"><span class="lineNum"> 833 </span> : : </a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineCov"> 6 : static void add_nx_node(u32 gcid)</span></a>
+<a name="835"><span class="lineNum"> 835 </span> : : {</a>
+<a name="836"><span class="lineNum"> 836 </span> : : struct dt_node *nx;</a>
+<a name="837"><span class="lineNum"> 837 </span> : : u32 addr;</a>
+<a name="838"><span class="lineNum"> 838 </span> : : u32 size;</a>
+<a name="839"><span class="lineNum"> 839 </span> : : struct dt_node *xscom;</a>
+<a name="840"><span class="lineNum"> 840 </span> : : </a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 6 : xscom = find_xscom_for_chip(gcid);</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineCov"> 6 : if (xscom == NULL) {</span></a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineNoCov"> 0 : prerror(&quot;NX%d: did not found xscom node.\n&quot;, gcid);</span></a>
+<a name="844"><span class="lineNum"> 844 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="845"><span class="lineNum"> 845 </span> : : }</a>
+<a name="846"><span class="lineNum"> 846 </span> : : </a>
+<a name="847"><span class="lineNum"> 847 </span> : : /*</a>
+<a name="848"><span class="lineNum"> 848 </span> : : * The NX register space is relatively self contained on P7+ but</a>
+<a name="849"><span class="lineNum"> 849 </span> : : * a bit more messy on P8. However it's all contained within the</a>
+<a name="850"><span class="lineNum"> 850 </span> : : * PB chiplet port 1 so we'll stick to that in the &quot;reg&quot; property</a>
+<a name="851"><span class="lineNum"> 851 </span> : : * and let the NX &quot;driver&quot; deal with the details.</a>
+<a name="852"><span class="lineNum"> 852 </span> : : */</a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineCov"> 6 : addr = 0x2010000;</span></a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineCov"> 6 : size = 0x0004000;</span></a>
+<a name="855"><span class="lineNum"> 855 </span> : : </a>
+<a name="856"><span class="lineNum"> 856 </span> :<span class="lineCov"> 6 : nx = dt_new_addr(xscom, &quot;nx&quot;, addr);</span></a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineCov"> 6 : if (!nx)</span></a>
+<a name="858"><span class="lineNum"> 858 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="859"><span class="lineNum"> 859 </span> : : </a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineCov"> 6 : switch (proc_gen) {</span></a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineCov"> 6 : case proc_gen_p8:</span></a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineCov"> 6 : dt_add_property_strings(nx, &quot;compatible&quot;, &quot;ibm,power-nx&quot;,</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : &quot;ibm,power8-nx&quot;);</a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineCov"> 6 : break;</span></a>
+<a name="865"><span class="lineNum"> 865 </span> :<span class="lineNoCov"> 0 : case proc_gen_p9:</span></a>
+<a name="866"><span class="lineNum"> 866 </span> : : /* POWER9 NX is not software compatible with P8 NX */</a>
+<a name="867"><span class="lineNum"> 867 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(nx, &quot;compatible&quot;, &quot;ibm,power9-nx&quot;);</span></a>
+<a name="868"><span class="lineNum"> 868 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="869"><span class="lineNum"> 869 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="870"><span class="lineNum"> 870 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="871"><span class="lineNum"> 871 </span> : : }</a>
+<a name="872"><span class="lineNum"> 872 </span> : : </a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineCov"> 6 : dt_add_property_cells(nx, &quot;reg&quot;, addr, size);</span></a>
+<a name="874"><span class="lineNum"> 874 </span> : : }</a>
+<a name="875"><span class="lineNum"> 875 </span> : : </a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineCov"> 2 : static void add_nx(void)</span></a>
+<a name="877"><span class="lineNum"> 877 </span> : : {</a>
+<a name="878"><span class="lineNum"> 878 </span> : : unsigned int i;</a>
+<a name="879"><span class="lineNum"> 879 </span> : : void *hdif;</a>
+<a name="880"><span class="lineNum"> 880 </span> : : </a>
+<a name="881"><span class="lineNum"> 881 </span> :<span class="lineCov"> 66 : for_each_ntuple_idx(&amp;spira.ntuples.proc_chip, hdif, i,</span></a>
+<a name="882"><span class="lineNum"> 882 </span> : : SPPCRD_HDIF_SIG) {</a>
+<a name="883"><span class="lineNum"> 883 </span> : : const struct sppcrd_chip_info *cinfo;</a>
+<a name="884"><span class="lineNum"> 884 </span> : : u32 ve;</a>
+<a name="885"><span class="lineNum"> 885 </span> : : </a>
+<a name="886"><span class="lineNum"> 886 </span> :<span class="lineCov"> 64 : cinfo = HDIF_get_idata(hdif, SPPCRD_IDATA_CHIP_INFO, NULL);</span></a>
+<a name="887"><span class="lineNum"> 887 </span> :<span class="lineCov"> 64 : if (!CHECK_SPPTR(cinfo)) {</span></a>
+<a name="888"><span class="lineNum"> 888 </span> :<span class="lineNoCov"> 0 : prerror(&quot;NX: Bad ChipID data %d\n&quot;, i);</span></a>
+<a name="889"><span class="lineNum"> 889 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="890"><span class="lineNum"> 890 </span> : : }</a>
+<a name="891"><span class="lineNum"> 891 </span> : : </a>
+<a name="892"><span class="lineNum"> 892 </span> :<span class="lineCov"> 64 : ve = be32_to_cpu(cinfo-&gt;verif_exist_flags) &amp; CHIP_VERIFY_MASK;</span></a>
+<a name="893"><span class="lineNum"> 893 </span> :<span class="lineCov"> 64 : ve &gt;&gt;= CHIP_VERIFY_SHIFT;</span></a>
+<a name="894"><span class="lineNum"> 894 </span> :<span class="lineCov"> 64 : if (ve == CHIP_VERIFY_NOT_INSTALLED ||</span></a>
+<a name="895"><span class="lineNum"> 895 </span> : : ve == CHIP_VERIFY_UNUSABLE)</a>
+<a name="896"><span class="lineNum"> 896 </span> :<span class="lineCov"> 58 : continue;</span></a>
+<a name="897"><span class="lineNum"> 897 </span> : : </a>
+<a name="898"><span class="lineNum"> 898 </span> :<span class="lineCov"> 6 : if (cinfo-&gt;nx_state)</span></a>
+<a name="899"><span class="lineNum"> 899 </span> :<span class="lineCov"> 6 : add_nx_node(be32_to_cpu(cinfo-&gt;xscom_id));</span></a>
+<a name="900"><span class="lineNum"> 900 </span> : : }</a>
+<a name="901"><span class="lineNum"> 901 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="902"><span class="lineNum"> 902 </span> : : </a>
+<a name="903"><span class="lineNum"> 903 </span> :<span class="lineCov"> 2 : static void add_nmmu(void)</span></a>
+<a name="904"><span class="lineNum"> 904 </span> : : {</a>
+<a name="905"><span class="lineNum"> 905 </span> : : struct dt_node *xscom, *nmmu;</a>
+<a name="906"><span class="lineNum"> 906 </span> : : </a>
+<a name="907"><span class="lineNum"> 907 </span> : : /* Nest MMU only exists on POWER9 */</a>
+<a name="908"><span class="lineNum"> 908 </span> :<span class="lineCov"> 2 : if (proc_gen != proc_gen_p9)</span></a>
+<a name="909"><span class="lineNum"> 909 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="910"><span class="lineNum"> 910 </span> : : </a>
+<a name="911"><span class="lineNum"> 911 </span> :<span class="lineNoCov"> 0 : dt_for_each_compatible(dt_root, xscom, &quot;ibm,xscom&quot;) {</span></a>
+<a name="912"><span class="lineNum"> 912 </span> :<span class="lineNoCov"> 0 : nmmu = dt_new_addr(xscom, &quot;nmmu&quot;, 0x5012c40);</span></a>
+<a name="913"><span class="lineNum"> 913 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(nmmu, &quot;compatible&quot;, &quot;ibm,power9-nest-mmu&quot;);</span></a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(nmmu, &quot;reg&quot;, 0x5012c40, 0x20);</span></a>
+<a name="915"><span class="lineNum"> 915 </span> : : }</a>
+<a name="916"><span class="lineNum"> 916 </span> : : }</a>
+<a name="917"><span class="lineNum"> 917 </span> : : </a>
+<a name="918"><span class="lineNum"> 918 </span> :<span class="lineNoCov"> 0 : static void dt_init_secureboot_node(const struct iplparams_sysparams *sysparams)</span></a>
+<a name="919"><span class="lineNum"> 919 </span> : : {</a>
+<a name="920"><span class="lineNum"> 920 </span> : : struct dt_node *node;</a>
+<a name="921"><span class="lineNum"> 921 </span> : : u16 sys_sec_setting;</a>
+<a name="922"><span class="lineNum"> 922 </span> : : u16 hw_key_hash_size;</a>
+<a name="923"><span class="lineNum"> 923 </span> : : u16 host_fw_key_clear;</a>
+<a name="924"><span class="lineNum"> 924 </span> : : </a>
+<a name="925"><span class="lineNum"> 925 </span> :<span class="lineNoCov"> 0 : node = dt_new(dt_root, &quot;ibm,secureboot&quot;);</span></a>
+<a name="926"><span class="lineNum"> 926 </span> :<span class="lineNoCov"> 0 : assert(node);</span></a>
+<a name="927"><span class="lineNum"> 927 </span> : : </a>
+<a name="928"><span class="lineNum"> 928 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;compatible&quot;,</span></a>
+<a name="929"><span class="lineNum"> 929 </span> : : &quot;ibm,secureboot&quot;, &quot;ibm,secureboot-v2&quot;);</a>
+<a name="930"><span class="lineNum"> 930 </span> : : </a>
+<a name="931"><span class="lineNum"> 931 </span> :<span class="lineNoCov"> 0 : sys_sec_setting = be16_to_cpu(sysparams-&gt;sys_sec_setting);</span></a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineNoCov"> 0 : if (sys_sec_setting &amp; SEC_CONTAINER_SIG_CHECKING)</span></a>
+<a name="933"><span class="lineNum"> 933 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;secure-enabled&quot;, NULL, 0);</span></a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineNoCov"> 0 : if (sys_sec_setting &amp; SEC_HASHES_EXTENDED_TO_TPM)</span></a>
+<a name="935"><span class="lineNum"> 935 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;trusted-enabled&quot;, NULL, 0);</span></a>
+<a name="936"><span class="lineNum"> 936 </span> :<span class="lineNoCov"> 0 : if (sys_sec_setting &amp; PHYSICAL_PRESENCE_ASSERTED)</span></a>
+<a name="937"><span class="lineNum"> 937 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;physical-presence-asserted&quot;, NULL, 0);</span></a>
+<a name="938"><span class="lineNum"> 938 </span> : : </a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineNoCov"> 0 : host_fw_key_clear = be16_to_cpu(sysparams-&gt;host_fw_key_clear);</span></a>
+<a name="940"><span class="lineNum"> 940 </span> :<span class="lineNoCov"> 0 : if (host_fw_key_clear &amp; KEY_CLEAR_OS_KEYS)</span></a>
+<a name="941"><span class="lineNum"> 941 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;clear-os-keys&quot;, NULL, 0);</span></a>
+<a name="942"><span class="lineNum"> 942 </span> :<span class="lineNoCov"> 0 : if (host_fw_key_clear &amp; KEY_CLEAR_MFG)</span></a>
+<a name="943"><span class="lineNum"> 943 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;clear-mfg-keys&quot;, NULL, 0);</span></a>
+<a name="944"><span class="lineNum"> 944 </span> :<span class="lineNoCov"> 0 : if (host_fw_key_clear &amp; KEY_CLEAR_ALL)</span></a>
+<a name="945"><span class="lineNum"> 945 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;clear-all-keys&quot;, NULL, 0);</span></a>
+<a name="946"><span class="lineNum"> 946 </span> : : </a>
+<a name="947"><span class="lineNum"> 947 </span> :<span class="lineNoCov"> 0 : hw_key_hash_size = be16_to_cpu(sysparams-&gt;hw_key_hash_size);</span></a>
+<a name="948"><span class="lineNum"> 948 </span> : : </a>
+<a name="949"><span class="lineNum"> 949 </span> : : /* Prevent hw-key-hash buffer overflow by truncating hw-key-hash-size if</a>
+<a name="950"><span class="lineNum"> 950 </span> : : * it is bigger than the hw-key-hash buffer.</a>
+<a name="951"><span class="lineNum"> 951 </span> : : * Secure boot will be enforced later in skiboot, if the hw-key-hash-size</a>
+<a name="952"><span class="lineNum"> 952 </span> : : * was not supposed to be SYSPARAMS_HW_KEY_HASH_MAX.</a>
+<a name="953"><span class="lineNum"> 953 </span> : : */</a>
+<a name="954"><span class="lineNum"> 954 </span> :<span class="lineNoCov"> 0 : if (hw_key_hash_size &gt; SYSPARAMS_HW_KEY_HASH_MAX) {</span></a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;IPLPARAMS: hw-key-hash-size=%d too big, &quot;</span></a>
+<a name="956"><span class="lineNum"> 956 </span> : : &quot;truncating to %d\n&quot;, hw_key_hash_size,</a>
+<a name="957"><span class="lineNum"> 957 </span> : : SYSPARAMS_HW_KEY_HASH_MAX);</a>
+<a name="958"><span class="lineNum"> 958 </span> :<span class="lineNoCov"> 0 : hw_key_hash_size = SYSPARAMS_HW_KEY_HASH_MAX;</span></a>
+<a name="959"><span class="lineNum"> 959 </span> : : }</a>
+<a name="960"><span class="lineNum"> 960 </span> : : </a>
+<a name="961"><span class="lineNum"> 961 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;hw-key-hash&quot;, sysparams-&gt;hw_key_hash,</span></a>
+<a name="962"><span class="lineNum"> 962 </span> : : hw_key_hash_size);</a>
+<a name="963"><span class="lineNum"> 963 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;hw-key-hash-size&quot;, hw_key_hash_size);</span></a>
+<a name="964"><span class="lineNum"> 964 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="965"><span class="lineNum"> 965 </span> : : </a>
+<a name="966"><span class="lineNum"> 966 </span> :<span class="lineCov"> 2 : static void opal_dump_add_mpipl_boot(const struct iplparams_iplparams *p)</span></a>
+<a name="967"><span class="lineNum"> 967 </span> : : {</a>
+<a name="968"><span class="lineNum"> 968 </span> :<span class="lineCov"> 2 : u32 mdrt_cnt = be16_to_cpu(spira.ntuples.mdump_res.act_cnt);</span></a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineCov"> 2 : u32 mdrt_max_cnt = MDRT_TABLE_SIZE / sizeof(struct mdrt_table);</span></a>
+<a name="970"><span class="lineNum"> 970 </span> : : struct dt_node *dump_node;</a>
+<a name="971"><span class="lineNum"> 971 </span> : : </a>
+<a name="972"><span class="lineNum"> 972 </span> :<span class="lineCov"> 2 : dump_node = dt_find_by_path(opal_node, &quot;dump&quot;);</span></a>
+<a name="973"><span class="lineNum"> 973 </span> :<span class="lineCov"> 2 : if (!dump_node)</span></a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="975"><span class="lineNum"> 975 </span> : : </a>
+<a name="976"><span class="lineNum"> 976 </span> : : /* Check boot params to detect MPIPL boot or not */</a>
+<a name="977"><span class="lineNum"> 977 </span> :<span class="lineNoCov"> 0 : if (p-&gt;cec_ipl_maj_type != IPLPARAMS_MAJ_TYPE_REIPL)</span></a>
+<a name="978"><span class="lineNum"> 978 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="979"><span class="lineNum"> 979 </span> : : </a>
+<a name="980"><span class="lineNum"> 980 </span> : : /*</a>
+<a name="981"><span class="lineNum"> 981 </span> : : * On FSP system we get minor type as post dump IPL and on BMC system</a>
+<a name="982"><span class="lineNum"> 982 </span> : : * we get platform reboot. Hence lets check for both values.</a>
+<a name="983"><span class="lineNum"> 983 </span> : : */</a>
+<a name="984"><span class="lineNum"> 984 </span> :<span class="lineNoCov"> 0 : if (p-&gt;cec_ipl_min_type != IPLPARAMS_MIN_TYPE_POST_DUMP &amp;&amp;</span></a>
+<a name="985"><span class="lineNum"> 985 </span> :<span class="lineNoCov"> 0 : p-&gt;cec_ipl_min_type != IPLPARAMS_MIN_TYPE_PLAT_REBOOT) {</span></a>
+<a name="986"><span class="lineNum"> 986 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;DUMP: Non MPIPL reboot &quot;</span></a>
+<a name="987"><span class="lineNum"> 987 </span> : : &quot;[minor type = 0x%x]\n&quot;, p-&gt;cec_ipl_min_type);</a>
+<a name="988"><span class="lineNum"> 988 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="989"><span class="lineNum"> 989 </span> : : }</a>
+<a name="990"><span class="lineNum"> 990 </span> : : </a>
+<a name="991"><span class="lineNum"> 991 </span> :<span class="lineNoCov"> 0 : if (be16_to_cpu(p-&gt;cec_ipl_attrib) != IPLPARAMS_ATTRIB_MEM_PRESERVE) {</span></a>
+<a name="992"><span class="lineNum"> 992 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;DUMP: Memory not preserved\n&quot;);</span></a>
+<a name="993"><span class="lineNum"> 993 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="994"><span class="lineNum"> 994 </span> : : }</a>
+<a name="995"><span class="lineNum"> 995 </span> : : </a>
+<a name="996"><span class="lineNum"> 996 </span> :<span class="lineNoCov"> 0 : if (mdrt_cnt == 0 || mdrt_cnt &gt;= mdrt_max_cnt) {</span></a>
+<a name="997"><span class="lineNum"> 997 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;DUMP: Invalid MDRT count : %x\n&quot;, mdrt_cnt);</span></a>
+<a name="998"><span class="lineNum"> 998 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="999"><span class="lineNum"> 999 </span> : : }</a>
+<a name="1000"><span class="lineNum"> 1000 </span> : : </a>
+<a name="1001"><span class="lineNum"> 1001 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;DUMP: Dump found, MDRT count = 0x%x\n&quot;, mdrt_cnt);</span></a>
+<a name="1002"><span class="lineNum"> 1002 </span> : : </a>
+<a name="1003"><span class="lineNum"> 1003 </span> :<span class="lineNoCov"> 0 : dt_add_property(dump_node, &quot;mpipl-boot&quot;, NULL, 0);</span></a>
+<a name="1004"><span class="lineNum"> 1004 </span> : : }</a>
+<a name="1005"><span class="lineNum"> 1005 </span> : : </a>
+<a name="1006"><span class="lineNum"> 1006 </span> :<span class="lineNoCov"> 0 : static void add_opal_dump_node(void)</span></a>
+<a name="1007"><span class="lineNum"> 1007 </span> : : {</a>
+<a name="1008"><span class="lineNum"> 1008 </span> : : __be64 fw_load_area[4];</a>
+<a name="1009"><span class="lineNum"> 1009 </span> : : struct dt_node *node;</a>
+<a name="1010"><span class="lineNum"> 1010 </span> : : </a>
+<a name="1011"><span class="lineNum"> 1011 </span> :<span class="lineNoCov"> 0 : opal_node = dt_new_check(dt_root, &quot;ibm,opal&quot;);</span></a>
+<a name="1012"><span class="lineNum"> 1012 </span> :<span class="lineNoCov"> 0 : node = dt_new(opal_node, &quot;dump&quot;);</span></a>
+<a name="1013"><span class="lineNum"> 1013 </span> :<span class="lineNoCov"> 0 : assert(node);</span></a>
+<a name="1014"><span class="lineNum"> 1014 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;compatible&quot;, &quot;ibm,opal-dump&quot;);</span></a>
+<a name="1015"><span class="lineNum"> 1015 </span> : : </a>
+<a name="1016"><span class="lineNum"> 1016 </span> :<span class="lineNoCov"> 0 : fw_load_area[0] = cpu_to_be64((u64)KERNEL_LOAD_BASE);</span></a>
+<a name="1017"><span class="lineNum"> 1017 </span> :<span class="lineNoCov"> 0 : fw_load_area[1] = cpu_to_be64(KERNEL_LOAD_SIZE);</span></a>
+<a name="1018"><span class="lineNum"> 1018 </span> :<span class="lineNoCov"> 0 : fw_load_area[2] = cpu_to_be64((u64)INITRAMFS_LOAD_BASE);</span></a>
+<a name="1019"><span class="lineNum"> 1019 </span> :<span class="lineNoCov"> 0 : fw_load_area[3] = cpu_to_be64(INITRAMFS_LOAD_SIZE);</span></a>
+<a name="1020"><span class="lineNum"> 1020 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;fw-load-area&quot;, fw_load_area, sizeof(fw_load_area));</span></a>
+<a name="1021"><span class="lineNum"> 1021 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="1022"><span class="lineNum"> 1022 </span> : : </a>
+<a name="1023"><span class="lineNum"> 1023 </span> :<span class="lineCov"> 2 : static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)</span></a>
+<a name="1024"><span class="lineNum"> 1024 </span> : : {</a>
+<a name="1025"><span class="lineNum"> 1025 </span> : : const struct iplparams_sysparams *p;</a>
+<a name="1026"><span class="lineNum"> 1026 </span> :<span class="lineCov"> 2 : const struct HDIF_common_hdr *hdif = iplp;</span></a>
+<a name="1027"><span class="lineNum"> 1027 </span> :<span class="lineCov"> 2 : u16 version = be16_to_cpu(hdif-&gt;version);</span></a>
+<a name="1028"><span class="lineNum"> 1028 </span> :<span class="lineCov"> 2 : const char *vendor = NULL;</span></a>
+<a name="1029"><span class="lineNum"> 1029 </span> : : u32 sys_attributes;</a>
+<a name="1030"><span class="lineNum"> 1030 </span> : : u64 bus_speed;</a>
+<a name="1031"><span class="lineNum"> 1031 </span> : : </a>
+<a name="1032"><span class="lineNum"> 1032 </span> :<span class="lineCov"> 2 : p = HDIF_get_idata(iplp, IPLPARAMS_SYSPARAMS, NULL);</span></a>
+<a name="1033"><span class="lineNum"> 1033 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(p)) {</span></a>
+<a name="1034"><span class="lineNum"> 1034 </span> :<span class="lineNoCov"> 0 : prerror(&quot;IPLPARAMS: No SYS Parameters\n&quot;);</span></a>
+<a name="1035"><span class="lineNum"> 1035 </span> : : /* Create a generic compatible property */</a>
+<a name="1036"><span class="lineNum"> 1036 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dt_root, &quot;compatible&quot;, &quot;ibm,powernv&quot;);</span></a>
+<a name="1037"><span class="lineNum"> 1037 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1038"><span class="lineNum"> 1038 </span> : : }</a>
+<a name="1039"><span class="lineNum"> 1039 </span> : : </a>
+<a name="1040"><span class="lineNum"> 1040 </span> :<span class="lineCov"> 2 : node = dt_new(node, &quot;sys-params&quot;);</span></a>
+<a name="1041"><span class="lineNum"> 1041 </span> :<span class="lineCov"> 2 : assert(node);</span></a>
+<a name="1042"><span class="lineNum"> 1042 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;#address-cells&quot;, 0);</span></a>
+<a name="1043"><span class="lineNum"> 1043 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="1044"><span class="lineNum"> 1044 </span> : : </a>
+<a name="1045"><span class="lineNum"> 1045 </span> :<span class="lineCov"> 2 : dt_add_property_nstr(node, &quot;ibm,sys-model&quot;, p-&gt;sys_model, 4);</span></a>
+<a name="1046"><span class="lineNum"> 1046 </span> : : </a>
+<a name="1047"><span class="lineNum"> 1047 </span> : : /*</a>
+<a name="1048"><span class="lineNum"> 1048 </span> : : * Compatible has up to three entries:</a>
+<a name="1049"><span class="lineNum"> 1049 </span> : : * &quot;ibm,powernv&quot;, the system family and system type.</a>
+<a name="1050"><span class="lineNum"> 1050 </span> : : *</a>
+<a name="1051"><span class="lineNum"> 1051 </span> : : * On P9 and above the family and type strings come from the HDAT</a>
+<a name="1052"><span class="lineNum"> 1052 </span> : : * directly. On P8 we find it from the system ID numbers.</a>
+<a name="1053"><span class="lineNum"> 1053 </span> : : */</a>
+<a name="1054"><span class="lineNum"> 1054 </span> :<span class="lineCov"> 2 : if (proc_gen &gt;= proc_gen_p9) {</span></a>
+<a name="1055"><span class="lineNum"> 1055 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(dt_root, &quot;compatible&quot;, &quot;ibm,powernv&quot;,</span></a>
+<a name="1056"><span class="lineNum"> 1056 </span> : : p-&gt;sys_family_str, p-&gt;sys_type_str);</a>
+<a name="1057"><span class="lineNum"> 1057 </span> : : </a>
+<a name="1058"><span class="lineNum"> 1058 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;IPLPARAMS: v0x70 Platform family/type: %s/%s\n&quot;,</span></a>
+<a name="1059"><span class="lineNum"> 1059 </span> : : p-&gt;sys_family_str, p-&gt;sys_type_str);</a>
+<a name="1060"><span class="lineNum"> 1060 </span> : : } else {</a>
+<a name="1061"><span class="lineNum"> 1061 </span> :<span class="lineCov"> 2 : u32 sys_type = be32_to_cpu(p-&gt;system_type);</span></a>
+<a name="1062"><span class="lineNum"> 1062 </span> : : const char *sys_family;</a>
+<a name="1063"><span class="lineNum"> 1063 </span> : : </a>
+<a name="1064"><span class="lineNum"> 1064 </span> :<span class="lineCov"> 2 : switch (sys_type &gt;&gt; 28) {</span></a>
+<a name="1065"><span class="lineNum"> 1065 </span> :<span class="lineNoCov"> 0 : case 0:</span></a>
+<a name="1066"><span class="lineNum"> 1066 </span> :<span class="lineNoCov"> 0 : sys_family = &quot;ibm,squadrons&quot;;</span></a>
+<a name="1067"><span class="lineNum"> 1067 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1068"><span class="lineNum"> 1068 </span> :<span class="lineNoCov"> 0 : case 1:</span></a>
+<a name="1069"><span class="lineNum"> 1069 </span> :<span class="lineNoCov"> 0 : sys_family = &quot;ibm,eclipz&quot;;</span></a>
+<a name="1070"><span class="lineNum"> 1070 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1071"><span class="lineNum"> 1071 </span> :<span class="lineNoCov"> 0 : case 2:</span></a>
+<a name="1072"><span class="lineNum"> 1072 </span> :<span class="lineNoCov"> 0 : sys_family = &quot;ibm,apollo&quot;;</span></a>
+<a name="1073"><span class="lineNum"> 1073 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1074"><span class="lineNum"> 1074 </span> :<span class="lineCov"> 2 : case 3:</span></a>
+<a name="1075"><span class="lineNum"> 1075 </span> :<span class="lineCov"> 2 : sys_family = &quot;ibm,firenze&quot;;</span></a>
+<a name="1076"><span class="lineNum"> 1076 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="1077"><span class="lineNum"> 1077 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="1078"><span class="lineNum"> 1078 </span> :<span class="lineNoCov"> 0 : sys_family = NULL;</span></a>
+<a name="1079"><span class="lineNum"> 1079 </span> :<span class="lineNoCov"> 0 : prerror(&quot;IPLPARAMS: Unknown system family\n&quot;);</span></a>
+<a name="1080"><span class="lineNum"> 1080 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1081"><span class="lineNum"> 1081 </span> : : }</a>
+<a name="1082"><span class="lineNum"> 1082 </span> : : </a>
+<a name="1083"><span class="lineNum"> 1083 </span> :<span class="lineCov"> 2 : dt_add_property_strings(dt_root, &quot;compatible&quot;, &quot;ibm,powernv&quot;,</span></a>
+<a name="1084"><span class="lineNum"> 1084 </span> : : sys_family);</a>
+<a name="1085"><span class="lineNum"> 1085 </span> :<span class="lineCov"> 2 : prlog(PR_INFO,</span></a>
+<a name="1086"><span class="lineNum"> 1086 </span> : : &quot;IPLPARAMS: Legacy platform family: %s&quot;</a>
+<a name="1087"><span class="lineNum"> 1087 </span> : : &quot; (sys_type=0x%08x)\n&quot;, sys_family, sys_type);</a>
+<a name="1088"><span class="lineNum"> 1088 </span> : : }</a>
+<a name="1089"><span class="lineNum"> 1089 </span> : : </a>
+<a name="1090"><span class="lineNum"> 1090 </span> : : /* Grab nest frequency when available */</a>
+<a name="1091"><span class="lineNum"> 1091 </span> :<span class="lineCov"> 2 : if (version &gt;= 0x005b) {</span></a>
+<a name="1092"><span class="lineNum"> 1092 </span> :<span class="lineCov"> 2 : u64 freq = be32_to_cpu(p-&gt;nest_freq_mhz);</span></a>
+<a name="1093"><span class="lineNum"> 1093 </span> : : </a>
+<a name="1094"><span class="lineNum"> 1094 </span> :<span class="lineCov"> 2 : freq *= 1000000;</span></a>
+<a name="1095"><span class="lineNum"> 1095 </span> :<span class="lineCov"> 2 : dt_add_property_u64(dt_root, &quot;nest-frequency&quot;, freq);</span></a>
+<a name="1096"><span class="lineNum"> 1096 </span> : : }</a>
+<a name="1097"><span class="lineNum"> 1097 </span> : : </a>
+<a name="1098"><span class="lineNum"> 1098 </span> : : /* Grab ABC bus speed */</a>
+<a name="1099"><span class="lineNum"> 1099 </span> :<span class="lineCov"> 2 : bus_speed = be32_to_cpu(p-&gt;abc_bus_speed);</span></a>
+<a name="1100"><span class="lineNum"> 1100 </span> :<span class="lineCov"> 2 : if (bus_speed)</span></a>
+<a name="1101"><span class="lineNum"> 1101 </span> :<span class="lineCov"> 2 : dt_add_property_u64(node, &quot;abc-bus-freq-mhz&quot;, bus_speed);</span></a>
+<a name="1102"><span class="lineNum"> 1102 </span> : : </a>
+<a name="1103"><span class="lineNum"> 1103 </span> : : /* Grab WXYZ bus speed */</a>
+<a name="1104"><span class="lineNum"> 1104 </span> :<span class="lineCov"> 2 : bus_speed = be32_to_cpu(p-&gt;wxyz_bus_speed);</span></a>
+<a name="1105"><span class="lineNum"> 1105 </span> :<span class="lineCov"> 2 : if (bus_speed)</span></a>
+<a name="1106"><span class="lineNum"> 1106 </span> :<span class="lineCov"> 2 : dt_add_property_u64(node, &quot;wxyz-bus-freq-mhz&quot;, bus_speed);</span></a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : </a>
+<a name="1108"><span class="lineNum"> 1108 </span> :<span class="lineCov"> 2 : if (version &gt;= 0x5f)</span></a>
+<a name="1109"><span class="lineNum"> 1109 </span> :<span class="lineCov"> 1 : vendor = p-&gt;sys_vendor;</span></a>
+<a name="1110"><span class="lineNum"> 1110 </span> : : </a>
+<a name="1111"><span class="lineNum"> 1111 </span> : : /* Workaround a bug where we have NULL vendor */</a>
+<a name="1112"><span class="lineNum"> 1112 </span> :<span class="lineCov"> 2 : if (!vendor || vendor[0] == '\0')</span></a>
+<a name="1113"><span class="lineNum"> 1113 </span> :<span class="lineCov"> 2 : vendor = &quot;IBM&quot;;</span></a>
+<a name="1114"><span class="lineNum"> 1114 </span> : : </a>
+<a name="1115"><span class="lineNum"> 1115 </span> :<span class="lineCov"> 2 : dt_add_property_string(dt_root, &quot;vendor&quot;, vendor);</span></a>
+<a name="1116"><span class="lineNum"> 1116 </span> : : </a>
+<a name="1117"><span class="lineNum"> 1117 </span> :<span class="lineCov"> 2 : sys_attributes = be32_to_cpu(p-&gt;sys_attributes);</span></a>
+<a name="1118"><span class="lineNum"> 1118 </span> :<span class="lineCov"> 2 : if (sys_attributes &amp; SYS_ATTR_RISK_LEVEL)</span></a>
+<a name="1119"><span class="lineNum"> 1119 </span> :<span class="lineNoCov"> 0 : dt_add_property(node, &quot;elevated-risk-level&quot;, NULL, 0);</span></a>
+<a name="1120"><span class="lineNum"> 1120 </span> : : </a>
+<a name="1121"><span class="lineNum"> 1121 </span> : : /* Populate OPAL dump node */</a>
+<a name="1122"><span class="lineNum"> 1122 </span> :<span class="lineCov"> 2 : if (sys_attributes &amp; SYS_ATTR_MPIPL_SUPPORTED)</span></a>
+<a name="1123"><span class="lineNum"> 1123 </span> :<span class="lineNoCov"> 0 : add_opal_dump_node();</span></a>
+<a name="1124"><span class="lineNum"> 1124 </span> : : </a>
+<a name="1125"><span class="lineNum"> 1125 </span> :<span class="lineCov"> 2 : if (version &gt;= 0x60 &amp;&amp; proc_gen &gt;= proc_gen_p9)</span></a>
+<a name="1126"><span class="lineNum"> 1126 </span> :<span class="lineNoCov"> 0 : dt_init_secureboot_node(p);</span></a>
+<a name="1127"><span class="lineNum"> 1127 </span> : : }</a>
+<a name="1128"><span class="lineNum"> 1128 </span> : : </a>
+<a name="1129"><span class="lineNum"> 1129 </span> :<span class="lineCov"> 2 : static void add_iplparams_ipl_params(const void *iplp, struct dt_node *node)</span></a>
+<a name="1130"><span class="lineNum"> 1130 </span> : : {</a>
+<a name="1131"><span class="lineNum"> 1131 </span> : : const struct iplparams_iplparams *p;</a>
+<a name="1132"><span class="lineNum"> 1132 </span> : : struct dt_node *led_node;</a>
+<a name="1133"><span class="lineNum"> 1133 </span> : : </a>
+<a name="1134"><span class="lineNum"> 1134 </span> :<span class="lineCov"> 2 : p = HDIF_get_idata(iplp, IPLPARAMS_IPLPARAMS, NULL);</span></a>
+<a name="1135"><span class="lineNum"> 1135 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(p)) {</span></a>
+<a name="1136"><span class="lineNum"> 1136 </span> :<span class="lineNoCov"> 0 : prerror(&quot;IPLPARAMS: No IPL Parameters\n&quot;);</span></a>
+<a name="1137"><span class="lineNum"> 1137 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1138"><span class="lineNum"> 1138 </span> : : }</a>
+<a name="1139"><span class="lineNum"> 1139 </span> : : </a>
+<a name="1140"><span class="lineNum"> 1140 </span> :<span class="lineCov"> 2 : node = dt_new(node, &quot;ipl-params&quot;);</span></a>
+<a name="1141"><span class="lineNum"> 1141 </span> :<span class="lineCov"> 2 : assert(node);</span></a>
+<a name="1142"><span class="lineNum"> 1142 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;#address-cells&quot;, 0);</span></a>
+<a name="1143"><span class="lineNum"> 1143 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="1144"><span class="lineNum"> 1144 </span> : : </a>
+<a name="1145"><span class="lineNum"> 1145 </span> : : /* On an ASM initiated factory reset, this bit will be set</a>
+<a name="1146"><span class="lineNum"> 1146 </span> : : * and the FSP expects the firmware to reset the PCI bus</a>
+<a name="1147"><span class="lineNum"> 1147 </span> : : * numbers and respond with a Power Down (CE,4D,02) message</a>
+<a name="1148"><span class="lineNum"> 1148 </span> : : */</a>
+<a name="1149"><span class="lineNum"> 1149 </span> :<span class="lineCov"> 2 : if (be32_to_cpu(p-&gt;other_attrib) &amp; IPLPARAMS_OATTR_RST_PCI_BUSNO)</span></a>
+<a name="1150"><span class="lineNum"> 1150 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;pci-busno-reset-ipl&quot;, 1);</span></a>
+<a name="1151"><span class="lineNum"> 1151 </span> :<span class="lineCov"> 2 : dt_add_property_strings(node, &quot;cec-ipl-side&quot;,</span></a>
+<a name="1152"><span class="lineNum"> 1152 </span> : : (p-&gt;ipl_side &amp; IPLPARAMS_CEC_FW_IPL_SIDE_TEMP) ?</a>
+<a name="1153"><span class="lineNum"> 1153 </span> : : &quot;temp&quot; : &quot;perm&quot;);</a>
+<a name="1154"><span class="lineNum"> 1154 </span> :<span class="lineCov"> 2 : if (proc_gen &gt;= proc_gen_p9) {</span></a>
+<a name="1155"><span class="lineNum"> 1155 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;sp-ipl-side&quot;,</span></a>
+<a name="1156"><span class="lineNum"> 1156 </span> : : (p-&gt;ipl_side &amp; IPLPARAMS_FSP_FW_IPL_SIDE_TEMP) ?</a>
+<a name="1157"><span class="lineNum"> 1157 </span> : : &quot;temp&quot; : &quot;perm&quot;);</a>
+<a name="1158"><span class="lineNum"> 1158 </span> : : } else {</a>
+<a name="1159"><span class="lineNum"> 1159 </span> :<span class="lineCov"> 2 : dt_add_property_strings(node, &quot;fsp-ipl-side&quot;,</span></a>
+<a name="1160"><span class="lineNum"> 1160 </span> : : (p-&gt;ipl_side &amp; IPLPARAMS_FSP_FW_IPL_SIDE_TEMP) ?</a>
+<a name="1161"><span class="lineNum"> 1161 </span> : : &quot;temp&quot; : &quot;perm&quot;);</a>
+<a name="1162"><span class="lineNum"> 1162 </span> : : }</a>
+<a name="1163"><span class="lineNum"> 1163 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;os-ipl-mode&quot;, p-&gt;os_ipl_mode);</span></a>
+<a name="1164"><span class="lineNum"> 1164 </span> :<span class="lineCov"> 2 : dt_add_property_strings(node, &quot;cec-major-type&quot;,</span></a>
+<a name="1165"><span class="lineNum"> 1165 </span> : : p-&gt;cec_ipl_maj_type ? &quot;hot&quot; : &quot;cold&quot;);</a>
+<a name="1166"><span class="lineNum"> 1166 </span> : : </a>
+<a name="1167"><span class="lineNum"> 1167 </span> : : /* Add LED type info under '/ibm,opal/led' node */</a>
+<a name="1168"><span class="lineNum"> 1168 </span> :<span class="lineCov"> 2 : led_node = dt_find_by_path(opal_node, DT_PROPERTY_LED_NODE);</span></a>
+<a name="1169"><span class="lineNum"> 1169 </span> :<span class="lineCov"> 2 : assert(led_node);</span></a>
+<a name="1170"><span class="lineNum"> 1170 </span> : : </a>
+<a name="1171"><span class="lineNum"> 1171 </span> :<span class="lineCov"> 2 : if (be32_to_cpu(p-&gt;other_attrib) &amp; IPLPARAMS_OATRR_LIGHT_PATH)</span></a>
+<a name="1172"><span class="lineNum"> 1172 </span> :<span class="lineCov"> 2 : dt_add_property_strings(led_node, DT_PROPERTY_LED_MODE,</span></a>
+<a name="1173"><span class="lineNum"> 1173 </span> : : LED_MODE_LIGHT_PATH);</a>
+<a name="1174"><span class="lineNum"> 1174 </span> : : else</a>
+<a name="1175"><span class="lineNum"> 1175 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(led_node, DT_PROPERTY_LED_MODE,</span></a>
+<a name="1176"><span class="lineNum"> 1176 </span> : : LED_MODE_GUIDING_LIGHT);</a>
+<a name="1177"><span class="lineNum"> 1177 </span> : : </a>
+<a name="1178"><span class="lineNum"> 1178 </span> : : /* Populate opal dump result table */</a>
+<a name="1179"><span class="lineNum"> 1179 </span> :<span class="lineCov"> 2 : opal_dump_add_mpipl_boot(p);</span></a>
+<a name="1180"><span class="lineNum"> 1180 </span> : : }</a>
+<a name="1181"><span class="lineNum"> 1181 </span> : : </a>
+<a name="1182"><span class="lineNum"> 1182 </span> :<span class="lineCov"> 2 : static void add_iplparams_serials(const void *iplp, struct dt_node *node)</span></a>
+<a name="1183"><span class="lineNum"> 1183 </span> : : {</a>
+<a name="1184"><span class="lineNum"> 1184 </span> : : const struct iplparms_serial *ipser;</a>
+<a name="1185"><span class="lineNum"> 1185 </span> : : struct dt_node *ser_node;</a>
+<a name="1186"><span class="lineNum"> 1186 </span> : : int count, i;</a>
+<a name="1187"><span class="lineNum"> 1187 </span> : : </a>
+<a name="1188"><span class="lineNum"> 1188 </span> :<span class="lineCov"> 2 : count = HDIF_get_iarray_size(iplp, IPLPARMS_IDATA_SERIAL);</span></a>
+<a name="1189"><span class="lineNum"> 1189 </span> :<span class="lineCov"> 2 : if (count &lt;= 0)</span></a>
+<a name="1190"><span class="lineNum"> 1190 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1191"><span class="lineNum"> 1191 </span> :<span class="lineCov"> 2 : prlog(PR_INFO, &quot;IPLPARAMS: %d serial ports in array\n&quot;, count);</span></a>
+<a name="1192"><span class="lineNum"> 1192 </span> : : </a>
+<a name="1193"><span class="lineNum"> 1193 </span> :<span class="lineCov"> 2 : node = dt_new(node, &quot;fsp-serial&quot;);</span></a>
+<a name="1194"><span class="lineNum"> 1194 </span> :<span class="lineCov"> 2 : assert(node);</span></a>
+<a name="1195"><span class="lineNum"> 1195 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;#address-cells&quot;, 1);</span></a>
+<a name="1196"><span class="lineNum"> 1196 </span> :<span class="lineCov"> 2 : dt_add_property_cells(node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="1197"><span class="lineNum"> 1197 </span> : : </a>
+<a name="1198"><span class="lineNum"> 1198 </span> :<span class="lineCov"> 4 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="1199"><span class="lineNum"> 1199 </span> : : u16 rsrc_id;</a>
+<a name="1200"><span class="lineNum"> 1200 </span> :<span class="lineCov"> 2 : ipser = HDIF_get_iarray_item(iplp, IPLPARMS_IDATA_SERIAL,</span></a>
+<a name="1201"><span class="lineNum"> 1201 </span> : : i, NULL);</a>
+<a name="1202"><span class="lineNum"> 1202 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(ipser))</span></a>
+<a name="1203"><span class="lineNum"> 1203 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1204"><span class="lineNum"> 1204 </span> :<span class="lineCov"> 2 : rsrc_id = be16_to_cpu(ipser-&gt;rsrc_id);</span></a>
+<a name="1205"><span class="lineNum"> 1205 </span> :<span class="lineCov"> 2 : prlog(PR_INFO, &quot;IPLPARAMS: Serial %d rsrc: %04x loc: %s\n&quot;,</span></a>
+<a name="1206"><span class="lineNum"> 1206 </span> : : i, rsrc_id, ipser-&gt;loc_code);</a>
+<a name="1207"><span class="lineNum"> 1207 </span> :<span class="lineCov"> 2 : ser_node = dt_new_addr(node, &quot;serial&quot;, rsrc_id);</span></a>
+<a name="1208"><span class="lineNum"> 1208 </span> :<span class="lineCov"> 2 : if (!ser_node)</span></a>
+<a name="1209"><span class="lineNum"> 1209 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1210"><span class="lineNum"> 1210 </span> : : </a>
+<a name="1211"><span class="lineNum"> 1211 </span> :<span class="lineCov"> 2 : dt_add_property_cells(ser_node, &quot;reg&quot;, rsrc_id);</span></a>
+<a name="1212"><span class="lineNum"> 1212 </span> :<span class="lineCov"> 2 : dt_add_property_nstr(ser_node, &quot;ibm,loc-code&quot;,</span></a>
+<a name="1213"><span class="lineNum"> 1213 </span> :<span class="lineCov"> 2 : ipser-&gt;loc_code, LOC_CODE_SIZE);</span></a>
+<a name="1214"><span class="lineNum"> 1214 </span> :<span class="lineCov"> 2 : dt_add_property_string(ser_node, &quot;compatible&quot;,</span></a>
+<a name="1215"><span class="lineNum"> 1215 </span> : : &quot;ibm,fsp-serial&quot;);</a>
+<a name="1216"><span class="lineNum"> 1216 </span> : : /* XXX handle CALLHOME flag ? */</a>
+<a name="1217"><span class="lineNum"> 1217 </span> : : }</a>
+<a name="1218"><span class="lineNum"> 1218 </span> : : }</a>
+<a name="1219"><span class="lineNum"> 1219 </span> : : </a>
+<a name="1220"><span class="lineNum"> 1220 </span> : : /*</a>
+<a name="1221"><span class="lineNum"> 1221 </span> : : * Check for platform dump, if present populate DT</a>
+<a name="1222"><span class="lineNum"> 1222 </span> : : */</a>
+<a name="1223"><span class="lineNum"> 1223 </span> :<span class="lineCov"> 2 : static void add_iplparams_platform_dump(const void *iplp, struct dt_node *node)</span></a>
+<a name="1224"><span class="lineNum"> 1224 </span> : : {</a>
+<a name="1225"><span class="lineNum"> 1225 </span> : : const struct iplparams_dump *ipl_dump;</a>
+<a name="1226"><span class="lineNum"> 1226 </span> : : </a>
+<a name="1227"><span class="lineNum"> 1227 </span> :<span class="lineCov"> 2 : ipl_dump = HDIF_get_idata(iplp, IPLPARAMS_PLATFORM_DUMP, NULL);</span></a>
+<a name="1228"><span class="lineNum"> 1228 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(ipl_dump))</span></a>
+<a name="1229"><span class="lineNum"> 1229 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1230"><span class="lineNum"> 1230 </span> : : </a>
+<a name="1231"><span class="lineNum"> 1231 </span> :<span class="lineCov"> 2 : node = dt_new(node, &quot;platform-dump&quot;);</span></a>
+<a name="1232"><span class="lineNum"> 1232 </span> :<span class="lineCov"> 2 : assert(node);</span></a>
+<a name="1233"><span class="lineNum"> 1233 </span> : : </a>
+<a name="1234"><span class="lineNum"> 1234 </span> :<span class="lineCov"> 2 : if (be32_to_cpu(ipl_dump-&gt;dump_id)) {</span></a>
+<a name="1235"><span class="lineNum"> 1235 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;dump-id&quot;,</span></a>
+<a name="1236"><span class="lineNum"> 1236 </span> : : be32_to_cpu(ipl_dump-&gt;dump_id));</a>
+<a name="1237"><span class="lineNum"> 1237 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64(node, &quot;total-size&quot;,</span></a>
+<a name="1238"><span class="lineNum"> 1238 </span> : : be64_to_cpu(ipl_dump-&gt;act_dump_sz));</a>
+<a name="1239"><span class="lineNum"> 1239 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64(node, &quot;hw-dump-size&quot;,</span></a>
+<a name="1240"><span class="lineNum"> 1240 </span> :<span class="lineNoCov"> 0 : be32_to_cpu(ipl_dump-&gt;act_hw_dump_sz));</span></a>
+<a name="1241"><span class="lineNum"> 1241 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;plog-id&quot;,</span></a>
+<a name="1242"><span class="lineNum"> 1242 </span> : : be32_to_cpu(ipl_dump-&gt;plid));</a>
+<a name="1243"><span class="lineNum"> 1243 </span> : : }</a>
+<a name="1244"><span class="lineNum"> 1244 </span> : : }</a>
+<a name="1245"><span class="lineNum"> 1245 </span> : : </a>
+<a name="1246"><span class="lineNum"> 1246 </span> :<span class="lineCov"> 2 : static void add_iplparams_features(const struct HDIF_common_hdr *iplp)</span></a>
+<a name="1247"><span class="lineNum"> 1247 </span> : : {</a>
+<a name="1248"><span class="lineNum"> 1248 </span> : : const struct iplparams_feature *feature;</a>
+<a name="1249"><span class="lineNum"> 1249 </span> : : const struct HDIF_array_hdr *array;</a>
+<a name="1250"><span class="lineNum"> 1250 </span> : : struct dt_node *fw_features;</a>
+<a name="1251"><span class="lineNum"> 1251 </span> : : unsigned int count, i;</a>
+<a name="1252"><span class="lineNum"> 1252 </span> : : char name[65];</a>
+<a name="1253"><span class="lineNum"> 1253 </span> : : </a>
+<a name="1254"><span class="lineNum"> 1254 </span> :<span class="lineCov"> 2 : array = HDIF_get_iarray(iplp, IPLPARAMS_FEATURES, &amp;count);</span></a>
+<a name="1255"><span class="lineNum"> 1255 </span> :<span class="lineCov"> 2 : if (!array || !count)</span></a>
+<a name="1256"><span class="lineNum"> 1256 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="1257"><span class="lineNum"> 1257 </span> : : </a>
+<a name="1258"><span class="lineNum"> 1258 </span> :<span class="lineNoCov"> 0 : opal_node = dt_new_check(dt_root, &quot;ibm,opal&quot;);</span></a>
+<a name="1259"><span class="lineNum"> 1259 </span> :<span class="lineNoCov"> 0 : fw_features = dt_new(opal_node, &quot;fw-features&quot;);</span></a>
+<a name="1260"><span class="lineNum"> 1260 </span> :<span class="lineNoCov"> 0 : if (!fw_features)</span></a>
+<a name="1261"><span class="lineNum"> 1261 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1262"><span class="lineNum"> 1262 </span> : : </a>
+<a name="1263"><span class="lineNum"> 1263 </span> :<span class="lineNoCov"> 0 : HDIF_iarray_for_each(array, i, feature) {</span></a>
+<a name="1264"><span class="lineNum"> 1264 </span> : : struct dt_node *n;</a>
+<a name="1265"><span class="lineNum"> 1265 </span> : : uint64_t flags;</a>
+<a name="1266"><span class="lineNum"> 1266 </span> : : </a>
+<a name="1267"><span class="lineNum"> 1267 </span> : : /* the name field isn't necessarily null terminated */</a>
+<a name="1268"><span class="lineNum"> 1268 </span> : : BUILD_ASSERT(sizeof(name) &gt; sizeof(feature-&gt;name));</a>
+<a name="1269"><span class="lineNum"> 1269 </span> :<span class="lineNoCov"> 0 : strncpy(name, feature-&gt;name, sizeof(name)-1);</span></a>
+<a name="1270"><span class="lineNum"> 1270 </span> :<span class="lineNoCov"> 0 : name[sizeof(name)-1] = '\0';</span></a>
+<a name="1271"><span class="lineNum"> 1271 </span> :<span class="lineNoCov"> 0 : flags = be64_to_cpu(feature-&gt;flags);</span></a>
+<a name="1272"><span class="lineNum"> 1272 </span> : : </a>
+<a name="1273"><span class="lineNum"> 1273 </span> :<span class="lineNoCov"> 0 : if (strlen(name) == 0) {</span></a>
+<a name="1274"><span class="lineNum"> 1274 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;IPLPARAMS: FW feature name is NULL\n&quot;);</span></a>
+<a name="1275"><span class="lineNum"> 1275 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1276"><span class="lineNum"> 1276 </span> : : }</a>
+<a name="1277"><span class="lineNum"> 1277 </span> : : </a>
+<a name="1278"><span class="lineNum"> 1278 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;IPLPARAMS: FW feature %s = %016&quot;PRIx64&quot;\n&quot;,</span></a>
+<a name="1279"><span class="lineNum"> 1279 </span> : : name, flags);</a>
+<a name="1280"><span class="lineNum"> 1280 </span> : : </a>
+<a name="1281"><span class="lineNum"> 1281 </span> : : /* get rid of tm-suspend-mode-enabled being disabled */</a>
+<a name="1282"><span class="lineNum"> 1282 </span> :<span class="lineNoCov"> 0 : if (strcmp(name, &quot;tm-suspend-mode-enabled&quot;) == 0)</span></a>
+<a name="1283"><span class="lineNum"> 1283 </span> :<span class="lineNoCov"> 0 : strcpy(name, &quot;tm-suspend-mode&quot;);</span></a>
+<a name="1284"><span class="lineNum"> 1284 </span> : : </a>
+<a name="1285"><span class="lineNum"> 1285 </span> :<span class="lineNoCov"> 0 : n = dt_new(fw_features, name);</span></a>
+<a name="1286"><span class="lineNum"> 1286 </span> : : </a>
+<a name="1287"><span class="lineNum"> 1287 </span> : : /*</a>
+<a name="1288"><span class="lineNum"> 1288 </span> : : * This is a bit overkill, but we'll want seperate properties</a>
+<a name="1289"><span class="lineNum"> 1289 </span> : : * for each flag bit(s).</a>
+<a name="1290"><span class="lineNum"> 1290 </span> : : */</a>
+<a name="1291"><span class="lineNum"> 1291 </span> :<span class="lineNoCov"> 0 : if (flags &amp; PPC_BIT(0))</span></a>
+<a name="1292"><span class="lineNum"> 1292 </span> :<span class="lineNoCov"> 0 : dt_add_property(n, &quot;enabled&quot;, NULL, 0);</span></a>
+<a name="1293"><span class="lineNum"> 1293 </span> : : else</a>
+<a name="1294"><span class="lineNum"> 1294 </span> :<span class="lineNoCov"> 0 : dt_add_property(n, &quot;disabled&quot;, NULL, 0);</span></a>
+<a name="1295"><span class="lineNum"> 1295 </span> : : }</a>
+<a name="1296"><span class="lineNum"> 1296 </span> : : }</a>
+<a name="1297"><span class="lineNum"> 1297 </span> : : </a>
+<a name="1298"><span class="lineNum"> 1298 </span> :<span class="lineCov"> 2 : static void add_iplparams(void)</span></a>
+<a name="1299"><span class="lineNum"> 1299 </span> : : {</a>
+<a name="1300"><span class="lineNum"> 1300 </span> : : struct dt_node *iplp_node;</a>
+<a name="1301"><span class="lineNum"> 1301 </span> : : const void *ipl_parms;</a>
+<a name="1302"><span class="lineNum"> 1302 </span> : : </a>
+<a name="1303"><span class="lineNum"> 1303 </span> :<span class="lineCov"> 2 : ipl_parms = get_hdif(&amp;spira.ntuples.ipl_parms, &quot;IPLPMS&quot;);</span></a>
+<a name="1304"><span class="lineNum"> 1304 </span> :<span class="lineCov"> 2 : if (!ipl_parms) {</span></a>
+<a name="1305"><span class="lineNum"> 1305 </span> :<span class="lineNoCov"> 0 : prerror(&quot;IPLPARAMS: Cannot find IPL Parms in SPIRA\n&quot;);</span></a>
+<a name="1306"><span class="lineNum"> 1306 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1307"><span class="lineNum"> 1307 </span> : : }</a>
+<a name="1308"><span class="lineNum"> 1308 </span> : : </a>
+<a name="1309"><span class="lineNum"> 1309 </span> :<span class="lineCov"> 2 : iplp_node = dt_new(dt_root, &quot;ipl-params&quot;);</span></a>
+<a name="1310"><span class="lineNum"> 1310 </span> :<span class="lineCov"> 2 : assert(iplp_node);</span></a>
+<a name="1311"><span class="lineNum"> 1311 </span> :<span class="lineCov"> 2 : dt_add_property_cells(iplp_node, &quot;#address-cells&quot;, 0);</span></a>
+<a name="1312"><span class="lineNum"> 1312 </span> :<span class="lineCov"> 2 : dt_add_property_cells(iplp_node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="1313"><span class="lineNum"> 1313 </span> : : </a>
+<a name="1314"><span class="lineNum"> 1314 </span> :<span class="lineCov"> 2 : add_iplparams_sys_params(ipl_parms, iplp_node);</span></a>
+<a name="1315"><span class="lineNum"> 1315 </span> :<span class="lineCov"> 2 : add_iplparams_ipl_params(ipl_parms, iplp_node);</span></a>
+<a name="1316"><span class="lineNum"> 1316 </span> :<span class="lineCov"> 2 : add_iplparams_serials(ipl_parms, iplp_node);</span></a>
+<a name="1317"><span class="lineNum"> 1317 </span> :<span class="lineCov"> 2 : add_iplparams_platform_dump(ipl_parms, iplp_node);</span></a>
+<a name="1318"><span class="lineNum"> 1318 </span> :<span class="lineCov"> 2 : add_iplparams_features(ipl_parms);</span></a>
+<a name="1319"><span class="lineNum"> 1319 </span> : : }</a>
+<a name="1320"><span class="lineNum"> 1320 </span> : : </a>
+<a name="1321"><span class="lineNum"> 1321 </span> : : /* Various structure contain a &quot;proc_chip_id&quot; which is an arbitrary</a>
+<a name="1322"><span class="lineNum"> 1322 </span> : : * numbering used by HDAT to reference chips, which doesn't correspond</a>
+<a name="1323"><span class="lineNum"> 1323 </span> : : * to the HW IDs. We want to use the HW IDs everywhere in the DT so</a>
+<a name="1324"><span class="lineNum"> 1324 </span> : : * we convert using this.</a>
+<a name="1325"><span class="lineNum"> 1325 </span> : : */</a>
+<a name="1326"><span class="lineNum"> 1326 </span> :<span class="lineCov"> 79 : uint32_t pcid_to_chip_id(uint32_t proc_chip_id)</span></a>
+<a name="1327"><span class="lineNum"> 1327 </span> : : {</a>
+<a name="1328"><span class="lineNum"> 1328 </span> : : unsigned int i;</a>
+<a name="1329"><span class="lineNum"> 1329 </span> : : const void *hdif;</a>
+<a name="1330"><span class="lineNum"> 1330 </span> : : </a>
+<a name="1331"><span class="lineNum"> 1331 </span> : : /* First, try the proc_chip ntuples for chip data */</a>
+<a name="1332"><span class="lineNum"> 1332 </span> :<span class="lineCov"> 150 : for_each_ntuple_idx(&amp;spira.ntuples.proc_chip, hdif, i,</span></a>
+<a name="1333"><span class="lineNum"> 1333 </span> : : SPPCRD_HDIF_SIG) {</a>
+<a name="1334"><span class="lineNum"> 1334 </span> : : const struct sppcrd_chip_info *cinfo;</a>
+<a name="1335"><span class="lineNum"> 1335 </span> : : </a>
+<a name="1336"><span class="lineNum"> 1336 </span> :<span class="lineCov"> 150 : cinfo = HDIF_get_idata(hdif, SPPCRD_IDATA_CHIP_INFO,</span></a>
+<a name="1337"><span class="lineNum"> 1337 </span> : : NULL);</a>
+<a name="1338"><span class="lineNum"> 1338 </span> :<span class="lineCov"> 150 : if (!CHECK_SPPTR(cinfo)) {</span></a>
+<a name="1339"><span class="lineNum"> 1339 </span> :<span class="lineNoCov"> 0 : prerror(&quot;XSCOM: Bad ChipID data %d\n&quot;, i);</span></a>
+<a name="1340"><span class="lineNum"> 1340 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1341"><span class="lineNum"> 1341 </span> : : }</a>
+<a name="1342"><span class="lineNum"> 1342 </span> :<span class="lineCov"> 150 : if (proc_chip_id == be32_to_cpu(cinfo-&gt;proc_chip_id))</span></a>
+<a name="1343"><span class="lineNum"> 1343 </span> :<span class="lineCov"> 79 : return be32_to_cpu(cinfo-&gt;xscom_id);</span></a>
+<a name="1344"><span class="lineNum"> 1344 </span> : : }</a>
+<a name="1345"><span class="lineNum"> 1345 </span> : : </a>
+<a name="1346"><span class="lineNum"> 1346 </span> : : /* Not found, what to do ? Assert ? For now return a number</a>
+<a name="1347"><span class="lineNum"> 1347 </span> : : * guaranteed to not exist</a>
+<a name="1348"><span class="lineNum"> 1348 </span> : : */</a>
+<a name="1349"><span class="lineNum"> 1349 </span> :<span class="lineNoCov"> 0 : return (uint32_t)-1;</span></a>
+<a name="1350"><span class="lineNum"> 1350 </span> : : }</a>
+<a name="1351"><span class="lineNum"> 1351 </span> : : </a>
+<a name="1352"><span class="lineNum"> 1352 </span> : : /* Create '/ibm,opal/led' node */</a>
+<a name="1353"><span class="lineNum"> 1353 </span> :<span class="lineCov"> 2 : static void dt_init_led_node(void)</span></a>
+<a name="1354"><span class="lineNum"> 1354 </span> : : {</a>
+<a name="1355"><span class="lineNum"> 1355 </span> : : struct dt_node *led_node;</a>
+<a name="1356"><span class="lineNum"> 1356 </span> : : </a>
+<a name="1357"><span class="lineNum"> 1357 </span> : : /* Create /ibm,opal node, if its not created already */</a>
+<a name="1358"><span class="lineNum"> 1358 </span> :<span class="lineCov"> 2 : if (!opal_node) {</span></a>
+<a name="1359"><span class="lineNum"> 1359 </span> :<span class="lineCov"> 2 : opal_node = dt_new(dt_root, &quot;ibm,opal&quot;);</span></a>
+<a name="1360"><span class="lineNum"> 1360 </span> :<span class="lineCov"> 2 : assert(opal_node);</span></a>
+<a name="1361"><span class="lineNum"> 1361 </span> : : }</a>
+<a name="1362"><span class="lineNum"> 1362 </span> : : </a>
+<a name="1363"><span class="lineNum"> 1363 </span> : : /* Crete LED parent node */</a>
+<a name="1364"><span class="lineNum"> 1364 </span> :<span class="lineCov"> 2 : led_node = dt_new(opal_node, DT_PROPERTY_LED_NODE);</span></a>
+<a name="1365"><span class="lineNum"> 1365 </span> :<span class="lineCov"> 2 : assert(led_node);</span></a>
+<a name="1366"><span class="lineNum"> 1366 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="1367"><span class="lineNum"> 1367 </span> : : </a>
+<a name="1368"><span class="lineNum"> 1368 </span> :<span class="lineCov"> 2 : static void hostservices_parse(void)</span></a>
+<a name="1369"><span class="lineNum"> 1369 </span> : : {</a>
+<a name="1370"><span class="lineNum"> 1370 </span> : : struct HDIF_common_hdr *hs_hdr;</a>
+<a name="1371"><span class="lineNum"> 1371 </span> : : const void *dt_blob;</a>
+<a name="1372"><span class="lineNum"> 1372 </span> : : unsigned int size;</a>
+<a name="1373"><span class="lineNum"> 1373 </span> : : unsigned int ntuples_size;</a>
+<a name="1374"><span class="lineNum"> 1374 </span> : : </a>
+<a name="1375"><span class="lineNum"> 1375 </span> : : /* Deprecated on P9 */</a>
+<a name="1376"><span class="lineNum"> 1376 </span> :<span class="lineCov"> 2 : if (proc_gen &gt;= proc_gen_p9)</span></a>
+<a name="1377"><span class="lineNum"> 1377 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1378"><span class="lineNum"> 1378 </span> : : </a>
+<a name="1379"><span class="lineNum"> 1379 </span> :<span class="lineCov"> 2 : ntuples_size = sizeof(struct HDIF_array_hdr) + </span></a>
+<a name="1380"><span class="lineNum"> 1380 </span> :<span class="lineCov"> 2 : be32_to_cpu(spira.ntuples.array_hdr.ecnt) *</span></a>
+<a name="1381"><span class="lineNum"> 1381 </span> : : sizeof(struct spira_ntuple);</a>
+<a name="1382"><span class="lineNum"> 1382 </span> : : </a>
+<a name="1383"><span class="lineNum"> 1383 </span> :<span class="lineCov"> 2 : if (offsetof(struct spira_ntuples, hs_data) &gt;= ntuples_size) {</span></a>
+<a name="1384"><span class="lineNum"> 1384 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SPIRA: No host services data found\n&quot;);</span></a>
+<a name="1385"><span class="lineNum"> 1385 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1386"><span class="lineNum"> 1386 </span> : : }</a>
+<a name="1387"><span class="lineNum"> 1387 </span> : : </a>
+<a name="1388"><span class="lineNum"> 1388 </span> :<span class="lineCov"> 2 : hs_hdr = get_hdif(&amp;spira.ntuples.hs_data, HSERV_HDIF_SIG);</span></a>
+<a name="1389"><span class="lineNum"> 1389 </span> :<span class="lineCov"> 2 : if (!hs_hdr) {</span></a>
+<a name="1390"><span class="lineNum"> 1390 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SPIRA: No host services data found\n&quot;);</span></a>
+<a name="1391"><span class="lineNum"> 1391 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1392"><span class="lineNum"> 1392 </span> : : }</a>
+<a name="1393"><span class="lineNum"> 1393 </span> : : </a>
+<a name="1394"><span class="lineNum"> 1394 </span> :<span class="lineCov"> 2 : dt_blob = HDIF_get_idata(hs_hdr, 0, &amp;size);</span></a>
+<a name="1395"><span class="lineNum"> 1395 </span> :<span class="lineCov"> 2 : if (!dt_blob) {</span></a>
+<a name="1396"><span class="lineNum"> 1396 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SPIRA: No host services idata found\n&quot;);</span></a>
+<a name="1397"><span class="lineNum"> 1397 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1398"><span class="lineNum"> 1398 </span> : : }</a>
+<a name="1399"><span class="lineNum"> 1399 </span> :<span class="lineCov"> 2 : hservices_from_hdat(dt_blob, size);</span></a>
+<a name="1400"><span class="lineNum"> 1400 </span> : : }</a>
+<a name="1401"><span class="lineNum"> 1401 </span> : : </a>
+<a name="1402"><span class="lineNum"> 1402 </span> :<span class="lineCov"> 2 : static void add_stop_levels(void)</span></a>
+<a name="1403"><span class="lineNum"> 1403 </span> : : {</a>
+<a name="1404"><span class="lineNum"> 1404 </span> :<span class="lineCov"> 2 : struct spira_ntuple *t = &amp;spira.ntuples.proc_chip;</span></a>
+<a name="1405"><span class="lineNum"> 1405 </span> : : struct HDIF_common_hdr *hdif;</a>
+<a name="1406"><span class="lineNum"> 1406 </span> :<span class="lineCov"> 2 : u32 stop_levels = ~0;</span></a>
+<a name="1407"><span class="lineNum"> 1407 </span> :<span class="lineCov"> 2 : bool valid = false;</span></a>
+<a name="1408"><span class="lineNum"> 1408 </span> : : int i;</a>
+<a name="1409"><span class="lineNum"> 1409 </span> : : </a>
+<a name="1410"><span class="lineNum"> 1410 </span> :<span class="lineCov"> 2 : if (proc_gen &lt; proc_gen_p9)</span></a>
+<a name="1411"><span class="lineNum"> 1411 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="1412"><span class="lineNum"> 1412 </span> : : </a>
+<a name="1413"><span class="lineNum"> 1413 </span> : : /*</a>
+<a name="1414"><span class="lineNum"> 1414 </span> : : * OPAL only exports a single set of flags to indicate the supported</a>
+<a name="1415"><span class="lineNum"> 1415 </span> : : * STOP modes while the HDAT descibes the support top levels *per chip*</a>
+<a name="1416"><span class="lineNum"> 1416 </span> : : * We parse the list of chips to find a common set of STOP levels to</a>
+<a name="1417"><span class="lineNum"> 1417 </span> : : * export.</a>
+<a name="1418"><span class="lineNum"> 1418 </span> : : */</a>
+<a name="1419"><span class="lineNum"> 1419 </span> :<span class="lineNoCov"> 0 : for_each_ntuple_idx(t, hdif, i, SPPCRD_HDIF_SIG) {</span></a>
+<a name="1420"><span class="lineNum"> 1420 </span> : : unsigned int size;</a>
+<a name="1421"><span class="lineNum"> 1421 </span> : : const struct sppcrd_chip_info *cinfo =</a>
+<a name="1422"><span class="lineNum"> 1422 </span> :<span class="lineNoCov"> 0 : HDIF_get_idata(hdif, SPPCRD_IDATA_CHIP_INFO, &amp;size);</span></a>
+<a name="1423"><span class="lineNum"> 1423 </span> : : u32 ve, chip_levels;</a>
+<a name="1424"><span class="lineNum"> 1424 </span> : : </a>
+<a name="1425"><span class="lineNum"> 1425 </span> :<span class="lineNoCov"> 0 : if (!cinfo)</span></a>
+<a name="1426"><span class="lineNum"> 1426 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1427"><span class="lineNum"> 1427 </span> : : </a>
+<a name="1428"><span class="lineNum"> 1428 </span> : : /*</a>
+<a name="1429"><span class="lineNum"> 1429 </span> : : * If the chip info field is too small then assume we have no</a>
+<a name="1430"><span class="lineNum"> 1430 </span> : : * STOP level information.</a>
+<a name="1431"><span class="lineNum"> 1431 </span> : : */</a>
+<a name="1432"><span class="lineNum"> 1432 </span> :<span class="lineNoCov"> 0 : if (size &lt; 0x44) {</span></a>
+<a name="1433"><span class="lineNum"> 1433 </span> :<span class="lineNoCov"> 0 : stop_levels = 0;</span></a>
+<a name="1434"><span class="lineNum"> 1434 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1435"><span class="lineNum"> 1435 </span> : : }</a>
+<a name="1436"><span class="lineNum"> 1436 </span> : : </a>
+<a name="1437"><span class="lineNum"> 1437 </span> :<span class="lineNoCov"> 0 : ve = be32_to_cpu(cinfo-&gt;verif_exist_flags) &amp; CPU_ID_VERIFY_MASK;</span></a>
+<a name="1438"><span class="lineNum"> 1438 </span> :<span class="lineNoCov"> 0 : ve &gt;&gt;= CPU_ID_VERIFY_SHIFT;</span></a>
+<a name="1439"><span class="lineNum"> 1439 </span> :<span class="lineNoCov"> 0 : if (ve == CHIP_VERIFY_NOT_INSTALLED ||</span></a>
+<a name="1440"><span class="lineNum"> 1440 </span> : : ve == CHIP_VERIFY_UNUSABLE)</a>
+<a name="1441"><span class="lineNum"> 1441 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1442"><span class="lineNum"> 1442 </span> : : </a>
+<a name="1443"><span class="lineNum"> 1443 </span> :<span class="lineNoCov"> 0 : chip_levels = be32_to_cpu(cinfo-&gt;stop_levels);</span></a>
+<a name="1444"><span class="lineNum"> 1444 </span> : : </a>
+<a name="1445"><span class="lineNum"> 1445 </span> :<span class="lineNoCov"> 0 : prlog(PR_INSANE, &quot;CHIP[%x] supported STOP mask 0x%.8x\n&quot;,</span></a>
+<a name="1446"><span class="lineNum"> 1446 </span> : : be32_to_cpu(cinfo-&gt;proc_chip_id), chip_levels);</a>
+<a name="1447"><span class="lineNum"> 1447 </span> : : </a>
+<a name="1448"><span class="lineNum"> 1448 </span> :<span class="lineNoCov"> 0 : stop_levels &amp;= chip_levels;</span></a>
+<a name="1449"><span class="lineNum"> 1449 </span> :<span class="lineNoCov"> 0 : valid = true;</span></a>
+<a name="1450"><span class="lineNum"> 1450 </span> : : }</a>
+<a name="1451"><span class="lineNum"> 1451 </span> : : </a>
+<a name="1452"><span class="lineNum"> 1452 </span> :<span class="lineNoCov"> 0 : if (!valid)</span></a>
+<a name="1453"><span class="lineNum"> 1453 </span> :<span class="lineNoCov"> 0 : stop_levels = 0;</span></a>
+<a name="1454"><span class="lineNum"> 1454 </span> : : </a>
+<a name="1455"><span class="lineNum"> 1455 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(dt_new_check(opal_node, &quot;power-mgt&quot;),</span></a>
+<a name="1456"><span class="lineNum"> 1456 </span> : : &quot;ibm,enabled-stop-levels&quot;, stop_levels);</a>
+<a name="1457"><span class="lineNum"> 1457 </span> : : }</a>
+<a name="1458"><span class="lineNum"> 1458 </span> : : </a>
+<a name="1459"><span class="lineNum"> 1459 </span> : : #define NPU_BASE 0x5011000</a>
+<a name="1460"><span class="lineNum"> 1460 </span> : : #define NPU_SIZE 0x2c</a>
+<a name="1461"><span class="lineNum"> 1461 </span> : : #define NPU_INDIRECT0 0x8000000009010c3fULL</a>
+<a name="1462"><span class="lineNum"> 1462 </span> : : #define NPU_INDIRECT1 0x800000000c010c3fULL</a>
+<a name="1463"><span class="lineNum"> 1463 </span> : : </a>
+<a name="1464"><span class="lineNum"> 1464 </span> :<span class="lineNoCov"> 0 : static void add_npu(struct dt_node *xscom, const struct HDIF_array_hdr *links,</span></a>
+<a name="1465"><span class="lineNum"> 1465 </span> : : int npu_index)</a>
+<a name="1466"><span class="lineNum"> 1466 </span> : : {</a>
+<a name="1467"><span class="lineNum"> 1467 </span> : : const struct sppcrd_smp_link *link;</a>
+<a name="1468"><span class="lineNum"> 1468 </span> : : struct dt_node *npu;</a>
+<a name="1469"><span class="lineNum"> 1469 </span> : : int group_target[6]; /* Tracks the PCI slot targeted each link group */</a>
+<a name="1470"><span class="lineNum"> 1470 </span> :<span class="lineNoCov"> 0 : int group_count = 0;</span></a>
+<a name="1471"><span class="lineNum"> 1471 </span> :<span class="lineNoCov"> 0 : int link_count = 0;</span></a>
+<a name="1472"><span class="lineNum"> 1472 </span> : : uint32_t size, chip_id;</a>
+<a name="1473"><span class="lineNum"> 1473 </span> : : int i;</a>
+<a name="1474"><span class="lineNum"> 1474 </span> : : </a>
+<a name="1475"><span class="lineNum"> 1475 </span> :<span class="lineNoCov"> 0 : size = be32_to_cpu(links-&gt;esize);</span></a>
+<a name="1476"><span class="lineNum"> 1476 </span> :<span class="lineNoCov"> 0 : chip_id = dt_get_chip_id(xscom);</span></a>
+<a name="1477"><span class="lineNum"> 1477 </span> : : </a>
+<a name="1478"><span class="lineNum"> 1478 </span> :<span class="lineNoCov"> 0 : memset(group_target, 0, sizeof(group_target));</span></a>
+<a name="1479"><span class="lineNum"> 1479 </span> : : </a>
+<a name="1480"><span class="lineNum"> 1480 </span> :<span class="lineNoCov"> 0 : npu = dt_new_addr(xscom, &quot;npu&quot;, NPU_BASE);</span></a>
+<a name="1481"><span class="lineNum"> 1481 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(npu, &quot;reg&quot;, NPU_BASE, NPU_SIZE);</span></a>
+<a name="1482"><span class="lineNum"> 1482 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(npu, &quot;#size-cells&quot;, 0);</span></a>
+<a name="1483"><span class="lineNum"> 1483 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(npu, &quot;#address-cells&quot;, 1);</span></a>
+<a name="1484"><span class="lineNum"> 1484 </span> : : </a>
+<a name="1485"><span class="lineNum"> 1485 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(npu, &quot;compatible&quot;, &quot;ibm,power9-npu&quot;);</span></a>
+<a name="1486"><span class="lineNum"> 1486 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(npu, &quot;ibm,npu-index&quot;, npu_index);</span></a>
+<a name="1487"><span class="lineNum"> 1487 </span> : : </a>
+<a name="1488"><span class="lineNum"> 1488 </span> :<span class="lineNoCov"> 0 : HDIF_iarray_for_each(links, i, link) {</span></a>
+<a name="1489"><span class="lineNum"> 1489 </span> :<span class="lineNoCov"> 0 : uint16_t slot_id = be16_to_cpu(link-&gt;pci_slot_idx);</span></a>
+<a name="1490"><span class="lineNum"> 1490 </span> :<span class="lineNoCov"> 0 : uint32_t link_id = be32_to_cpu(link-&gt;link_id);</span></a>
+<a name="1491"><span class="lineNum"> 1491 </span> :<span class="lineNoCov"> 0 : uint64_t speed = 0, nvlink_speed = 0;</span></a>
+<a name="1492"><span class="lineNum"> 1492 </span> : : struct dt_node *node;</a>
+<a name="1493"><span class="lineNum"> 1493 </span> : : </a>
+<a name="1494"><span class="lineNum"> 1494 </span> : : /*</a>
+<a name="1495"><span class="lineNum"> 1495 </span> : : * Only add a link node if this link is targeted at a</a>
+<a name="1496"><span class="lineNum"> 1496 </span> : : * GPU device.</a>
+<a name="1497"><span class="lineNum"> 1497 </span> : : *</a>
+<a name="1498"><span class="lineNum"> 1498 </span> : : * If we ever activate it for an opencapi device, we</a>
+<a name="1499"><span class="lineNum"> 1499 </span> : : * should revisit the link definitions hard-coded</a>
+<a name="1500"><span class="lineNum"> 1500 </span> : : * on ZZ.</a>
+<a name="1501"><span class="lineNum"> 1501 </span> : : */</a>
+<a name="1502"><span class="lineNum"> 1502 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(link-&gt;usage) != SMP_LINK_USE_GPU)</span></a>
+<a name="1503"><span class="lineNum"> 1503 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1504"><span class="lineNum"> 1504 </span> : : </a>
+<a name="1505"><span class="lineNum"> 1505 </span> : : /*</a>
+<a name="1506"><span class="lineNum"> 1506 </span> : : * XXX: The link_id that we get from HDAT is essentially an</a>
+<a name="1507"><span class="lineNum"> 1507 </span> : : * arbitrary ID number so we can't use it as the reg for the</a>
+<a name="1508"><span class="lineNum"> 1508 </span> : : * link node.</a>
+<a name="1509"><span class="lineNum"> 1509 </span> : : *</a>
+<a name="1510"><span class="lineNum"> 1510 </span> : : * a) There's a 1-1 mapping between entries in the SMP link</a>
+<a name="1511"><span class="lineNum"> 1511 </span> : : * structure and the NPU links.</a>
+<a name="1512"><span class="lineNum"> 1512 </span> : : *</a>
+<a name="1513"><span class="lineNum"> 1513 </span> : : * b) The SMP link array contains them in ascending order.</a>
+<a name="1514"><span class="lineNum"> 1514 </span> : : *</a>
+<a name="1515"><span class="lineNum"> 1515 </span> : : * We have some assurances that b) is correct, but if we get</a>
+<a name="1516"><span class="lineNum"> 1516 </span> : : * broken link numbering it's something to watch for.</a>
+<a name="1517"><span class="lineNum"> 1517 </span> : : *</a>
+<a name="1518"><span class="lineNum"> 1518 </span> : : * If we every have actual A-Bus (SMP) link info in here</a>
+<a name="1519"><span class="lineNum"> 1519 </span> : : * this is going to break.</a>
+<a name="1520"><span class="lineNum"> 1520 </span> : : */</a>
+<a name="1521"><span class="lineNum"> 1521 </span> : : </a>
+<a name="1522"><span class="lineNum"> 1522 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;NPU: %04x:%d: Link (%d) targets slot %u\n&quot;,</span></a>
+<a name="1523"><span class="lineNum"> 1523 </span> : : chip_id, link_count, link_count, slot_id);</a>
+<a name="1524"><span class="lineNum"> 1524 </span> : : </a>
+<a name="1525"><span class="lineNum"> 1525 </span> :<span class="lineNoCov"> 0 : if (link_count &gt;= 6) {</span></a>
+<a name="1526"><span class="lineNum"> 1526 </span> :<span class="lineNoCov"> 0 : prerror(&quot;NPU: %04x:%d: Ignoring extra link (max 6)\n&quot;,</span></a>
+<a name="1527"><span class="lineNum"> 1527 </span> : : chip_id, link_count);</a>
+<a name="1528"><span class="lineNum"> 1528 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1529"><span class="lineNum"> 1529 </span> : : }</a>
+<a name="1530"><span class="lineNum"> 1530 </span> : : </a>
+<a name="1531"><span class="lineNum"> 1531 </span> :<span class="lineNoCov"> 0 : node = dt_new_addr(npu, &quot;link&quot;, link_count);</span></a>
+<a name="1532"><span class="lineNum"> 1532 </span> :<span class="lineNoCov"> 0 : if (!node) {</span></a>
+<a name="1533"><span class="lineNum"> 1533 </span> :<span class="lineNoCov"> 0 : prerror(&quot;NPU: %04x:%d: Creating link node failed\n&quot;,</span></a>
+<a name="1534"><span class="lineNum"> 1534 </span> : : chip_id, link_count);</a>
+<a name="1535"><span class="lineNum"> 1535 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1536"><span class="lineNum"> 1536 </span> : : }</a>
+<a name="1537"><span class="lineNum"> 1537 </span> : : </a>
+<a name="1538"><span class="lineNum"> 1538 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;compatible&quot;, &quot;ibm,npu-link&quot;);</span></a>
+<a name="1539"><span class="lineNum"> 1539 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg&quot;, link_count);</span></a>
+<a name="1540"><span class="lineNum"> 1540 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,npu-link-index&quot;, link_count);</span></a>
+<a name="1541"><span class="lineNum"> 1541 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,workbook-link-id&quot;, link_id);</span></a>
+<a name="1542"><span class="lineNum"> 1542 </span> : : </a>
+<a name="1543"><span class="lineNum"> 1543 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64s(node, &quot;ibm,npu-phy&quot;,</span></a>
+<a name="1544"><span class="lineNum"> 1544 </span> : : link_count &lt; 3 ? NPU_INDIRECT0 : NPU_INDIRECT1);</a>
+<a name="1545"><span class="lineNum"> 1545 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,npu-lane-mask&quot;,</span></a>
+<a name="1546"><span class="lineNum"> 1546 </span> : : be32_to_cpu(link-&gt;lane_mask));</a>
+<a name="1547"><span class="lineNum"> 1547 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,npu-brick-id&quot;,</span></a>
+<a name="1548"><span class="lineNum"> 1548 </span> : : be32_to_cpu(link-&gt;brick_id));</a>
+<a name="1549"><span class="lineNum"> 1549 </span> : : </a>
+<a name="1550"><span class="lineNum"> 1550 </span> :<span class="lineNoCov"> 0 : link_count++;</span></a>
+<a name="1551"><span class="lineNum"> 1551 </span> : : </a>
+<a name="1552"><span class="lineNum"> 1552 </span> : : /*</a>
+<a name="1553"><span class="lineNum"> 1553 </span> : : * Add the group details if this is an NVlink.</a>
+<a name="1554"><span class="lineNum"> 1554 </span> : : *</a>
+<a name="1555"><span class="lineNum"> 1555 </span> : : * TODO: Cable card stuff.</a>
+<a name="1556"><span class="lineNum"> 1556 </span> : : */</a>
+<a name="1557"><span class="lineNum"> 1557 </span> :<span class="lineNoCov"> 0 : if (slot_id) {</span></a>
+<a name="1558"><span class="lineNum"> 1558 </span> : : struct dt_node *slot;</a>
+<a name="1559"><span class="lineNum"> 1559 </span> : : const char *name;</a>
+<a name="1560"><span class="lineNum"> 1560 </span> : : int group;</a>
+<a name="1561"><span class="lineNum"> 1561 </span> : : </a>
+<a name="1562"><span class="lineNum"> 1562 </span> : : /*</a>
+<a name="1563"><span class="lineNum"> 1563 </span> : : * Search the existing groups for one targeting</a>
+<a name="1564"><span class="lineNum"> 1564 </span> : : * this PCI slot</a>
+<a name="1565"><span class="lineNum"> 1565 </span> : : */</a>
+<a name="1566"><span class="lineNum"> 1566 </span> :<span class="lineNoCov"> 0 : for (group = 0; group &lt; group_count; group++)</span></a>
+<a name="1567"><span class="lineNum"> 1567 </span> :<span class="lineNoCov"> 0 : if (group_target[group] == slot_id)</span></a>
+<a name="1568"><span class="lineNum"> 1568 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1569"><span class="lineNum"> 1569 </span> : : </a>
+<a name="1570"><span class="lineNum"> 1570 </span> : : /* no group, make a new one */</a>
+<a name="1571"><span class="lineNum"> 1571 </span> :<span class="lineNoCov"> 0 : if (group == group_count) {</span></a>
+<a name="1572"><span class="lineNum"> 1572 </span> :<span class="lineNoCov"> 0 : group_target[group] = slot_id;</span></a>
+<a name="1573"><span class="lineNum"> 1573 </span> :<span class="lineNoCov"> 0 : group_count++;</span></a>
+<a name="1574"><span class="lineNum"> 1574 </span> : : }</a>
+<a name="1575"><span class="lineNum"> 1575 </span> : : </a>
+<a name="1576"><span class="lineNum"> 1576 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,npu-group-id&quot;, group);</span></a>
+<a name="1577"><span class="lineNum"> 1577 </span> : : </a>
+<a name="1578"><span class="lineNum"> 1578 </span> :<span class="lineNoCov"> 0 : slot = find_slot_entry_node(dt_root, slot_id);</span></a>
+<a name="1579"><span class="lineNum"> 1579 </span> :<span class="lineNoCov"> 0 : if (!slot) {</span></a>
+<a name="1580"><span class="lineNum"> 1580 </span> :<span class="lineNoCov"> 0 : prerror(&quot;NPU: %04x:%d: Unable find node for targeted PCIe slot\n&quot;,</span></a>
+<a name="1581"><span class="lineNum"> 1581 </span> : : chip_id, link_count - 1);</a>
+<a name="1582"><span class="lineNum"> 1582 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1583"><span class="lineNum"> 1583 </span> : : }</a>
+<a name="1584"><span class="lineNum"> 1584 </span> : : </a>
+<a name="1585"><span class="lineNum"> 1585 </span> : : /*</a>
+<a name="1586"><span class="lineNum"> 1586 </span> : : * The slot_id points to a node that indicates that</a>
+<a name="1587"><span class="lineNum"> 1587 </span> : : * this GPU should appear under the slot. Grab the</a>
+<a name="1588"><span class="lineNum"> 1588 </span> : : * slot-label from the parent node that represents</a>
+<a name="1589"><span class="lineNum"> 1589 </span> : : * the actual slot.</a>
+<a name="1590"><span class="lineNum"> 1590 </span> : : */</a>
+<a name="1591"><span class="lineNum"> 1591 </span> :<span class="lineNoCov"> 0 : name = dt_prop_get_def(slot-&gt;parent, &quot;ibm,slot-label&quot;,</span></a>
+<a name="1592"><span class="lineNum"> 1592 </span> : : (char *)&quot;&lt;SLOT NAME MISSING&gt;&quot;);</a>
+<a name="1593"><span class="lineNum"> 1593 </span> : : </a>
+<a name="1594"><span class="lineNum"> 1594 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;NPU: %04x:%d: Target slot %s\n&quot;,</span></a>
+<a name="1595"><span class="lineNum"> 1595 </span> : : chip_id, link_count - 1, name);</a>
+<a name="1596"><span class="lineNum"> 1596 </span> : : </a>
+<a name="1597"><span class="lineNum"> 1597 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;ibm,slot-label&quot;, name);</span></a>
+<a name="1598"><span class="lineNum"> 1598 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;ibm,pcie-slot&quot;,</span></a>
+<a name="1599"><span class="lineNum"> 1599 </span> : : slot-&gt;phandle);</a>
+<a name="1600"><span class="lineNum"> 1600 </span> : : }</a>
+<a name="1601"><span class="lineNum"> 1601 </span> : : </a>
+<a name="1602"><span class="lineNum"> 1602 </span> : : /* Newer fields which might not be populated */</a>
+<a name="1603"><span class="lineNum"> 1603 </span> :<span class="lineNoCov"> 0 : if (size &lt;= 0x24)</span></a>
+<a name="1604"><span class="lineNum"> 1604 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1605"><span class="lineNum"> 1605 </span> : : </a>
+<a name="1606"><span class="lineNum"> 1606 </span> :<span class="lineNoCov"> 0 : switch (link-&gt;link_speed) {</span></a>
+<a name="1607"><span class="lineNum"> 1607 </span> :<span class="lineNoCov"> 0 : case 0: /* 20Gbps */</span></a>
+<a name="1608"><span class="lineNum"> 1608 </span> :<span class="lineNoCov"> 0 : speed = 20000000000ul;</span></a>
+<a name="1609"><span class="lineNum"> 1609 </span> :<span class="lineNoCov"> 0 : nvlink_speed = 0x3;</span></a>
+<a name="1610"><span class="lineNum"> 1610 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1611"><span class="lineNum"> 1611 </span> :<span class="lineNoCov"> 0 : case 1: /* 25Gbps */</span></a>
+<a name="1612"><span class="lineNum"> 1612 </span> :<span class="lineNoCov"> 0 : speed = 25000000000ul;</span></a>
+<a name="1613"><span class="lineNum"> 1613 </span> :<span class="lineNoCov"> 0 : nvlink_speed = 0x9;</span></a>
+<a name="1614"><span class="lineNum"> 1614 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1615"><span class="lineNum"> 1615 </span> :<span class="lineNoCov"> 0 : case 2: /* 25.78125 Gbps */</span></a>
+<a name="1616"><span class="lineNum"> 1616 </span> :<span class="lineNoCov"> 0 : nvlink_speed = 0x8;</span></a>
+<a name="1617"><span class="lineNum"> 1617 </span> :<span class="lineNoCov"> 0 : speed = 25781250000ul;</span></a>
+<a name="1618"><span class="lineNum"> 1618 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="1619"><span class="lineNum"> 1619 </span> : : }</a>
+<a name="1620"><span class="lineNum"> 1620 </span> : : </a>
+<a name="1621"><span class="lineNum"> 1621 </span> : : /* ibm,link-speed is in bps and nvidia,link-speed is ~magic~ */</a>
+<a name="1622"><span class="lineNum"> 1622 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64s(node, &quot;ibm,link-speed&quot;, speed);</span></a>
+<a name="1623"><span class="lineNum"> 1623 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;nvidia,link-speed&quot;, nvlink_speed);</span></a>
+<a name="1624"><span class="lineNum"> 1624 </span> : : </a>
+<a name="1625"><span class="lineNum"> 1625 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, DT_PRIVATE &quot;occ-flag-pos&quot;,</span></a>
+<a name="1626"><span class="lineNum"> 1626 </span> : : PPC_BIT(link-&gt;occ_flag_bit));</a>
+<a name="1627"><span class="lineNum"> 1627 </span> : : }</a>
+<a name="1628"><span class="lineNum"> 1628 </span> : : </a>
+<a name="1629"><span class="lineNum"> 1629 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(npu, &quot;ibm,npu-links&quot;, link_count);</span></a>
+<a name="1630"><span class="lineNum"> 1630 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="1631"><span class="lineNum"> 1631 </span> : : </a>
+<a name="1632"><span class="lineNum"> 1632 </span> :<span class="lineCov"> 2 : static void add_npus(void)</span></a>
+<a name="1633"><span class="lineNum"> 1633 </span> : : {</a>
+<a name="1634"><span class="lineNum"> 1634 </span> : : struct dt_node *xscom;</a>
+<a name="1635"><span class="lineNum"> 1635 </span> :<span class="lineCov"> 2 : int npu_index = 0;</span></a>
+<a name="1636"><span class="lineNum"> 1636 </span> : : </a>
+<a name="1637"><span class="lineNum"> 1637 </span> : : /* Only consult HDAT for npu2 */</a>
+<a name="1638"><span class="lineNum"> 1638 </span> :<span class="lineCov"> 2 : if (cpu_type != PVR_TYPE_P9)</span></a>
+<a name="1639"><span class="lineNum"> 1639 </span> :<span class="lineCov"> 2 : return;</span></a>
+<a name="1640"><span class="lineNum"> 1640 </span> : : </a>
+<a name="1641"><span class="lineNum"> 1641 </span> :<span class="lineNoCov"> 0 : dt_for_each_compatible(dt_root, xscom, &quot;ibm,xscom&quot;) {</span></a>
+<a name="1642"><span class="lineNum"> 1642 </span> : : const struct HDIF_array_hdr *links;</a>
+<a name="1643"><span class="lineNum"> 1643 </span> : : </a>
+<a name="1644"><span class="lineNum"> 1644 </span> :<span class="lineNoCov"> 0 : links = xscom_to_pcrd(xscom, SPPCRD_IDATA_SMP_LINK);</span></a>
+<a name="1645"><span class="lineNum"> 1645 </span> :<span class="lineNoCov"> 0 : if (!links) {</span></a>
+<a name="1646"><span class="lineNum"> 1646 </span> :<span class="lineNoCov"> 0 : prerror(&quot;NPU: Unable to find matching SPPCRD for %s\n&quot;,</span></a>
+<a name="1647"><span class="lineNum"> 1647 </span> : : xscom-&gt;name);</a>
+<a name="1648"><span class="lineNum"> 1648 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1649"><span class="lineNum"> 1649 </span> : : }</a>
+<a name="1650"><span class="lineNum"> 1650 </span> : : </a>
+<a name="1651"><span class="lineNum"> 1651 </span> : : /* should never happen, but stranger things have */</a>
+<a name="1652"><span class="lineNum"> 1652 </span> :<span class="lineNoCov"> 0 : if (!dt_find_by_name(dt_root, &quot;ibm,pcie-slots&quot;)) {</span></a>
+<a name="1653"><span class="lineNum"> 1653 </span> :<span class="lineNoCov"> 0 : prerror(&quot;PCIe slot information missing, can't add npu&quot;);</span></a>
+<a name="1654"><span class="lineNum"> 1654 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="1655"><span class="lineNum"> 1655 </span> : : }</a>
+<a name="1656"><span class="lineNum"> 1656 </span> : : </a>
+<a name="1657"><span class="lineNum"> 1657 </span> : : /* some hostboots will give us an empty array */</a>
+<a name="1658"><span class="lineNum"> 1658 </span> :<span class="lineNoCov"> 0 : if (be32_to_cpu(links-&gt;ecnt))</span></a>
+<a name="1659"><span class="lineNum"> 1659 </span> :<span class="lineNoCov"> 0 : add_npu(xscom, links, npu_index++);</span></a>
+<a name="1660"><span class="lineNum"> 1660 </span> : : }</a>
+<a name="1661"><span class="lineNum"> 1661 </span> : : }</a>
+<a name="1662"><span class="lineNum"> 1662 </span> : : </a>
+<a name="1663"><span class="lineNum"> 1663 </span> : : /*</a>
+<a name="1664"><span class="lineNum"> 1664 </span> : : * Legacy SPIRA is being deprecated and we have new SPIRA-H/S structures.</a>
+<a name="1665"><span class="lineNum"> 1665 </span> : : * But on older system (p7?) we will continue to get legacy SPIRA.</a>
+<a name="1666"><span class="lineNum"> 1666 </span> : : *</a>
+<a name="1667"><span class="lineNum"> 1667 </span> : : * SPIRA-S is initialized and provided by FSP. We use SPIRA-S signature</a>
+<a name="1668"><span class="lineNum"> 1668 </span> : : * to identify supported format. Also if required adjust spira pointer.</a>
+<a name="1669"><span class="lineNum"> 1669 </span> : : */</a>
+<a name="1670"><span class="lineNum"> 1670 </span> :<span class="lineCov"> 2 : static void fixup_spira(void)</span></a>
+<a name="1671"><span class="lineNum"> 1671 </span> : : {</a>
+<a name="1672"><span class="lineNum"> 1672 </span> : : #if !defined(TEST)</a>
+<a name="1673"><span class="lineNum"> 1673 </span> : : spiras = (struct spiras *)SPIRA_HEAP_BASE;</a>
+<a name="1674"><span class="lineNum"> 1674 </span> : : #endif</a>
+<a name="1675"><span class="lineNum"> 1675 </span> : : </a>
+<a name="1676"><span class="lineNum"> 1676 </span> : : /* Validate SPIRA-S signature */</a>
+<a name="1677"><span class="lineNum"> 1677 </span> :<span class="lineCov"> 2 : if (!spiras)</span></a>
+<a name="1678"><span class="lineNum"> 1678 </span> :<span class="lineCov"> 1 : return;</span></a>
+<a name="1679"><span class="lineNum"> 1679 </span> :<span class="lineCov"> 1 : if (!HDIF_check(&amp;spiras-&gt;hdr, SPIRAS_HDIF_SIG))</span></a>
+<a name="1680"><span class="lineNum"> 1680 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="1681"><span class="lineNum"> 1681 </span> : : </a>
+<a name="1682"><span class="lineNum"> 1682 </span> :<span class="lineCov"> 1 : prlog(PR_DEBUG, &quot;SPIRA-S found.\n&quot;);</span></a>
+<a name="1683"><span class="lineNum"> 1683 </span> : : </a>
+<a name="1684"><span class="lineNum"> 1684 </span> :<span class="lineCov"> 1 : spira.ntuples.sp_subsys = spiras-&gt;ntuples.sp_subsys;</span></a>
+<a name="1685"><span class="lineNum"> 1685 </span> :<span class="lineCov"> 1 : spira.ntuples.ipl_parms = spiras-&gt;ntuples.ipl_parms;</span></a>
+<a name="1686"><span class="lineNum"> 1686 </span> :<span class="lineCov"> 1 : spira.ntuples.nt_enclosure_vpd = spiras-&gt;ntuples.nt_enclosure_vpd;</span></a>
+<a name="1687"><span class="lineNum"> 1687 </span> :<span class="lineCov"> 1 : spira.ntuples.slca = spiras-&gt;ntuples.slca;</span></a>
+<a name="1688"><span class="lineNum"> 1688 </span> :<span class="lineCov"> 1 : spira.ntuples.backplane_vpd = spiras-&gt;ntuples.backplane_vpd;</span></a>
+<a name="1689"><span class="lineNum"> 1689 </span> :<span class="lineCov"> 1 : spira.ntuples.system_vpd = spiras-&gt;ntuples.system_vpd;</span></a>
+<a name="1690"><span class="lineNum"> 1690 </span> :<span class="lineCov"> 1 : spira.ntuples.proc_init = spirah.ntuples.proc_init;</span></a>
+<a name="1691"><span class="lineNum"> 1691 </span> :<span class="lineCov"> 1 : spira.ntuples.clock_vpd = spiras-&gt;ntuples.clock_vpd;</span></a>
+<a name="1692"><span class="lineNum"> 1692 </span> :<span class="lineCov"> 1 : spira.ntuples.anchor_vpd = spiras-&gt;ntuples.anchor_vpd;</span></a>
+<a name="1693"><span class="lineNum"> 1693 </span> :<span class="lineCov"> 1 : spira.ntuples.op_panel_vpd = spiras-&gt;ntuples.op_panel_vpd;</span></a>
+<a name="1694"><span class="lineNum"> 1694 </span> :<span class="lineCov"> 1 : spira.ntuples.misc_cec_fru_vpd = spiras-&gt;ntuples.misc_cec_fru_vpd;</span></a>
+<a name="1695"><span class="lineNum"> 1695 </span> :<span class="lineCov"> 1 : spira.ntuples.ms_vpd = spiras-&gt;ntuples.ms_vpd;</span></a>
+<a name="1696"><span class="lineNum"> 1696 </span> :<span class="lineCov"> 1 : spira.ntuples.cec_iohub_fru = spiras-&gt;ntuples.cec_iohub_fru;</span></a>
+<a name="1697"><span class="lineNum"> 1697 </span> :<span class="lineCov"> 1 : spira.ntuples.cpu_ctrl = spirah.ntuples.cpu_ctrl;</span></a>
+<a name="1698"><span class="lineNum"> 1698 </span> :<span class="lineCov"> 1 : spira.ntuples.mdump_src = spirah.ntuples.mdump_src;</span></a>
+<a name="1699"><span class="lineNum"> 1699 </span> :<span class="lineCov"> 1 : spira.ntuples.mdump_dst = spirah.ntuples.mdump_dst;</span></a>
+<a name="1700"><span class="lineNum"> 1700 </span> :<span class="lineCov"> 1 : spira.ntuples.mdump_res = spirah.ntuples.mdump_res;</span></a>
+<a name="1701"><span class="lineNum"> 1701 </span> :<span class="lineCov"> 1 : spira.ntuples.proc_dump_area = spirah.ntuples.proc_dump_area;</span></a>
+<a name="1702"><span class="lineNum"> 1702 </span> :<span class="lineCov"> 1 : spira.ntuples.pcia = spiras-&gt;ntuples.pcia;</span></a>
+<a name="1703"><span class="lineNum"> 1703 </span> :<span class="lineCov"> 1 : spira.ntuples.proc_chip = spiras-&gt;ntuples.proc_chip;</span></a>
+<a name="1704"><span class="lineNum"> 1704 </span> :<span class="lineCov"> 1 : spira.ntuples.hs_data = spiras-&gt;ntuples.hs_data;</span></a>
+<a name="1705"><span class="lineNum"> 1705 </span> :<span class="lineCov"> 1 : spira.ntuples.ipmi_sensor = spiras-&gt;ntuples.ipmi_sensor;</span></a>
+<a name="1706"><span class="lineNum"> 1706 </span> :<span class="lineCov"> 1 : spira.ntuples.node_stb_data = spiras-&gt;ntuples.node_stb_data;</span></a>
+<a name="1707"><span class="lineNum"> 1707 </span> : : }</a>
+<a name="1708"><span class="lineNum"> 1708 </span> : : </a>
+<a name="1709"><span class="lineNum"> 1709 </span> : : /*</a>
+<a name="1710"><span class="lineNum"> 1710 </span> : : * All the data structure addresses are relative to payload base. Hence adjust</a>
+<a name="1711"><span class="lineNum"> 1711 </span> : : * structures that are needed to capture OPAL dump during MPIPL.</a>
+<a name="1712"><span class="lineNum"> 1712 </span> : : */</a>
+<a name="1713"><span class="lineNum"> 1713 </span> :<span class="lineCov"> 2 : static void update_spirah_addr(void)</span></a>
+<a name="1714"><span class="lineNum"> 1714 </span> : : {</a>
+<a name="1715"><span class="lineNum"> 1715 </span> : : #if !defined(TEST)</a>
+<a name="1716"><span class="lineNum"> 1716 </span> : : if (proc_gen &lt; proc_gen_p9)</a>
+<a name="1717"><span class="lineNum"> 1717 </span> : : return;</a>
+<a name="1718"><span class="lineNum"> 1718 </span> : : </a>
+<a name="1719"><span class="lineNum"> 1719 </span> : : naca.spirah_addr = CPU_TO_BE64(SPIRAH_OFF);</a>
+<a name="1720"><span class="lineNum"> 1720 </span> : : naca.spira_addr = CPU_TO_BE64(SPIRA_OFF);</a>
+<a name="1721"><span class="lineNum"> 1721 </span> : : spirah.ntuples.hs_data_area.addr = CPU_TO_BE64(SPIRA_HEAP_BASE - SKIBOOT_BASE);</a>
+<a name="1722"><span class="lineNum"> 1722 </span> : : spirah.ntuples.mdump_res.addr = CPU_TO_BE64(MDRT_TABLE_BASE - SKIBOOT_BASE);</a>
+<a name="1723"><span class="lineNum"> 1723 </span> : : #endif</a>
+<a name="1724"><span class="lineNum"> 1724 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="1725"><span class="lineNum"> 1725 </span> : : </a>
+<a name="1726"><span class="lineNum"> 1726 </span> :<span class="lineCov"> 2 : int parse_hdat(bool is_opal)</span></a>
+<a name="1727"><span class="lineNum"> 1727 </span> : : {</a>
+<a name="1728"><span class="lineNum"> 1728 </span> :<span class="lineCov"> 2 : cpu_type = PVR_TYPE(mfspr(SPR_PVR));</span></a>
+<a name="1729"><span class="lineNum"> 1729 </span> : : </a>
+<a name="1730"><span class="lineNum"> 1730 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;Parsing HDAT...\n&quot;);</span></a>
+<a name="1731"><span class="lineNum"> 1731 </span> : : </a>
+<a name="1732"><span class="lineNum"> 1732 </span> :<span class="lineCov"> 2 : fixup_spira();</span></a>
+<a name="1733"><span class="lineNum"> 1733 </span> : : </a>
+<a name="1734"><span class="lineNum"> 1734 </span> :<span class="lineCov"> 2 : update_spirah_addr();</span></a>
+<a name="1735"><span class="lineNum"> 1735 </span> : : </a>
+<a name="1736"><span class="lineNum"> 1736 </span> : : /*</a>
+<a name="1737"><span class="lineNum"> 1737 </span> : : * Basic DT root stuff</a>
+<a name="1738"><span class="lineNum"> 1738 </span> : : */</a>
+<a name="1739"><span class="lineNum"> 1739 </span> :<span class="lineCov"> 2 : dt_add_property_cells(dt_root, &quot;#address-cells&quot;, 2);</span></a>
+<a name="1740"><span class="lineNum"> 1740 </span> :<span class="lineCov"> 2 : dt_add_property_cells(dt_root, &quot;#size-cells&quot;, 2);</span></a>
+<a name="1741"><span class="lineNum"> 1741 </span> : : </a>
+<a name="1742"><span class="lineNum"> 1742 </span> :<span class="lineCov"> 2 : if (proc_gen &lt; proc_gen_p9)</span></a>
+<a name="1743"><span class="lineNum"> 1743 </span> :<span class="lineCov"> 2 : dt_add_property_string(dt_root, &quot;lid-type&quot;, is_opal ? &quot;opal&quot; : &quot;phyp&quot;);</span></a>
+<a name="1744"><span class="lineNum"> 1744 </span> : : </a>
+<a name="1745"><span class="lineNum"> 1745 </span> : : /* Add any BMCs and enable the LPC UART */</a>
+<a name="1746"><span class="lineNum"> 1746 </span> :<span class="lineCov"> 2 : bmc_parse();</span></a>
+<a name="1747"><span class="lineNum"> 1747 </span> : : </a>
+<a name="1748"><span class="lineNum"> 1748 </span> : : /* Create and populate /vpd node */</a>
+<a name="1749"><span class="lineNum"> 1749 </span> :<span class="lineCov"> 2 : dt_init_vpd_node();</span></a>
+<a name="1750"><span class="lineNum"> 1750 </span> : : </a>
+<a name="1751"><span class="lineNum"> 1751 </span> : : /* Create /ibm,opal/led node */</a>
+<a name="1752"><span class="lineNum"> 1752 </span> :<span class="lineCov"> 2 : dt_init_led_node();</span></a>
+<a name="1753"><span class="lineNum"> 1753 </span> : : </a>
+<a name="1754"><span class="lineNum"> 1754 </span> : : /* Parse PCIA */</a>
+<a name="1755"><span class="lineNum"> 1755 </span> :<span class="lineCov"> 2 : if (!pcia_parse())</span></a>
+<a name="1756"><span class="lineNum"> 1756 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="1757"><span class="lineNum"> 1757 </span> : : </a>
+<a name="1758"><span class="lineNum"> 1758 </span> : : /* IPL params */</a>
+<a name="1759"><span class="lineNum"> 1759 </span> :<span class="lineCov"> 2 : add_iplparams();</span></a>
+<a name="1760"><span class="lineNum"> 1760 </span> : : </a>
+<a name="1761"><span class="lineNum"> 1761 </span> : : /* Add XSCOM node (must be before chiptod, IO and FSP) */</a>
+<a name="1762"><span class="lineNum"> 1762 </span> :<span class="lineCov"> 2 : add_xscom();</span></a>
+<a name="1763"><span class="lineNum"> 1763 </span> : : </a>
+<a name="1764"><span class="lineNum"> 1764 </span> : : /* Parse MS VPD */</a>
+<a name="1765"><span class="lineNum"> 1765 </span> :<span class="lineCov"> 2 : memory_parse();</span></a>
+<a name="1766"><span class="lineNum"> 1766 </span> : : </a>
+<a name="1767"><span class="lineNum"> 1767 </span> : : /* Add any FSPs */</a>
+<a name="1768"><span class="lineNum"> 1768 </span> :<span class="lineCov"> 2 : fsp_parse();</span></a>
+<a name="1769"><span class="lineNum"> 1769 </span> : : </a>
+<a name="1770"><span class="lineNum"> 1770 </span> : : /* Add ChipTOD's */</a>
+<a name="1771"><span class="lineNum"> 1771 </span> :<span class="lineCov"> 2 : if (!add_chiptod_old() &amp;&amp; !add_chiptod_new())</span></a>
+<a name="1772"><span class="lineNum"> 1772 </span> :<span class="lineNoCov"> 0 : prerror(&quot;CHIPTOD: No ChipTOD found !\n&quot;);</span></a>
+<a name="1773"><span class="lineNum"> 1773 </span> : : </a>
+<a name="1774"><span class="lineNum"> 1774 </span> : : /* Add NX */</a>
+<a name="1775"><span class="lineNum"> 1775 </span> :<span class="lineCov"> 2 : add_nx();</span></a>
+<a name="1776"><span class="lineNum"> 1776 </span> : : </a>
+<a name="1777"><span class="lineNum"> 1777 </span> : : /* Add nest mmu */</a>
+<a name="1778"><span class="lineNum"> 1778 </span> :<span class="lineCov"> 2 : add_nmmu();</span></a>
+<a name="1779"><span class="lineNum"> 1779 </span> : : </a>
+<a name="1780"><span class="lineNum"> 1780 </span> : : /* Add IO HUBs and/or PHBs */</a>
+<a name="1781"><span class="lineNum"> 1781 </span> :<span class="lineCov"> 2 : io_parse();</span></a>
+<a name="1782"><span class="lineNum"> 1782 </span> : : </a>
+<a name="1783"><span class="lineNum"> 1783 </span> : : /* Add NPU nodes */</a>
+<a name="1784"><span class="lineNum"> 1784 </span> :<span class="lineCov"> 2 : add_npus();</span></a>
+<a name="1785"><span class="lineNum"> 1785 </span> : : </a>
+<a name="1786"><span class="lineNum"> 1786 </span> : : /* Parse VPD */</a>
+<a name="1787"><span class="lineNum"> 1787 </span> :<span class="lineCov"> 2 : vpd_parse();</span></a>
+<a name="1788"><span class="lineNum"> 1788 </span> : : </a>
+<a name="1789"><span class="lineNum"> 1789 </span> : : /* Host services information. */</a>
+<a name="1790"><span class="lineNum"> 1790 </span> :<span class="lineCov"> 2 : hostservices_parse();</span></a>
+<a name="1791"><span class="lineNum"> 1791 </span> : : </a>
+<a name="1792"><span class="lineNum"> 1792 </span> : : /* Parse System Attention Indicator inforamtion */</a>
+<a name="1793"><span class="lineNum"> 1793 </span> :<span class="lineCov"> 2 : slca_dt_add_sai_node();</span></a>
+<a name="1794"><span class="lineNum"> 1794 </span> : : </a>
+<a name="1795"><span class="lineNum"> 1795 </span> :<span class="lineCov"> 2 : add_stop_levels();</span></a>
+<a name="1796"><span class="lineNum"> 1796 </span> : : </a>
+<a name="1797"><span class="lineNum"> 1797 </span> : : /* Parse node secure and trusted boot data */</a>
+<a name="1798"><span class="lineNum"> 1798 </span> :<span class="lineCov"> 2 : if (proc_gen &gt;= proc_gen_p9)</span></a>
+<a name="1799"><span class="lineNum"> 1799 </span> :<span class="lineNoCov"> 0 : node_stb_parse();</span></a>
+<a name="1800"><span class="lineNum"> 1800 </span> : : </a>
+<a name="1801"><span class="lineNum"> 1801 </span> :<span class="lineCov"> 2 : prlog(PR_DEBUG, &quot;Parsing HDAT...done\n&quot;);</span></a>
+<a name="1802"><span class="lineNum"> 1802 </span> : : </a>
+<a name="1803"><span class="lineNum"> 1803 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="1804"><span class="lineNum"> 1804 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/spira.h.func-sort-c.html b/coverage-report/hdata/spira.h.func-sort-c.html
new file mode 100644
index 0000000..bec8dcf
--- /dev/null
+++ b/coverage-report/hdata/spira.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/spira.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - spira.h<span style="font-size: 80%;"> (<a href="spira.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">36.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="spira.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.h.gcov.html#1220">cpu_state</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/spira.h.func.html b/coverage-report/hdata/spira.h.func.html
new file mode 100644
index 0000000..f26e84c
--- /dev/null
+++ b/coverage-report/hdata/spira.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/spira.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - spira.h<span style="font-size: 80%;"> (<a href="spira.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">36.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="spira.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="spira.h.gcov.html#1220">cpu_state</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/spira.h.gcov.html b/coverage-report/hdata/spira.h.gcov.html
new file mode 100644
index 0000000..128389c
--- /dev/null
+++ b/coverage-report/hdata/spira.h.gcov.html
@@ -0,0 +1,1321 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/spira.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - spira.h<span style="font-size: 80%;"> (source / <a href="spira.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">36.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __SPIRA_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __SPIRA_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &quot;hdif.h&quot;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : /*</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * The SPIRA structure</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * NOTE: This is one of the only HDIF structure that we layout entirely</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * as a C struct because it's provided by us to the FSP. Almost everything</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * else is generated by the FSP, and thus must be &quot;parsed&quot; since the various</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * offsets and alignments might change.</a>
+<a name="16"><span class="lineNum"> 16 </span> : : */</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define SPIRA_VERSION 0x20 /* Like 730 ? */</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : struct spira_ntuple {</a>
+<a name="21"><span class="lineNum"> 21 </span> : : __be64 addr;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : __be16 alloc_cnt;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : __be16 act_cnt;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : __be32 alloc_len;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : __be32 act_len;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : __be32 tce_off;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : __be64 padding;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : } __packed;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : #define SPIRA_NTUPLES_COUNT 0x19</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : struct spira_ntuples {</a>
+<a name="33"><span class="lineNum"> 33 </span> : : struct HDIF_array_hdr array_hdr;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : struct spira_ntuple sp_subsys; /* 0x040 */</a>
+<a name="35"><span class="lineNum"> 35 </span> : : struct spira_ntuple ipl_parms; /* 0x060 */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : struct spira_ntuple nt_enclosure_vpd; /* 0x080 */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct spira_ntuple slca; /* 0x0a0 */</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct spira_ntuple backplane_vpd; /* 0x0c0 */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct spira_ntuple system_vpd; /* 0x0e0 */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : struct spira_ntuple chip_tod; /* 0x100 */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : struct spira_ntuple proc_init; /* 0x120 */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : struct spira_ntuple clock_vpd; /* 0x140 */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct spira_ntuple anchor_vpd; /* 0x160 */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : struct spira_ntuple op_panel_vpd; /* 0x180 */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct spira_ntuple ext_cache_fru_vpd; /* 0x1a0 */</a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct spira_ntuple misc_cec_fru_vpd; /* 0x1c0 */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : struct spira_ntuple paca; /* 0x1e0 */</a>
+<a name="48"><span class="lineNum"> 48 </span> : : struct spira_ntuple ms_vpd; /* 0x200 */</a>
+<a name="49"><span class="lineNum"> 49 </span> : : struct spira_ntuple cec_iohub_fru; /* 0x220 */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : struct spira_ntuple cpu_ctrl; /* 0x240 */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : struct spira_ntuple mdump_src; /* 0x260 */</a>
+<a name="52"><span class="lineNum"> 52 </span> : : struct spira_ntuple mdump_dst; /* 0x280 */</a>
+<a name="53"><span class="lineNum"> 53 </span> : : struct spira_ntuple mdump_res; /* 0x2a0 */</a>
+<a name="54"><span class="lineNum"> 54 </span> : : struct spira_ntuple heap; /* 0x2c0 */</a>
+<a name="55"><span class="lineNum"> 55 </span> : : struct spira_ntuple pcia; /* 0x2e0 */</a>
+<a name="56"><span class="lineNum"> 56 </span> : : struct spira_ntuple proc_chip; /* 0x300 */</a>
+<a name="57"><span class="lineNum"> 57 </span> : : struct spira_ntuple hs_data; /* 0x320 */</a>
+<a name="58"><span class="lineNum"> 58 </span> : : struct spira_ntuple ipmi_sensor; /* 0x360 */</a>
+<a name="59"><span class="lineNum"> 59 </span> : : struct spira_ntuple node_stb_data; /* 0x380 */</a>
+<a name="60"><span class="lineNum"> 60 </span> : : struct spira_ntuple proc_dump_area; /* 0x400 */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : };</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : #define SPIRA_RESERVED_BYTES 0x60</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : struct spira {</a>
+<a name="66"><span class="lineNum"> 66 </span> : : struct HDIF_common_hdr hdr;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : struct HDIF_idata_ptr ntuples_ptr;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : __be64 pad;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : struct spira_ntuples ntuples;</a>
+<a name="70"><span class="lineNum"> 70 </span> : : /*</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * We reserve 0xc0 rather than 0x4c0 so we fit SPIRAH/SPIRAS here</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * while preserving compatibility with existing P8 systems.</a>
+<a name="73"><span class="lineNum"> 73 </span> : : *</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * According to FSP engineers, this is an okay thing to do.</a>
+<a name="75"><span class="lineNum"> 75 </span> : : */</a>
+<a name="76"><span class="lineNum"> 76 </span> : : u8 reserved[SPIRA_RESERVED_BYTES];</a>
+<a name="77"><span class="lineNum"> 77 </span> : : } __packed __align(0x100);</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : #define SPIRA_ACTUAL_SIZE (sizeof(struct spira) - SPIRA_RESERVED_BYTES)</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : extern struct spira spira;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : /* SPIRA-H signature */</a>
+<a name="84"><span class="lineNum"> 84 </span> : : #define SPIRAH_HDIF_SIG &quot;SPIRAH&quot;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /* First version of the secure boot compliant design. */</a>
+<a name="87"><span class="lineNum"> 87 </span> : : #define SPIRAH_VERSION 0x50</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* N-tuples in SPIRAH */</a>
+<a name="90"><span class="lineNum"> 90 </span> : : #define SPIRAH_NTUPLES_COUNT 0x6</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : struct spirah_ntuples {</a>
+<a name="93"><span class="lineNum"> 93 </span> : : struct HDIF_array_hdr array_hdr; /* 0x030 */</a>
+<a name="94"><span class="lineNum"> 94 </span> : : struct spira_ntuple hs_data_area; /* 0x040 */</a>
+<a name="95"><span class="lineNum"> 95 </span> : : struct spira_ntuple proc_init; /* 0x060 */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : struct spira_ntuple cpu_ctrl; /* 0x080 */</a>
+<a name="97"><span class="lineNum"> 97 </span> : : struct spira_ntuple mdump_src; /* 0x0a0 */</a>
+<a name="98"><span class="lineNum"> 98 </span> : : struct spira_ntuple mdump_dst; /* 0x0c0 */</a>
+<a name="99"><span class="lineNum"> 99 </span> : : struct spira_ntuple mdump_res; /* 0x0e0 */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : struct spira_ntuple proc_dump_area; /* 0x100 */</a>
+<a name="101"><span class="lineNum"> 101 </span> : : };</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : struct spirah {</a>
+<a name="104"><span class="lineNum"> 104 </span> : : struct HDIF_common_hdr hdr;</a>
+<a name="105"><span class="lineNum"> 105 </span> : : struct HDIF_idata_ptr ntuples_ptr;</a>
+<a name="106"><span class="lineNum"> 106 </span> : : __be64 pad;</a>
+<a name="107"><span class="lineNum"> 107 </span> : : struct spirah_ntuples ntuples;</a>
+<a name="108"><span class="lineNum"> 108 </span> : : u8 reserved[0xE0];</a>
+<a name="109"><span class="lineNum"> 109 </span> : : } __packed __align(0x100);</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> : : extern struct spirah spirah;</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : /* SPIRA-S signature */</a>
+<a name="114"><span class="lineNum"> 114 </span> : : #define SPIRAS_HDIF_SIG &quot;SPIRAS&quot;</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* First version on 810 release */</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #define SPIRAS_VERSION_P8 0x40</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #define SPIRAS_VERSION_P9 0x50</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /* N-tuples in SPIRAS */</a>
+<a name="121"><span class="lineNum"> 121 </span> : : #define SPIRAS_NTUPLES_COUNT 0x10</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> : : struct spiras_ntuples {</a>
+<a name="124"><span class="lineNum"> 124 </span> : : struct HDIF_array_hdr array_hdr; /* 0x030 */</a>
+<a name="125"><span class="lineNum"> 125 </span> : : struct spira_ntuple sp_subsys; /* 0x040 */</a>
+<a name="126"><span class="lineNum"> 126 </span> : : struct spira_ntuple ipl_parms; /* 0x060 */</a>
+<a name="127"><span class="lineNum"> 127 </span> : : struct spira_ntuple nt_enclosure_vpd; /* 0x080 */</a>
+<a name="128"><span class="lineNum"> 128 </span> : : struct spira_ntuple slca; /* 0x0a0 */</a>
+<a name="129"><span class="lineNum"> 129 </span> : : struct spira_ntuple backplane_vpd; /* 0x0c0 */</a>
+<a name="130"><span class="lineNum"> 130 </span> : : struct spira_ntuple system_vpd; /* 0x0e0 */</a>
+<a name="131"><span class="lineNum"> 131 </span> : : struct spira_ntuple clock_vpd; /* 0x100 */</a>
+<a name="132"><span class="lineNum"> 132 </span> : : struct spira_ntuple anchor_vpd; /* 0x120 */</a>
+<a name="133"><span class="lineNum"> 133 </span> : : struct spira_ntuple op_panel_vpd; /* 0x140 */</a>
+<a name="134"><span class="lineNum"> 134 </span> : : struct spira_ntuple misc_cec_fru_vpd; /* 0x160 */</a>
+<a name="135"><span class="lineNum"> 135 </span> : : struct spira_ntuple ms_vpd; /* 0x180 */</a>
+<a name="136"><span class="lineNum"> 136 </span> : : struct spira_ntuple cec_iohub_fru; /* 0x1a0 */</a>
+<a name="137"><span class="lineNum"> 137 </span> : : struct spira_ntuple pcia; /* 0x1c0 */</a>
+<a name="138"><span class="lineNum"> 138 </span> : : struct spira_ntuple proc_chip; /* 0x1e0 */</a>
+<a name="139"><span class="lineNum"> 139 </span> : : struct spira_ntuple hs_data; /* 0x200 */</a>
+<a name="140"><span class="lineNum"> 140 </span> : : struct spira_ntuple hbrt_data; /* 0x220 */</a>
+<a name="141"><span class="lineNum"> 141 </span> : : struct spira_ntuple ipmi_sensor; /* 0x240 */</a>
+<a name="142"><span class="lineNum"> 142 </span> : : struct spira_ntuple node_stb_data; /* 0x260 */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : };</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : struct spiras {</a>
+<a name="146"><span class="lineNum"> 146 </span> : : struct HDIF_common_hdr hdr;</a>
+<a name="147"><span class="lineNum"> 147 </span> : : struct HDIF_idata_ptr ntuples_ptr;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : __be64 pad;</a>
+<a name="149"><span class="lineNum"> 149 </span> : : struct spiras_ntuples ntuples;</a>
+<a name="150"><span class="lineNum"> 150 </span> : : u8 reserved[0x180];</a>
+<a name="151"><span class="lineNum"> 151 </span> : : } __packed __align(0x100);</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> : : extern struct spiras *spiras;</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> : : /* This macro can be used to check the validity of a pointer returned</a>
+<a name="157"><span class="lineNum"> 157 </span> : : * by one of the HDIF API functions. It returns true if the pointer</a>
+<a name="158"><span class="lineNum"> 158 </span> : : * appears valid. If it's not valid and not NULL, it will print some</a>
+<a name="159"><span class="lineNum"> 159 </span> : : * error in the log as well.</a>
+<a name="160"><span class="lineNum"> 160 </span> : : */</a>
+<a name="161"><span class="lineNum"> 161 </span> : : #define CHECK_SPPTR(_ptr) spira_check_ptr(_ptr, __FILE__, __LINE__)</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : #define get_hdif(ntuple, id) __get_hdif((ntuple), (id), __FILE__, __LINE__)</a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : extern struct HDIF_common_hdr *__get_hdif(struct spira_ntuple *n,</a>
+<a name="166"><span class="lineNum"> 166 </span> : : const char id[],</a>
+<a name="167"><span class="lineNum"> 167 </span> : : const char *file, int line);</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : #define for_each_ntuple_idx(_ntuples, _p, _idx, _id) \</a>
+<a name="170"><span class="lineNum"> 170 </span> : : for (_p = get_hdif((_ntuples), _id &quot;&quot;), _idx = 0; \</a>
+<a name="171"><span class="lineNum"> 171 </span> : : _p &amp;&amp; _idx &lt; be16_to_cpu((_ntuples)-&gt;act_cnt); \</a>
+<a name="172"><span class="lineNum"> 172 </span> : : _p = (void *)_p + be32_to_cpu((_ntuples)-&gt;alloc_len), _idx++)</a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> : : #define for_each_ntuple(_ntuples, _p, _id) \</a>
+<a name="175"><span class="lineNum"> 175 </span> : : for (_p = get_hdif((_ntuples), _id &quot;&quot;); \</a>
+<a name="176"><span class="lineNum"> 176 </span> : : _p &amp;&amp; (void *)_p &lt; ntuple_addr(_ntuples) \</a>
+<a name="177"><span class="lineNum"> 177 </span> : : + (be16_to_cpu((_ntuples)-&gt;act_cnt) * \</a>
+<a name="178"><span class="lineNum"> 178 </span> : : be32_to_cpu((_ntuples)-&gt;alloc_len)); \</a>
+<a name="179"><span class="lineNum"> 179 </span> : : _p = (void *)_p + be32_to_cpu((_ntuples)-&gt;alloc_len))</a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> : : #define for_each_pcia(p) for_each_ntuple(&amp;spira.ntuples.pcia, p, SPPCIA_HDIF_SIG)</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> : : /* We override these for testing. */</a>
+<a name="184"><span class="lineNum"> 184 </span> : : #ifndef ntuple_addr</a>
+<a name="185"><span class="lineNum"> 185 </span> : : #define ntuple_addr(_ntuples) ((void *)BE64_TO_CPU((_ntuples)-&gt;addr))</a>
+<a name="186"><span class="lineNum"> 186 </span> : : #endif</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> : : #ifndef spira_check_ptr</a>
+<a name="189"><span class="lineNum"> 189 </span> : : extern bool spira_check_ptr(const void *ptr, const char *file,</a>
+<a name="190"><span class="lineNum"> 190 </span> : : unsigned int line);</a>
+<a name="191"><span class="lineNum"> 191 </span> : : #endif</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : struct proc_init_data {</a>
+<a name="194"><span class="lineNum"> 194 </span> : : struct HDIF_common_hdr hdr;</a>
+<a name="195"><span class="lineNum"> 195 </span> : : struct HDIF_idata_ptr regs_ptr;</a>
+<a name="196"><span class="lineNum"> 196 </span> : : struct {</a>
+<a name="197"><span class="lineNum"> 197 </span> : : __be64 nia;</a>
+<a name="198"><span class="lineNum"> 198 </span> : : __be64 msr;</a>
+<a name="199"><span class="lineNum"> 199 </span> : : __be64 nia_charm_time;</a>
+<a name="200"><span class="lineNum"> 200 </span> : : __be64 msr_charm_time;</a>
+<a name="201"><span class="lineNum"> 201 </span> : : } regs;</a>
+<a name="202"><span class="lineNum"> 202 </span> : : } __packed __align(0x10);</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> : : /*</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * The FRU ID structure is used in several tuples, so we</a>
+<a name="206"><span class="lineNum"> 206 </span> : : * define it generically here</a>
+<a name="207"><span class="lineNum"> 207 </span> : : */</a>
+<a name="208"><span class="lineNum"> 208 </span> : : struct spira_fru_id {</a>
+<a name="209"><span class="lineNum"> 209 </span> : : __be16 slca_index;</a>
+<a name="210"><span class="lineNum"> 210 </span> : : __be16 rsrc_id; /* formerly VPD port number */</a>
+<a name="211"><span class="lineNum"> 211 </span> : : } __packed;</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /*</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * The FRU operational status structure is used in several</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * tuples, so we define it generically here</a>
+<a name="216"><span class="lineNum"> 216 </span> : : */</a>
+<a name="217"><span class="lineNum"> 217 </span> : : struct spira_fru_op_status {</a>
+<a name="218"><span class="lineNum"> 218 </span> : : uint8_t flags;</a>
+<a name="219"><span class="lineNum"> 219 </span> : : #define FRU_OP_STATUS_FLAG_USED 0x02 /* If 0 -&gt; not used (redundant) */</a>
+<a name="220"><span class="lineNum"> 220 </span> : : #define FRU_OP_STATUS_FLAG_FUNCTIONAL 0x01 /* If 0 -&gt; non-functional */</a>
+<a name="221"><span class="lineNum"> 221 </span> : : uint8_t reserved[3];</a>
+<a name="222"><span class="lineNum"> 222 </span> : : } __packed;</a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> : : /*</a>
+<a name="225"><span class="lineNum"> 225 </span> : : * Move VPD related stuff to another file ...</a>
+<a name="226"><span class="lineNum"> 226 </span> : : */</a>
+<a name="227"><span class="lineNum"> 227 </span> : : #define VPD_ID(_a, _b) ((_a) &lt;&lt; 8 | (_b))</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /*</a>
+<a name="230"><span class="lineNum"> 230 </span> : : * Service Processor Subsystem Structure</a>
+<a name="231"><span class="lineNum"> 231 </span> : : *</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * This structure contains several internal data blocks</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * describing the service processor(s) in the system</a>
+<a name="234"><span class="lineNum"> 234 </span> : : */</a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> : : #define SPSS_HDIF_SIG &quot;SPINFO&quot;</a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : /* Idata index 0 : FRU ID Data */</a>
+<a name="239"><span class="lineNum"> 239 </span> : : #define SPSS_IDATA_FRU_ID 0</a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> : : /* Idata index 1 : Keyword VPD for the FSP instance */</a>
+<a name="242"><span class="lineNum"> 242 </span> : : #define SPSS_IDATA_KEYWORD_VPD 1</a>
+<a name="243"><span class="lineNum"> 243 </span> : : </a>
+<a name="244"><span class="lineNum"> 244 </span> : : /* Idata index 2 : SP Implementation */</a>
+<a name="245"><span class="lineNum"> 245 </span> : : #define SPSS_IDATA_SP_IMPL 2</a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> : : struct spss_sp_impl {</a>
+<a name="248"><span class="lineNum"> 248 </span> : : __be16 hw_version;</a>
+<a name="249"><span class="lineNum"> 249 </span> : : __be16 sw_version;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : __be16 func_flags;</a>
+<a name="251"><span class="lineNum"> 251 </span> : : #define SPSS_SP_IMPL_FLAGS_INSTALLED 0x8000</a>
+<a name="252"><span class="lineNum"> 252 </span> : : #define SPSS_SP_IMPL_FLAGS_FUNCTIONAL 0x4000</a>
+<a name="253"><span class="lineNum"> 253 </span> : : #define SPSS_SP_IMPL_FLAGS_PRIMARY 0x2000</a>
+<a name="254"><span class="lineNum"> 254 </span> : : u8 chip_version;</a>
+<a name="255"><span class="lineNum"> 255 </span> : : u8 reserved;</a>
+<a name="256"><span class="lineNum"> 256 </span> : : u8 sp_family[64];</a>
+<a name="257"><span class="lineNum"> 257 </span> : : } __packed;</a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> : : /* Idata index 3 is deprecated */</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> : : /* Idata index 4 : SP Memory Locator */</a>
+<a name="262"><span class="lineNum"> 262 </span> : : #define SPSS_IDATA_SP_MEMLOC 4</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : /* Idata index 5 : SP I/O path array */</a>
+<a name="265"><span class="lineNum"> 265 </span> : : #define SPSS_IDATA_SP_IOPATH 5</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : /* An HDIF array of IO path */</a>
+<a name="268"><span class="lineNum"> 268 </span> : : struct spss_iopath {</a>
+<a name="269"><span class="lineNum"> 269 </span> : : __be16 iopath_type;</a>
+<a name="270"><span class="lineNum"> 270 </span> : : #define SPSS_IOPATH_TYPE_IOHUB_PHB 0x0001</a>
+<a name="271"><span class="lineNum"> 271 </span> : : #define SPSS_IOPATH_TYPE_PSI 0x0002</a>
+<a name="272"><span class="lineNum"> 272 </span> : : #define SPSS_IOPATH_TYPE_LPC 0x0003</a>
+<a name="273"><span class="lineNum"> 273 </span> : : union {</a>
+<a name="274"><span class="lineNum"> 274 </span> : : struct {</a>
+<a name="275"><span class="lineNum"> 275 </span> : : __be16 iohub_chip_inst;</a>
+<a name="276"><span class="lineNum"> 276 </span> : : __be16 iohub_chip_port;</a>
+<a name="277"><span class="lineNum"> 277 </span> : : __be16 phb_id;</a>
+<a name="278"><span class="lineNum"> 278 </span> : : } __packed iohub_phb;</a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> : : struct {</a>
+<a name="281"><span class="lineNum"> 281 </span> : : __be16 link_status;</a>
+<a name="282"><span class="lineNum"> 282 </span> : : #define SPSS_IO_PATH_PSI_LINK_BAD_FRU 0x0000</a>
+<a name="283"><span class="lineNum"> 283 </span> : : #define SPSS_IO_PATH_PSI_LINK_CURRENT 0x0001</a>
+<a name="284"><span class="lineNum"> 284 </span> : : #define SPSS_IO_PATH_PSI_LINK_BACKUP 0x0002</a>
+<a name="285"><span class="lineNum"> 285 </span> : : u8 ml2_version;</a>
+<a name="286"><span class="lineNum"> 286 </span> : : u8 reserved;</a>
+<a name="287"><span class="lineNum"> 287 </span> : : __be16 slca_count;</a>
+<a name="288"><span class="lineNum"> 288 </span> : : u8 slca_idx[16];</a>
+<a name="289"><span class="lineNum"> 289 </span> : : __be32 proc_chip_id;</a>
+<a name="290"><span class="lineNum"> 290 </span> : : __be32 reserved2;</a>
+<a name="291"><span class="lineNum"> 291 </span> : : __be64 gxhb_base;</a>
+<a name="292"><span class="lineNum"> 292 </span> : : } __packed psi;</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : struct { /* only populated after version 0x30 */</a>
+<a name="295"><span class="lineNum"> 295 </span> : : __be16 link_status;</a>
+<a name="296"><span class="lineNum"> 296 </span> : : #define LPC_STATUS_STUFFED 0x0000</a>
+<a name="297"><span class="lineNum"> 297 </span> : : #define LPC_STATUS_ACTIVE 0x0001</a>
+<a name="298"><span class="lineNum"> 298 </span> : : uint8_t ml2_version;</a>
+<a name="299"><span class="lineNum"> 299 </span> : : uint8_t reserved[3];</a>
+<a name="300"><span class="lineNum"> 300 </span> : : __be32 chip_id;</a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> : : __be32 io_bar;</a>
+<a name="303"><span class="lineNum"> 303 </span> : : __be32 memory_bar;</a>
+<a name="304"><span class="lineNum"> 304 </span> : : __be32 firmware_bar;</a>
+<a name="305"><span class="lineNum"> 305 </span> : : __be32 internal_bar;</a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> : : __be32 reserved2;</a>
+<a name="308"><span class="lineNum"> 308 </span> : : </a>
+<a name="309"><span class="lineNum"> 309 </span> : : __be64 uart_base;</a>
+<a name="310"><span class="lineNum"> 310 </span> : : __be32 uart_size;</a>
+<a name="311"><span class="lineNum"> 311 </span> : : __be32 uart_clk; /* UART baud clock in Hz */</a>
+<a name="312"><span class="lineNum"> 312 </span> : : __be32 uart_baud; /* UART baud rate */</a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> : : uint8_t uart_int_number;</a>
+<a name="315"><span class="lineNum"> 315 </span> : : uint8_t uart_int_type;</a>
+<a name="316"><span class="lineNum"> 316 </span> : : #define UART_INT_LVL_LOW 0x1</a>
+<a name="317"><span class="lineNum"> 317 </span> : : #define UART_INT_RISING 0x2</a>
+<a name="318"><span class="lineNum"> 318 </span> : : #define UART_INT_LVL_HIGH 0x3</a>
+<a name="319"><span class="lineNum"> 319 </span> : : uint8_t reserved3[2];</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : __be64 bt_base;</a>
+<a name="322"><span class="lineNum"> 322 </span> : : __be32 bt_size;</a>
+<a name="323"><span class="lineNum"> 323 </span> : : uint8_t bt_sms_int_num;</a>
+<a name="324"><span class="lineNum"> 324 </span> : : uint8_t bt_bmc_response_int_num;</a>
+<a name="325"><span class="lineNum"> 325 </span> : : uint8_t reserved4[2];</a>
+<a name="326"><span class="lineNum"> 326 </span> : : } __packed lpc;</a>
+<a name="327"><span class="lineNum"> 327 </span> : : };</a>
+<a name="328"><span class="lineNum"> 328 </span> : : } __packed;</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> : : /*</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * IPL Parms structure</a>
+<a name="332"><span class="lineNum"> 332 </span> : : *</a>
+<a name="333"><span class="lineNum"> 333 </span> : : */</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> : : /* Idata index 0: System Parameters */</a>
+<a name="336"><span class="lineNum"> 336 </span> : : #define IPLPARAMS_SYSPARAMS 0</a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : struct iplparams_sysparams {</a>
+<a name="339"><span class="lineNum"> 339 </span> : : char sys_model[4];</a>
+<a name="340"><span class="lineNum"> 340 </span> : : char cpu_feature_code[4];</a>
+<a name="341"><span class="lineNum"> 341 </span> : : __be32 effective_pvr;</a>
+<a name="342"><span class="lineNum"> 342 </span> : : __be32 system_type;</a>
+<a name="343"><span class="lineNum"> 343 </span> : : uint8_t num_lpar_oct[8];</a>
+<a name="344"><span class="lineNum"> 344 </span> : : __be32 abc_bus_speed;</a>
+<a name="345"><span class="lineNum"> 345 </span> : : __be32 wxyz_bus_speed;</a>
+<a name="346"><span class="lineNum"> 346 </span> : : __be32 sys_eco_mode;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : #define SYS_ATTR_MULTIPLE_TPM PPC_BIT32(0)</a>
+<a name="348"><span class="lineNum"> 348 </span> : : #define SYS_ATTR_RISK_LEVEL PPC_BIT32(3)</a>
+<a name="349"><span class="lineNum"> 349 </span> : : #define SYS_ATTR_MPIPL_SUPPORTED PPC_BIT32(5)</a>
+<a name="350"><span class="lineNum"> 350 </span> : : __be32 sys_attributes;</a>
+<a name="351"><span class="lineNum"> 351 </span> : : __be32 mem_scrubbing;</a>
+<a name="352"><span class="lineNum"> 352 </span> : : __be16 cur_spl_value;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : uint8_t pump_mode; /* Reserved */</a>
+<a name="354"><span class="lineNum"> 354 </span> : : uint8_t use_pore_sleep;</a>
+<a name="355"><span class="lineNum"> 355 </span> : : __be32 pore_image_size; /* Reserved */</a>
+<a name="356"><span class="lineNum"> 356 </span> : : uint8_t vtpm_enabled;</a>
+<a name="357"><span class="lineNum"> 357 </span> : : uint8_t hw_page_table_size; /* &gt;= 0x59 */</a>
+<a name="358"><span class="lineNum"> 358 </span> : : __be16 hv_disp_wheel; /* &gt;= 0x58 */</a>
+<a name="359"><span class="lineNum"> 359 </span> : : __be32 nest_freq_mhz; /* &gt;= 0x5b */</a>
+<a name="360"><span class="lineNum"> 360 </span> : : uint8_t split_core_mode; /* &gt;= 0x5c */</a>
+<a name="361"><span class="lineNum"> 361 </span> : : uint8_t reserved[1];</a>
+<a name="362"><span class="lineNum"> 362 </span> : : #define KEY_CLEAR_ALL PPC_BIT16(0)</a>
+<a name="363"><span class="lineNum"> 363 </span> : : #define KEY_CLEAR_OS_KEYS PPC_BIT16(1)</a>
+<a name="364"><span class="lineNum"> 364 </span> : : #define KEY_CLEAR_MFG PPC_BIT16(7)</a>
+<a name="365"><span class="lineNum"> 365 </span> : : __be16 host_fw_key_clear;</a>
+<a name="366"><span class="lineNum"> 366 </span> : : uint8_t sys_vendor[64]; /* &gt;= 0x5f */</a>
+<a name="367"><span class="lineNum"> 367 </span> : : #define SEC_CONTAINER_SIG_CHECKING PPC_BIT16(0)</a>
+<a name="368"><span class="lineNum"> 368 </span> : : #define SEC_HASHES_EXTENDED_TO_TPM PPC_BIT16(1)</a>
+<a name="369"><span class="lineNum"> 369 </span> : : #define PHYSICAL_PRESENCE_ASSERTED PPC_BIT16(3)</a>
+<a name="370"><span class="lineNum"> 370 </span> : : __be16 sys_sec_setting; /* &gt;= 0x60 */</a>
+<a name="371"><span class="lineNum"> 371 </span> : : __be16 tpm_config_bit; /* &gt;= 0x60 */</a>
+<a name="372"><span class="lineNum"> 372 </span> : : __be16 tpm_drawer; /* &gt;= 0x60 */</a>
+<a name="373"><span class="lineNum"> 373 </span> : : __be16 hw_key_hash_size; /* &gt;= 0x60 */</a>
+<a name="374"><span class="lineNum"> 374 </span> : : #define SYSPARAMS_HW_KEY_HASH_MAX 64</a>
+<a name="375"><span class="lineNum"> 375 </span> : : uint8_t hw_key_hash[SYSPARAMS_HW_KEY_HASH_MAX]; /* &gt;= 0x60 */</a>
+<a name="376"><span class="lineNum"> 376 </span> : : uint8_t sys_family_str[64]; /* vendor,name */</a>
+<a name="377"><span class="lineNum"> 377 </span> : : uint8_t sys_type_str[64]; /* vendor,type */</a>
+<a name="378"><span class="lineNum"> 378 </span> : : } __packed;</a>
+<a name="379"><span class="lineNum"> 379 </span> : : </a>
+<a name="380"><span class="lineNum"> 380 </span> : : /* Idata index 1: IPL parameters */</a>
+<a name="381"><span class="lineNum"> 381 </span> : : #define IPLPARAMS_IPLPARAMS 1</a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> : : struct iplparams_iplparams {</a>
+<a name="384"><span class="lineNum"> 384 </span> : : uint8_t reserved;</a>
+<a name="385"><span class="lineNum"> 385 </span> : : uint8_t hv_ipl_dest;</a>
+<a name="386"><span class="lineNum"> 386 </span> : : uint8_t ipl_side;</a>
+<a name="387"><span class="lineNum"> 387 </span> : : #define IPLPARAMS_CEC_FW_IPL_SIDE_TEMP 0x10</a>
+<a name="388"><span class="lineNum"> 388 </span> : : #define IPLPARAMS_FSP_FW_IPL_SIDE_TEMP 0x01</a>
+<a name="389"><span class="lineNum"> 389 </span> : : uint8_t ipl_speed;</a>
+<a name="390"><span class="lineNum"> 390 </span> : : __be16 cec_ipl_attrib;</a>
+<a name="391"><span class="lineNum"> 391 </span> : : #define IPLPARAMS_ATTRIB_MEM_PRESERVE PPC_BIT16(2)</a>
+<a name="392"><span class="lineNum"> 392 </span> : : uint8_t cec_ipl_maj_type;</a>
+<a name="393"><span class="lineNum"> 393 </span> : : #define IPLPARAMS_MAJ_TYPE_REIPL 0x1</a>
+<a name="394"><span class="lineNum"> 394 </span> : : uint8_t cec_ipl_min_type;</a>
+<a name="395"><span class="lineNum"> 395 </span> : : #define IPLPARAMS_MIN_TYPE_POST_DUMP 0xc</a>
+<a name="396"><span class="lineNum"> 396 </span> : : #define IPLPARAMS_MIN_TYPE_PLAT_REBOOT 0xd</a>
+<a name="397"><span class="lineNum"> 397 </span> : : uint8_t os_ipl_mode;</a>
+<a name="398"><span class="lineNum"> 398 </span> : : uint8_t keylock_pos;</a>
+<a name="399"><span class="lineNum"> 399 </span> : : uint8_t lmb_size;</a>
+<a name="400"><span class="lineNum"> 400 </span> : : uint8_t deprecated;</a>
+<a name="401"><span class="lineNum"> 401 </span> : : __be32 max_hsl_opticonnect;</a>
+<a name="402"><span class="lineNum"> 402 </span> : : __be32 other_attrib;</a>
+<a name="403"><span class="lineNum"> 403 </span> : : #define IPLPARAMS_OATTR_RST_PCI_BUSNO 0x08000000</a>
+<a name="404"><span class="lineNum"> 404 </span> : : #define IPLPARAMS_OATTR_CLEAR_NVRAM 0x04000000</a>
+<a name="405"><span class="lineNum"> 405 </span> : : #define IPLPARAMS_OATRR_LIGHT_PATH 0x00000004</a>
+<a name="406"><span class="lineNum"> 406 </span> : : __be16 huge_page_count;</a>
+<a name="407"><span class="lineNum"> 407 </span> : : uint8_t huge_page_size;</a>
+<a name="408"><span class="lineNum"> 408 </span> : : #define IPLPARAMS_HUGE_PG_SIZE_16G 0</a>
+<a name="409"><span class="lineNum"> 409 </span> : : uint8_t num_vlan_switches;</a>
+<a name="410"><span class="lineNum"> 410 </span> : : __be32 reserved2;</a>
+<a name="411"><span class="lineNum"> 411 </span> : : __be32 enlarge_io; /* &gt;= 0x5a */</a>
+<a name="412"><span class="lineNum"> 412 </span> : : uint8_t core_config;</a>
+<a name="413"><span class="lineNum"> 413 </span> : : #define IPLPARAMS_CORE_NORMAL 0x00</a>
+<a name="414"><span class="lineNum"> 414 </span> : : #define IPLPARAMS_CORE_FUSE 0x01</a>
+<a name="415"><span class="lineNum"> 415 </span> : : } __packed;</a>
+<a name="416"><span class="lineNum"> 416 </span> : : </a>
+<a name="417"><span class="lineNum"> 417 </span> : : /* Idata index 4: Platform Dump Descriptor */</a>
+<a name="418"><span class="lineNum"> 418 </span> : : #define IPLPARAMS_PLATFORM_DUMP 4</a>
+<a name="419"><span class="lineNum"> 419 </span> : : </a>
+<a name="420"><span class="lineNum"> 420 </span> : : struct iplparams_dump {</a>
+<a name="421"><span class="lineNum"> 421 </span> : : __be16 flags;</a>
+<a name="422"><span class="lineNum"> 422 </span> : : uint8_t reserved1;</a>
+<a name="423"><span class="lineNum"> 423 </span> : : uint8_t policy;</a>
+<a name="424"><span class="lineNum"> 424 </span> : : #define HYP_DUMP_POLICY_NORMAL 0x00</a>
+<a name="425"><span class="lineNum"> 425 </span> : : __be32 dump_id;</a>
+<a name="426"><span class="lineNum"> 426 </span> : : __be64 reserved2;</a>
+<a name="427"><span class="lineNum"> 427 </span> : : __be64 act_dump_sz;</a>
+<a name="428"><span class="lineNum"> 428 </span> : : __be32 max_hw_dump_sz;</a>
+<a name="429"><span class="lineNum"> 429 </span> : : __be32 act_hw_dump_sz;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : __be32 max_sp_dump_sz;</a>
+<a name="431"><span class="lineNum"> 431 </span> : : __be32 plid;</a>
+<a name="432"><span class="lineNum"> 432 </span> : : } __packed;</a>
+<a name="433"><span class="lineNum"> 433 </span> : : </a>
+<a name="434"><span class="lineNum"> 434 </span> : : /* Idata index 8: serial ports */</a>
+<a name="435"><span class="lineNum"> 435 </span> : : #define IPLPARMS_IDATA_SERIAL 8</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> : : /* An HDIF array of serial descriptions */</a>
+<a name="438"><span class="lineNum"> 438 </span> : : struct iplparms_serial {</a>
+<a name="439"><span class="lineNum"> 439 </span> : : uint8_t loc_code[LOC_CODE_SIZE];</a>
+<a name="440"><span class="lineNum"> 440 </span> : : __be16 rsrc_id;</a>
+<a name="441"><span class="lineNum"> 441 </span> : : __be16 flags;</a>
+<a name="442"><span class="lineNum"> 442 </span> : : #define PLPARMS_SERIAL_FLAGS_CALLHOME 0x8000</a>
+<a name="443"><span class="lineNum"> 443 </span> : : } __packed;</a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> : : /* Idata index 9: FW features */</a>
+<a name="446"><span class="lineNum"> 446 </span> : : #define IPLPARAMS_FEATURES 9</a>
+<a name="447"><span class="lineNum"> 447 </span> : : struct iplparams_feature {</a>
+<a name="448"><span class="lineNum"> 448 </span> : : char name[64];</a>
+<a name="449"><span class="lineNum"> 449 </span> : : __be64 flags;</a>
+<a name="450"><span class="lineNum"> 450 </span> : : } __packed;</a>
+<a name="451"><span class="lineNum"> 451 </span> : : </a>
+<a name="452"><span class="lineNum"> 452 </span> : : /*</a>
+<a name="453"><span class="lineNum"> 453 </span> : : * Chip TOD structure</a>
+<a name="454"><span class="lineNum"> 454 </span> : : *</a>
+<a name="455"><span class="lineNum"> 455 </span> : : * This is an array of 32 entries (I assume per possible chip)</a>
+<a name="456"><span class="lineNum"> 456 </span> : : */</a>
+<a name="457"><span class="lineNum"> 457 </span> : : </a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* Idata index 0: Chip ID data (array) */</a>
+<a name="459"><span class="lineNum"> 459 </span> : : #define CHIPTOD_IDATA_CHIPID 0</a>
+<a name="460"><span class="lineNum"> 460 </span> : : </a>
+<a name="461"><span class="lineNum"> 461 </span> : : struct chiptod_chipid {</a>
+<a name="462"><span class="lineNum"> 462 </span> : : __be32 chip_id;</a>
+<a name="463"><span class="lineNum"> 463 </span> : : __be32 flags;</a>
+<a name="464"><span class="lineNum"> 464 </span> : : #define CHIPTOD_ID_FLAGS_PRIMARY 0x02</a>
+<a name="465"><span class="lineNum"> 465 </span> : : #define CHIPTOD_ID_FLAGS_SECONDARY 0x01</a>
+<a name="466"><span class="lineNum"> 466 </span> : : #define CHIPTOD_ID_FLAGS_STATUS_MASK 0x0c</a>
+<a name="467"><span class="lineNum"> 467 </span> : : #define CHIPTOD_ID_FLAGS_STATUS_OK 0x04</a>
+<a name="468"><span class="lineNum"> 468 </span> : : #define CHIPTOD_ID_FLAGS_STATUS_NOK 0x08</a>
+<a name="469"><span class="lineNum"> 469 </span> : : } __packed;</a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> : : /* Idata index 0: Chip Initialization data */</a>
+<a name="472"><span class="lineNum"> 472 </span> : : #define CHIPTOD_IDATA_CHIPINIT 1</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> : : struct chiptod_chipinit {</a>
+<a name="475"><span class="lineNum"> 475 </span> : : __be32 ctrl_reg_internal;</a>
+<a name="476"><span class="lineNum"> 476 </span> : : __be32 tod_ctrl_reg;</a>
+<a name="477"><span class="lineNum"> 477 </span> : : } __packed;</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> : : /*</a>
+<a name="480"><span class="lineNum"> 480 </span> : : * MS VPD - Memory Description Tree</a>
+<a name="481"><span class="lineNum"> 481 </span> : : *</a>
+<a name="482"><span class="lineNum"> 482 </span> : : * One such structure pointing to the various memory arrays</a>
+<a name="483"><span class="lineNum"> 483 </span> : : * along with other infos about the BCRs, Page Mover, XSCOM,...</a>
+<a name="484"><span class="lineNum"> 484 </span> : : */</a>
+<a name="485"><span class="lineNum"> 485 </span> : : #define MSVPD_HDIF_SIG &quot;MS VPD&quot;</a>
+<a name="486"><span class="lineNum"> 486 </span> : : </a>
+<a name="487"><span class="lineNum"> 487 </span> : : /* Idata index 0: Mainstore address config */</a>
+<a name="488"><span class="lineNum"> 488 </span> : : #define MSVPD_IDATA_MS_ADDR_CONFIG 0</a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> : : /* Mainstore Address Configuration */</a>
+<a name="491"><span class="lineNum"> 491 </span> : : struct msvpd_ms_addr_config {</a>
+<a name="492"><span class="lineNum"> 492 </span> : : __be64 max_configured_ms_address;</a>
+<a name="493"><span class="lineNum"> 493 </span> : : __be64 max_possible_ms_address;</a>
+<a name="494"><span class="lineNum"> 494 </span> : : __be32 deprecated;</a>
+<a name="495"><span class="lineNum"> 495 </span> : : __be64 mirrorable_memory_starting_address;</a>
+<a name="496"><span class="lineNum"> 496 </span> : : } __packed;</a>
+<a name="497"><span class="lineNum"> 497 </span> : : </a>
+<a name="498"><span class="lineNum"> 498 </span> : : /* Idata index 1: Total configured mainstore */</a>
+<a name="499"><span class="lineNum"> 499 </span> : : #define MSVPD_IDATA_TOTAL_CONFIG_MS 1</a>
+<a name="500"><span class="lineNum"> 500 </span> : : </a>
+<a name="501"><span class="lineNum"> 501 </span> : : struct msvpd_total_config_ms {</a>
+<a name="502"><span class="lineNum"> 502 </span> : : __be64 total_in_mb;</a>
+<a name="503"><span class="lineNum"> 503 </span> : : } __packed;</a>
+<a name="504"><span class="lineNum"> 504 </span> : : </a>
+<a name="505"><span class="lineNum"> 505 </span> : : /* Idata index 2: Page mover and sync structure */</a>
+<a name="506"><span class="lineNum"> 506 </span> : : #define MSVPD_IDATA_PMOVER_SYNCHRO 2</a>
+<a name="507"><span class="lineNum"> 507 </span> : : </a>
+<a name="508"><span class="lineNum"> 508 </span> : : struct msvpd_pmover_bsr_synchro {</a>
+<a name="509"><span class="lineNum"> 509 </span> : : __be32 flags;</a>
+<a name="510"><span class="lineNum"> 510 </span> : : #define MSVPD_PMS_FLAG_HWLOCK_EN 0x80000000</a>
+<a name="511"><span class="lineNum"> 511 </span> : : #define MSVPD_PMS_FLAG_PMOVER_EN 0x40000000</a>
+<a name="512"><span class="lineNum"> 512 </span> : : #define MSVPD_PMS_FLAG_BSR_EN 0x20000000</a>
+<a name="513"><span class="lineNum"> 513 </span> : : #define MSVPD_PMS_FLAG_XSCOMBASE_VALID 0x10000000</a>
+<a name="514"><span class="lineNum"> 514 </span> : : __be32 hwlocks_per_page;</a>
+<a name="515"><span class="lineNum"> 515 </span> : : __be64 hwlock_addr;</a>
+<a name="516"><span class="lineNum"> 516 </span> : : __be64 pmover_addr;</a>
+<a name="517"><span class="lineNum"> 517 </span> : : __be64 bsr_addr;</a>
+<a name="518"><span class="lineNum"> 518 </span> : : __be64 xscom_addr;</a>
+<a name="519"><span class="lineNum"> 519 </span> : : } __packed;</a>
+<a name="520"><span class="lineNum"> 520 </span> : : </a>
+<a name="521"><span class="lineNum"> 521 </span> : : /* Idata index 3: Memory Trace Array */</a>
+<a name="522"><span class="lineNum"> 522 </span> : : #define MSVPD_IDATA_TRACE_AREAS 3</a>
+<a name="523"><span class="lineNum"> 523 </span> : : struct msvpd_trace {</a>
+<a name="524"><span class="lineNum"> 524 </span> : : __be64 start, end;</a>
+<a name="525"><span class="lineNum"> 525 </span> : : char reserved[16];</a>
+<a name="526"><span class="lineNum"> 526 </span> : : };</a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> : : /* Idata index 4: UE Address Array */</a>
+<a name="529"><span class="lineNum"> 529 </span> : : </a>
+<a name="530"><span class="lineNum"> 530 </span> : : /* Idata index 5: Hostboot reserved memory address range */</a>
+<a name="531"><span class="lineNum"> 531 </span> : : #define MSVPD_IDATA_HB_RESERVED_MEM 5</a>
+<a name="532"><span class="lineNum"> 532 </span> : : #define HB_RESERVE_MEM_LABEL_SIZE 64</a>
+<a name="533"><span class="lineNum"> 533 </span> : : struct msvpd_hb_reserved_mem {</a>
+<a name="534"><span class="lineNum"> 534 </span> : : #define MSVPD_HBRMEM_RANGE_TYPE PPC_BITMASK32(0,7)</a>
+<a name="535"><span class="lineNum"> 535 </span> : : #define HBRMEM_CONTAINER_VERIFICATION_CODE 0x3</a>
+<a name="536"><span class="lineNum"> 536 </span> : : __be32 type_instance;</a>
+<a name="537"><span class="lineNum"> 537 </span> : : __be64 start_addr;</a>
+<a name="538"><span class="lineNum"> 538 </span> : : __be64 end_addr;</a>
+<a name="539"><span class="lineNum"> 539 </span> : : __be32 label_size;</a>
+<a name="540"><span class="lineNum"> 540 </span> : : uint8_t label[HB_RESERVE_MEM_LABEL_SIZE];</a>
+<a name="541"><span class="lineNum"> 541 </span> : : uint8_t rw_perms;</a>
+<a name="542"><span class="lineNum"> 542 </span> : : #define HB_RESERVE_READABLE 0x80</a>
+<a name="543"><span class="lineNum"> 543 </span> : : #define HB_RESERVE_WRITEABLE 0x40</a>
+<a name="544"><span class="lineNum"> 544 </span> : : uint8_t reserved[7];</a>
+<a name="545"><span class="lineNum"> 545 </span> : : } __packed;</a>
+<a name="546"><span class="lineNum"> 546 </span> : : </a>
+<a name="547"><span class="lineNum"> 547 </span> : : /* Child index 0: MS area child structure */</a>
+<a name="548"><span class="lineNum"> 548 </span> : : #define MSVPD_CHILD_MS_AREAS 0</a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> : : /*</a>
+<a name="551"><span class="lineNum"> 551 </span> : : * CEC I/O Hub FRU</a>
+<a name="552"><span class="lineNum"> 552 </span> : : *</a>
+<a name="553"><span class="lineNum"> 553 </span> : : * This is an array of CEC Hub FRU HDIF structures</a>
+<a name="554"><span class="lineNum"> 554 </span> : : *</a>
+<a name="555"><span class="lineNum"> 555 </span> : : * Each of these has some idata pointers to generic info about the</a>
+<a name="556"><span class="lineNum"> 556 </span> : : * hub and a possible child pointer for daughter card.</a>
+<a name="557"><span class="lineNum"> 557 </span> : : *</a>
+<a name="558"><span class="lineNum"> 558 </span> : : * Actual ports are in the SLCA and need to be cross referenced</a>
+<a name="559"><span class="lineNum"> 559 </span> : : *</a>
+<a name="560"><span class="lineNum"> 560 </span> : : * Note that slots meant for the addition of GX+ adapters that</a>
+<a name="561"><span class="lineNum"> 561 </span> : : * are currently unpopulated but support hotplug will have a</a>
+<a name="562"><span class="lineNum"> 562 </span> : : * minimum &quot;placeholder&quot; entry, which will be fully populated</a>
+<a name="563"><span class="lineNum"> 563 </span> : : * when the array is rebuild during concurrent maintenance.</a>
+<a name="564"><span class="lineNum"> 564 </span> : : * This &quot;placeholder&quot; is called a &quot;reservation&quot;.</a>
+<a name="565"><span class="lineNum"> 565 </span> : : *</a>
+<a name="566"><span class="lineNum"> 566 </span> : : * WARNING: The array rebuild by concurrent maintenance is not</a>
+<a name="567"><span class="lineNum"> 567 </span> : : * guaranteed to be in the same order as the IPL array, not is</a>
+<a name="568"><span class="lineNum"> 568 </span> : : * the order stable between concurrent maintenance operations.</a>
+<a name="569"><span class="lineNum"> 569 </span> : : *</a>
+<a name="570"><span class="lineNum"> 570 </span> : : * There's also a child pointer to daughter card structures but</a>
+<a name="571"><span class="lineNum"> 571 </span> : : * we aren't going to handle that just yet.</a>
+<a name="572"><span class="lineNum"> 572 </span> : : */</a>
+<a name="573"><span class="lineNum"> 573 </span> : : #define CECHUB_FRU_HDIF_SIG &quot;IO HUB&quot;</a>
+<a name="574"><span class="lineNum"> 574 </span> : : #define IOKID_FRU_HDIF_SIG &quot;IO KID&quot;</a>
+<a name="575"><span class="lineNum"> 575 </span> : : #define IOSLOT_FRU_HDIF_SIG &quot;IOSLOT&quot;</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> : : /* Idata index 0: FRU ID data</a>
+<a name="578"><span class="lineNum"> 578 </span> : : *</a>
+<a name="579"><span class="lineNum"> 579 </span> : : * This is a generic struct spira_fru_id defined above</a>
+<a name="580"><span class="lineNum"> 580 </span> : : */</a>
+<a name="581"><span class="lineNum"> 581 </span> : : #define CECHUB_FRU_ID_DATA 0</a>
+<a name="582"><span class="lineNum"> 582 </span> : : </a>
+<a name="583"><span class="lineNum"> 583 </span> : : /* Idata index 1: ASCII Keyword VPD */</a>
+<a name="584"><span class="lineNum"> 584 </span> : : #define CECHUB_ASCII_KEYWORD_VPD 1</a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> : : /* Idata index 2: Hub FRU ID data area */</a>
+<a name="587"><span class="lineNum"> 587 </span> : : #define CECHUB_FRU_ID_DATA_AREA 2</a>
+<a name="588"><span class="lineNum"> 588 </span> : : </a>
+<a name="589"><span class="lineNum"> 589 </span> : : struct cechub_hub_fru_id {</a>
+<a name="590"><span class="lineNum"> 590 </span> : : __be32 card_type;</a>
+<a name="591"><span class="lineNum"> 591 </span> : : #define CECHUB_FRU_TYPE_IOHUB_RSRV 0</a>
+<a name="592"><span class="lineNum"> 592 </span> : : #define CECHUB_FRU_TYPE_IOHUB_CARD 1</a>
+<a name="593"><span class="lineNum"> 593 </span> : : #define CECHUB_FRU_TYPE_CPU_CARD 2</a>
+<a name="594"><span class="lineNum"> 594 </span> : : #define CECHUB_FRU_TYPE_CEC_BKPLANE 3</a>
+<a name="595"><span class="lineNum"> 595 </span> : : #define CECHUB_FRU_TYPE_BKPLANE_EXT 4</a>
+<a name="596"><span class="lineNum"> 596 </span> : : __be32 unused;</a>
+<a name="597"><span class="lineNum"> 597 </span> : : __be16 total_chips;</a>
+<a name="598"><span class="lineNum"> 598 </span> : : uint8_t flags;</a>
+<a name="599"><span class="lineNum"> 599 </span> : : #define CECHUB_FRU_FLAG_HEADLESS 0x80 /* not connected to CPU */</a>
+<a name="600"><span class="lineNum"> 600 </span> : : #define CECHUB_FRU_FLAG_PASSTHROUGH 0x40 /* connected to passhtrough</a>
+<a name="601"><span class="lineNum"> 601 </span> : : port of another hub */</a>
+<a name="602"><span class="lineNum"> 602 </span> : : uint8_t reserved;</a>
+<a name="603"><span class="lineNum"> 603 </span> : : __be16 parent_hub_id; /* chip instance number of the</a>
+<a name="604"><span class="lineNum"> 604 </span> : : hub that contains the passthrough</a>
+<a name="605"><span class="lineNum"> 605 </span> : : port this one is connected to */</a>
+<a name="606"><span class="lineNum"> 606 </span> : : __be16 reserved2;</a>
+<a name="607"><span class="lineNum"> 607 </span> : : } __packed;</a>
+<a name="608"><span class="lineNum"> 608 </span> : : </a>
+<a name="609"><span class="lineNum"> 609 </span> : : </a>
+<a name="610"><span class="lineNum"> 610 </span> : : /* Idata index 3: IO HUB array */</a>
+<a name="611"><span class="lineNum"> 611 </span> : : </a>
+<a name="612"><span class="lineNum"> 612 </span> : : #define CECHUB_FRU_IO_HUBS 3</a>
+<a name="613"><span class="lineNum"> 613 </span> : : </a>
+<a name="614"><span class="lineNum"> 614 </span> : : /* This is an HDIF array of IO Hub structures */</a>
+<a name="615"><span class="lineNum"> 615 </span> : : struct cechub_io_hub {</a>
+<a name="616"><span class="lineNum"> 616 </span> : : __be64 fmtc_address;</a>
+<a name="617"><span class="lineNum"> 617 </span> : : __be32 fmtc_tce_size;</a>
+<a name="618"><span class="lineNum"> 618 </span> : : __be16 hub_num; /* unique hub number (I/O Hub ID) */</a>
+<a name="619"><span class="lineNum"> 619 </span> : : uint8_t flags;</a>
+<a name="620"><span class="lineNum"> 620 </span> : : #define CECHUB_HUB_FLAG_STATE_MASK 0xc0</a>
+<a name="621"><span class="lineNum"> 621 </span> : : #define CECHUB_HUB_FLAG_STATE_OK 0x00</a>
+<a name="622"><span class="lineNum"> 622 </span> : : #define CECHUB_HUB_FLAG_STATE_FAILURES 0x40</a>
+<a name="623"><span class="lineNum"> 623 </span> : : #define CECHUB_HUB_FLAG_STATE_NOT_INST 0x80</a>
+<a name="624"><span class="lineNum"> 624 </span> : : #define CECHUB_HUB_FLAG_STATE_UNUSABLE 0xc0</a>
+<a name="625"><span class="lineNum"> 625 </span> : : #define CECHUB_HUB_FLAG_MASTER_HUB 0x20 /* HDAT &lt; v9.x only */</a>
+<a name="626"><span class="lineNum"> 626 </span> : : #define CECHUB_HUB_FLAG_GARD_MASK_VALID 0x08 /* HDAT &lt; v9.x only */</a>
+<a name="627"><span class="lineNum"> 627 </span> : : #define CECHUB_HUB_FLAG_SWITCH_MASK_PDT 0x04 /* HDAT &lt; v9.x only */</a>
+<a name="628"><span class="lineNum"> 628 </span> : : #define CECHUB_HUB_FLAG_FAB_BR0_PDT 0x02 /* HDAT &lt; v9.x only */</a>
+<a name="629"><span class="lineNum"> 629 </span> : : #define CECHUB_HUB_FLAG_FAB_BR1_PDT 0x01 /* HDAT &lt; v9.x only */</a>
+<a name="630"><span class="lineNum"> 630 </span> : : uint8_t nr_ports; /* HDAT &lt; v9.x only */</a>
+<a name="631"><span class="lineNum"> 631 </span> : : uint8_t fab_br0_pdt; /* p5ioc2 PCI-X or P8 PHB3's */</a>
+<a name="632"><span class="lineNum"> 632 </span> : : #define CECHUB_HUB_FAB_BR0_PDT_PHB0 0x80</a>
+<a name="633"><span class="lineNum"> 633 </span> : : #define CECHUB_HUB_FAB_BR0_PDT_PHB1 0x40</a>
+<a name="634"><span class="lineNum"> 634 </span> : : #define CECHUB_HUB_FAB_BR0_PDT_PHB2 0x20</a>
+<a name="635"><span class="lineNum"> 635 </span> : : #define CECHUB_HUB_FAB_BR0_PDT_PHB3 0x10</a>
+<a name="636"><span class="lineNum"> 636 </span> : : #define CECHUB_HUB_FAB_BR0_PDT_PHB4 0x08</a>
+<a name="637"><span class="lineNum"> 637 </span> : : #define CECHUB_HUB_FAB_BR0_PDT_PHB5 0x04</a>
+<a name="638"><span class="lineNum"> 638 </span> : : uint8_t fab_br1_pdt; /* p5ioc2 &amp; p7ioc PCI-E */</a>
+<a name="639"><span class="lineNum"> 639 </span> : : #define CECHUB_HUB_FAB_BR1_PDT_PHB0 0x80</a>
+<a name="640"><span class="lineNum"> 640 </span> : : #define CECHUB_HUB_FAB_BR1_PDT_PHB1 0x40</a>
+<a name="641"><span class="lineNum"> 641 </span> : : #define CECHUB_HUB_FAB_BR1_PDT_PHB2 0x20</a>
+<a name="642"><span class="lineNum"> 642 </span> : : #define CECHUB_HUB_FAB_BR1_PDT_PHB3 0x10</a>
+<a name="643"><span class="lineNum"> 643 </span> : : #define CECHUB_HUB_FAB_BR1_PDT_PHB4 0x08 /* p7ioc only */</a>
+<a name="644"><span class="lineNum"> 644 </span> : : #define CECHUB_HUB_FAB_BR1_PDT_PHB5 0x04 /* p7ioc only */</a>
+<a name="645"><span class="lineNum"> 645 </span> : : __be16 iohub_id; /* the type of hub */</a>
+<a name="646"><span class="lineNum"> 646 </span> : : #define CECHUB_HUB_MURANO 0x20ef /* Murano from spec */</a>
+<a name="647"><span class="lineNum"> 647 </span> : : #define CECHUB_HUB_MURANO_SEGU 0x0001 /* Murano+Seguso from spec */</a>
+<a name="648"><span class="lineNum"> 648 </span> : : #define CECHUB_HUB_VENICE_WYATT 0x0010 /* Venice+Wyatt from spec */</a>
+<a name="649"><span class="lineNum"> 649 </span> : : #define CECHUB_HUB_NIMBUS_SFORAZ 0x0020 /* Nimbus+sforaz from spec */</a>
+<a name="650"><span class="lineNum"> 650 </span> : : #define CECHUB_HUB_NIMBUS_MONZA 0x0021 /* Nimbus+monza from spec */</a>
+<a name="651"><span class="lineNum"> 651 </span> : : #define CECHUB_HUB_NIMBUS_LAGRANGE 0x0022 /* Nimbus+lagrange from spec */</a>
+<a name="652"><span class="lineNum"> 652 </span> : : #define CECHUB_HUB_CUMULUS_DUOMO 0x0030 /* cumulus+duomo from spec */</a>
+<a name="653"><span class="lineNum"> 653 </span> : : #define CECHUB_HUB_AXONE_HOPPER 0x0040 /* axone+hopper */</a>
+<a name="654"><span class="lineNum"> 654 </span> : : __be32 ec_level;</a>
+<a name="655"><span class="lineNum"> 655 </span> : : __be32 aff_dom2; /* HDAT &lt; v9.x only */</a>
+<a name="656"><span class="lineNum"> 656 </span> : : __be32 aff_dom3; /* HDAT &lt; v9.x only */</a>
+<a name="657"><span class="lineNum"> 657 </span> : : __be64 reserved;</a>
+<a name="658"><span class="lineNum"> 658 </span> : : __be32 proc_chip_id;</a>
+<a name="659"><span class="lineNum"> 659 </span> : : </a>
+<a name="660"><span class="lineNum"> 660 </span> : : union {</a>
+<a name="661"><span class="lineNum"> 661 </span> : : /* HDAT &lt; v9.x */</a>
+<a name="662"><span class="lineNum"> 662 </span> : : struct {</a>
+<a name="663"><span class="lineNum"> 663 </span> : : __be32 gx_index; /* GX bus index on cpu */</a>
+<a name="664"><span class="lineNum"> 664 </span> : : __be32 buid_ext; /* BUID Extension */</a>
+<a name="665"><span class="lineNum"> 665 </span> : : __be32 xscom_chip_id; /* TORRENT ONLY */</a>
+<a name="666"><span class="lineNum"> 666 </span> : : };</a>
+<a name="667"><span class="lineNum"> 667 </span> : : /* HDAT &gt;= v9.x */</a>
+<a name="668"><span class="lineNum"> 668 </span> : : struct {</a>
+<a name="669"><span class="lineNum"> 669 </span> : : __be32 reserved1;</a>
+<a name="670"><span class="lineNum"> 670 </span> : : __be32 reserved2;</a>
+<a name="671"><span class="lineNum"> 671 </span> : : __be16 reserved3;</a>
+<a name="672"><span class="lineNum"> 672 </span> : : __be16 hw_topology;</a>
+<a name="673"><span class="lineNum"> 673 </span> : : };</a>
+<a name="674"><span class="lineNum"> 674 </span> : : };</a>
+<a name="675"><span class="lineNum"> 675 </span> : : __be32 mrid;</a>
+<a name="676"><span class="lineNum"> 676 </span> : : __be32 mem_map_vers;</a>
+<a name="677"><span class="lineNum"> 677 </span> : : union {</a>
+<a name="678"><span class="lineNum"> 678 </span> : : /* HDAT &lt; v9.x */</a>
+<a name="679"><span class="lineNum"> 679 </span> : : struct {</a>
+<a name="680"><span class="lineNum"> 680 </span> : : __be64 gx_ctrl_bar0;</a>
+<a name="681"><span class="lineNum"> 681 </span> : : __be64 gx_ctrl_bar1;</a>
+<a name="682"><span class="lineNum"> 682 </span> : : __be64 gx_ctrl_bar2;</a>
+<a name="683"><span class="lineNum"> 683 </span> : : __be64 gx_ctrl_bar3;</a>
+<a name="684"><span class="lineNum"> 684 </span> : : __be64 gx_ctrl_bar4;</a>
+<a name="685"><span class="lineNum"> 685 </span> : : __be32 sw_mask_pdt;</a>
+<a name="686"><span class="lineNum"> 686 </span> : : __be16 gard_mask;</a>
+<a name="687"><span class="lineNum"> 687 </span> : : __be16 gx_bus_speed; /* Version 0x58 */</a>
+<a name="688"><span class="lineNum"> 688 </span> : : };</a>
+<a name="689"><span class="lineNum"> 689 </span> : : </a>
+<a name="690"><span class="lineNum"> 690 </span> : : /* HDAT &gt;= v9.x, HDIF version 0x6A adds phb_lane_eq with four</a>
+<a name="691"><span class="lineNum"> 691 </span> : : * words per PHB (4 PHBs).</a>
+<a name="692"><span class="lineNum"> 692 </span> : : *</a>
+<a name="693"><span class="lineNum"> 693 </span> : : * HDAT &gt;= 10.x, HDIF version 0x7A adds space for another two</a>
+<a name="694"><span class="lineNum"> 694 </span> : : * two PHBs (6 total) and the gen4 EQ values.</a>
+<a name="695"><span class="lineNum"> 695 </span> : : */</a>
+<a name="696"><span class="lineNum"> 696 </span> : : struct {</a>
+<a name="697"><span class="lineNum"> 697 </span> : : /* Gen 3 PHB eq values, 6 PHBs */</a>
+<a name="698"><span class="lineNum"> 698 </span> : : __be64 phb_lane_eq[6][4];</a>
+<a name="699"><span class="lineNum"> 699 </span> : : </a>
+<a name="700"><span class="lineNum"> 700 </span> : : /* Gen 4 PHB eq values */</a>
+<a name="701"><span class="lineNum"> 701 </span> : : __be64 phb4_lane_eq[6][4];</a>
+<a name="702"><span class="lineNum"> 702 </span> : : };</a>
+<a name="703"><span class="lineNum"> 703 </span> : : };</a>
+<a name="704"><span class="lineNum"> 704 </span> : : } __packed;</a>
+<a name="705"><span class="lineNum"> 705 </span> : : </a>
+<a name="706"><span class="lineNum"> 706 </span> : : /* We support structures as small as 0x68 bytes */</a>
+<a name="707"><span class="lineNum"> 707 </span> : : #define CECHUB_IOHUB_MIN_SIZE 0x68</a>
+<a name="708"><span class="lineNum"> 708 </span> : : </a>
+<a name="709"><span class="lineNum"> 709 </span> : : /* Child index 0: IO Daugther Card */</a>
+<a name="710"><span class="lineNum"> 710 </span> : : #define CECHUB_CHILD_IO_KIDS 0</a>
+<a name="711"><span class="lineNum"> 711 </span> : : </a>
+<a name="712"><span class="lineNum"> 712 </span> : : /* Child index 1: PCIe Slot Mapping Information */</a>
+<a name="713"><span class="lineNum"> 713 </span> : : #define CECHUB_CHILD_IOSLOTS 1</a>
+<a name="714"><span class="lineNum"> 714 </span> : : </a>
+<a name="715"><span class="lineNum"> 715 </span> : : #define IOSLOT_IDATA_SLOTMAP 0</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> : : struct slot_map_entry {</a>
+<a name="718"><span class="lineNum"> 718 </span> : : __be16 entry_id;</a>
+<a name="719"><span class="lineNum"> 719 </span> : : __be16 parent_id;</a>
+<a name="720"><span class="lineNum"> 720 </span> : : uint8_t phb_index; /* only valid for ROOT and SWITCH_UP */</a>
+<a name="721"><span class="lineNum"> 721 </span> : : </a>
+<a name="722"><span class="lineNum"> 722 </span> : : uint8_t type;</a>
+<a name="723"><span class="lineNum"> 723 </span> : : #define SLOT_TYPE_ROOT_COMPLEX 0x0</a>
+<a name="724"><span class="lineNum"> 724 </span> : : #define SLOT_TYPE_SWITCH_UP 0x1</a>
+<a name="725"><span class="lineNum"> 725 </span> : : #define SLOT_TYPE_SWITCH_DOWN 0x2</a>
+<a name="726"><span class="lineNum"> 726 </span> : : #define SLOT_TYPE_BUILTIN 0x3</a>
+<a name="727"><span class="lineNum"> 727 </span> : : </a>
+<a name="728"><span class="lineNum"> 728 </span> : : uint8_t lane_swapped;</a>
+<a name="729"><span class="lineNum"> 729 </span> : : uint8_t reserved;</a>
+<a name="730"><span class="lineNum"> 730 </span> : : __be16 lane_mask;</a>
+<a name="731"><span class="lineNum"> 731 </span> : : __be16 lane_reverse;</a>
+<a name="732"><span class="lineNum"> 732 </span> : : </a>
+<a name="733"><span class="lineNum"> 733 </span> : : /* what can I do with this? reference something under/vpd/ ? */</a>
+<a name="734"><span class="lineNum"> 734 </span> : : __be16 slca_idx;</a>
+<a name="735"><span class="lineNum"> 735 </span> : : </a>
+<a name="736"><span class="lineNum"> 736 </span> : : __be16 mrw_slot_id;</a>
+<a name="737"><span class="lineNum"> 737 </span> : : </a>
+<a name="738"><span class="lineNum"> 738 </span> : : __be32 features;</a>
+<a name="739"><span class="lineNum"> 739 </span> : : #define SLOT_FEAT_SLOT 0x1</a>
+<a name="740"><span class="lineNum"> 740 </span> : : </a>
+<a name="741"><span class="lineNum"> 741 </span> : : uint8_t up_port;</a>
+<a name="742"><span class="lineNum"> 742 </span> : : uint8_t down_port; /* the switch port this device is attached to */</a>
+<a name="743"><span class="lineNum"> 743 </span> : : </a>
+<a name="744"><span class="lineNum"> 744 </span> : : __be32 vendor_id;</a>
+<a name="745"><span class="lineNum"> 745 </span> : : __be32 device_id;</a>
+<a name="746"><span class="lineNum"> 746 </span> : : __be32 sub_vendor_id;</a>
+<a name="747"><span class="lineNum"> 747 </span> : : __be32 sub_device_id;</a>
+<a name="748"><span class="lineNum"> 748 </span> : : char name[8];</a>
+<a name="749"><span class="lineNum"> 749 </span> : : } __packed;</a>
+<a name="750"><span class="lineNum"> 750 </span> : : </a>
+<a name="751"><span class="lineNum"> 751 </span> : : #define IOSLOT_IDATA_DETAILS 1</a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> : : struct slot_map_details {</a>
+<a name="754"><span class="lineNum"> 754 </span> : : __be16 entry;</a>
+<a name="755"><span class="lineNum"> 755 </span> : : </a>
+<a name="756"><span class="lineNum"> 756 </span> : : /* Phyp junk, ignore */</a>
+<a name="757"><span class="lineNum"> 757 </span> : : uint8_t mgc_load_source;</a>
+<a name="758"><span class="lineNum"> 758 </span> : : uint8_t hddw_order;</a>
+<a name="759"><span class="lineNum"> 759 </span> : : __be16 mmio_size_32; /* In MB */</a>
+<a name="760"><span class="lineNum"> 760 </span> : : __be16 mmio_size_64;</a>
+<a name="761"><span class="lineNum"> 761 </span> : : __be16 dma_size_32;</a>
+<a name="762"><span class="lineNum"> 762 </span> : : __be16 dma_size_64;</a>
+<a name="763"><span class="lineNum"> 763 </span> : : </a>
+<a name="764"><span class="lineNum"> 764 </span> : : uint8_t power_ctrl_type; /* slot power control source */</a>
+<a name="765"><span class="lineNum"> 765 </span> : : #define SLOT_PWR_NONE 0x0</a>
+<a name="766"><span class="lineNum"> 766 </span> : : #define SLOT_PWR_I2C 0x1</a>
+<a name="767"><span class="lineNum"> 767 </span> : : </a>
+<a name="768"><span class="lineNum"> 768 </span> : : uint8_t presence_det_type; /* slot presence detect source */</a>
+<a name="769"><span class="lineNum"> 769 </span> : : #define SLOT_PRESENCE_NONE 0x0</a>
+<a name="770"><span class="lineNum"> 770 </span> : : #define SLOT_PRESENCE_PCI 0x1</a>
+<a name="771"><span class="lineNum"> 771 </span> : : #define SLOT_PRESENCE_I2C 0x2</a>
+<a name="772"><span class="lineNum"> 772 </span> : : </a>
+<a name="773"><span class="lineNum"> 773 </span> : : uint8_t perst_ctl_type; /* slot PERST source */</a>
+<a name="774"><span class="lineNum"> 774 </span> : : #define SLOT_PERST_NONE 0x0</a>
+<a name="775"><span class="lineNum"> 775 </span> : : #define SLOT_PERST_PHB_OR_SW 0x1</a>
+<a name="776"><span class="lineNum"> 776 </span> : : #define SLOT_PERST_SW_GPIO 0x2</a>
+<a name="777"><span class="lineNum"> 777 </span> : : uint8_t perst_gpio;</a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> : : __be16 max_power; /* in W? */</a>
+<a name="780"><span class="lineNum"> 780 </span> : : </a>
+<a name="781"><span class="lineNum"> 781 </span> : : __be32 slot_caps;</a>
+<a name="782"><span class="lineNum"> 782 </span> : : #define SLOT_CAP_LSI 0x01 /* phyp junk? */</a>
+<a name="783"><span class="lineNum"> 783 </span> : : #define SLOT_CAP_CAPI 0x02</a>
+<a name="784"><span class="lineNum"> 784 </span> : : #define SLOT_CAP_CCARD 0x04</a>
+<a name="785"><span class="lineNum"> 785 </span> : : #define SLOT_CAP_HOTPLUG 0x08</a>
+<a name="786"><span class="lineNum"> 786 </span> : : #define SLOT_CAP_SRIOV 0x10 /* phyp junk */</a>
+<a name="787"><span class="lineNum"> 787 </span> : : #define SLOT_CAP_ELLOCO 0x20 /* why is this seperate from the nvlink cap? */</a>
+<a name="788"><span class="lineNum"> 788 </span> : : #define SLOT_CAP_NVLINK 0x30</a>
+<a name="789"><span class="lineNum"> 789 </span> : : </a>
+<a name="790"><span class="lineNum"> 790 </span> : : __be16 reserved1;</a>
+<a name="791"><span class="lineNum"> 791 </span> : : </a>
+<a name="792"><span class="lineNum"> 792 </span> : : /* I2C Link IDs */</a>
+<a name="793"><span class="lineNum"> 793 </span> : : __be32 i2c_power_ctl;</a>
+<a name="794"><span class="lineNum"> 794 </span> : : __be32 i2c_pgood;</a>
+<a name="795"><span class="lineNum"> 795 </span> : : __be32 i2c_cable_card; /* opencapi presence detect? */</a>
+<a name="796"><span class="lineNum"> 796 </span> : : __be32 i2c_mex_fpga;</a>
+<a name="797"><span class="lineNum"> 797 </span> : : };</a>
+<a name="798"><span class="lineNum"> 798 </span> : : </a>
+<a name="799"><span class="lineNum"> 799 </span> : : /*</a>
+<a name="800"><span class="lineNum"> 800 </span> : : * IO KID is a dauther card structure</a>
+<a name="801"><span class="lineNum"> 801 </span> : : */</a>
+<a name="802"><span class="lineNum"> 802 </span> : : #define IOKID_FRU_ID_DATA 0</a>
+<a name="803"><span class="lineNum"> 803 </span> : : #define IOKID_KW_VPD 1</a>
+<a name="804"><span class="lineNum"> 804 </span> : : </a>
+<a name="805"><span class="lineNum"> 805 </span> : : /*</a>
+<a name="806"><span class="lineNum"> 806 </span> : : * CPU Controls Legacy Structure</a>
+<a name="807"><span class="lineNum"> 807 </span> : : */</a>
+<a name="808"><span class="lineNum"> 808 </span> : : struct cpu_ctl_legacy {</a>
+<a name="809"><span class="lineNum"> 809 </span> : : __be64 addr;</a>
+<a name="810"><span class="lineNum"> 810 </span> : : __be64 size;</a>
+<a name="811"><span class="lineNum"> 811 </span> : : } __packed;</a>
+<a name="812"><span class="lineNum"> 812 </span> : : </a>
+<a name="813"><span class="lineNum"> 813 </span> : : /*</a>
+<a name="814"><span class="lineNum"> 814 </span> : : * CPU Control Legacy table</a>
+<a name="815"><span class="lineNum"> 815 </span> : : *</a>
+<a name="816"><span class="lineNum"> 816 </span> : : * Format of this table is defined in FIPS PHYP Attn spec.</a>
+<a name="817"><span class="lineNum"> 817 </span> : : */</a>
+<a name="818"><span class="lineNum"> 818 </span> : : struct cpu_ctl_legacy_table {</a>
+<a name="819"><span class="lineNum"> 819 </span> : : struct cpu_ctl_legacy spat;</a>
+<a name="820"><span class="lineNum"> 820 </span> : : struct cpu_ctl_legacy sp_attn_area1;</a>
+<a name="821"><span class="lineNum"> 821 </span> : : struct cpu_ctl_legacy sp_attn_area2;</a>
+<a name="822"><span class="lineNum"> 822 </span> : : struct cpu_ctl_legacy hsr_area;</a>
+<a name="823"><span class="lineNum"> 823 </span> : : struct cpu_ctl_legacy reserved[12];</a>
+<a name="824"><span class="lineNum"> 824 </span> : : } __packed;</a>
+<a name="825"><span class="lineNum"> 825 </span> : : </a>
+<a name="826"><span class="lineNum"> 826 </span> : : /*</a>
+<a name="827"><span class="lineNum"> 827 </span> : : * CPU Controls Header Structure</a>
+<a name="828"><span class="lineNum"> 828 </span> : : */</a>
+<a name="829"><span class="lineNum"> 829 </span> : : #define CPU_CTL_HDIF_SIG &quot;CPUCTL&quot;</a>
+<a name="830"><span class="lineNum"> 830 </span> : : struct cpu_ctl_init_data {</a>
+<a name="831"><span class="lineNum"> 831 </span> : : struct HDIF_common_hdr hdr;</a>
+<a name="832"><span class="lineNum"> 832 </span> : : struct HDIF_idata_ptr cpu_ctl;</a>
+<a name="833"><span class="lineNum"> 833 </span> : : uint8_t reserved[8];</a>
+<a name="834"><span class="lineNum"> 834 </span> : : struct cpu_ctl_legacy_table cpu_ctl_lt;</a>
+<a name="835"><span class="lineNum"> 835 </span> : : } __packed __align(0x10);</a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> : : /*</a>
+<a name="838"><span class="lineNum"> 838 </span> : : * Slot Location Code Array (aka SLCA)</a>
+<a name="839"><span class="lineNum"> 839 </span> : : *</a>
+<a name="840"><span class="lineNum"> 840 </span> : : * This is a pile of location codes referenced by various other</a>
+<a name="841"><span class="lineNum"> 841 </span> : : * structures such as the IO Hubs for things on the CEC. Not</a>
+<a name="842"><span class="lineNum"> 842 </span> : : * everything in there is a physical port. The SLCA is actually</a>
+<a name="843"><span class="lineNum"> 843 </span> : : * a tree which represent the topology of the system.</a>
+<a name="844"><span class="lineNum"> 844 </span> : : *</a>
+<a name="845"><span class="lineNum"> 845 </span> : : * The tree works as follow: A parent has a pointer to the first</a>
+<a name="846"><span class="lineNum"> 846 </span> : : * child. A child has a pointer to its parent. Siblings are</a>
+<a name="847"><span class="lineNum"> 847 </span> : : * consecutive entries.</a>
+<a name="848"><span class="lineNum"> 848 </span> : : *</a>
+<a name="849"><span class="lineNum"> 849 </span> : : * Note: If we ever support concurrent maintenance... this is</a>
+<a name="850"><span class="lineNum"> 850 </span> : : * completely rebuilt, invalidating all indices, though other</a>
+<a name="851"><span class="lineNum"> 851 </span> : : * structures that may reference SLCA by index will be rebuilt</a>
+<a name="852"><span class="lineNum"> 852 </span> : : * as well.</a>
+<a name="853"><span class="lineNum"> 853 </span> : : *</a>
+<a name="854"><span class="lineNum"> 854 </span> : : * Note that a lot of that stuff is based on VPD documentation</a>
+<a name="855"><span class="lineNum"> 855 </span> : : * such as the identification keywords. I will list the ones</a>
+<a name="856"><span class="lineNum"> 856 </span> : : * I manage to figure out without the doc separately.</a>
+<a name="857"><span class="lineNum"> 857 </span> : : */</a>
+<a name="858"><span class="lineNum"> 858 </span> : : #define SLCA_HDIF_SIG &quot;SLCA &quot;</a>
+<a name="859"><span class="lineNum"> 859 </span> : : </a>
+<a name="860"><span class="lineNum"> 860 </span> : : /* Idata index 0 : SLCA root pointer</a>
+<a name="861"><span class="lineNum"> 861 </span> : : *</a>
+<a name="862"><span class="lineNum"> 862 </span> : : * The SLCA array is an HDIF array of all the entries. The tree</a>
+<a name="863"><span class="lineNum"> 863 </span> : : * structure is based on indices inside the entries and order of</a>
+<a name="864"><span class="lineNum"> 864 </span> : : * the entries</a>
+<a name="865"><span class="lineNum"> 865 </span> : : */</a>
+<a name="866"><span class="lineNum"> 866 </span> : : #define SLCA_IDATA_ARRAY 0</a>
+<a name="867"><span class="lineNum"> 867 </span> : : </a>
+<a name="868"><span class="lineNum"> 868 </span> : : #define SLCA_ROOT_INDEX 0</a>
+<a name="869"><span class="lineNum"> 869 </span> : : </a>
+<a name="870"><span class="lineNum"> 870 </span> : : /* Note: An &quot;index&quot; (or idx) is always an index into the SLCA array</a>
+<a name="871"><span class="lineNum"> 871 </span> : : * and &quot;id&quot; is a reference to some other object.</a>
+<a name="872"><span class="lineNum"> 872 </span> : : */</a>
+<a name="873"><span class="lineNum"> 873 </span> : : struct slca_entry {</a>
+<a name="874"><span class="lineNum"> 874 </span> : : __be16 my_index; /* redundant, useful */</a>
+<a name="875"><span class="lineNum"> 875 </span> : : __be16 rsrc_id; /* formerly VPD port number */</a>
+<a name="876"><span class="lineNum"> 876 </span> : : uint8_t fru_id[2]; /* ASCII VPD ID */</a>
+<a name="877"><span class="lineNum"> 877 </span> : : #define SLCA_ROOT_VPD_ID VPD_ID('V','V')</a>
+<a name="878"><span class="lineNum"> 878 </span> : : #define SLCA_SYSTEM_VPD_ID VPD_ID('S','V')</a>
+<a name="879"><span class="lineNum"> 879 </span> : : #define SLCA_SAI_INDICATOR_ID VPD_ID('S','A')</a>
+<a name="880"><span class="lineNum"> 880 </span> : : __be16 parent_index; /* Parent entry index */</a>
+<a name="881"><span class="lineNum"> 881 </span> : : uint8_t flags;</a>
+<a name="882"><span class="lineNum"> 882 </span> : : #define SLCA_FLAG_NON_FUNCTIONAL 0x02 /* For redundant entries */</a>
+<a name="883"><span class="lineNum"> 883 </span> : : #define SLCA_FLAG_IMBEDDED 0x01 /* not set =&gt; pluggable */</a>
+<a name="884"><span class="lineNum"> 884 </span> : : uint8_t old_nr_child; /* Legacy: Nr of children */</a>
+<a name="885"><span class="lineNum"> 885 </span> : : __be16 child_index; /* First child index */</a>
+<a name="886"><span class="lineNum"> 886 </span> : : __be16 child_rsrc_id; /* Resource ID of first child */</a>
+<a name="887"><span class="lineNum"> 887 </span> : : uint8_t loc_code_allen; /* Alloc len of loc code */</a>
+<a name="888"><span class="lineNum"> 888 </span> : : uint8_t loc_code_len; /* Loc code len */</a>
+<a name="889"><span class="lineNum"> 889 </span> : : uint8_t loc_code[LOC_CODE_SIZE]; /* NULL terminated (thus max 79 chr) */</a>
+<a name="890"><span class="lineNum"> 890 </span> : : __be16 first_dup_idx; /* First redundant resource index */</a>
+<a name="891"><span class="lineNum"> 891 </span> : : uint8_t nr_dups; /* Number of redundant entries */</a>
+<a name="892"><span class="lineNum"> 892 </span> : : uint8_t reserved;</a>
+<a name="893"><span class="lineNum"> 893 </span> : : __be16 nr_child; /* New version */</a>
+<a name="894"><span class="lineNum"> 894 </span> : : uint8_t install_indic; /* Installed indicator */</a>
+<a name="895"><span class="lineNum"> 895 </span> : : #define SLCA_INSTALL_NO_HW_PDT 1 /* No HW presence detect */</a>
+<a name="896"><span class="lineNum"> 896 </span> : : #define SLCA_INSTALL_INSTALLED 2</a>
+<a name="897"><span class="lineNum"> 897 </span> : : #define SLCA_INSTALL_NOT_INSTALLED 3</a>
+<a name="898"><span class="lineNum"> 898 </span> : : uint8_t vpd_collected;</a>
+<a name="899"><span class="lineNum"> 899 </span> : : #define SLCA_VPD_COLLECTED 2</a>
+<a name="900"><span class="lineNum"> 900 </span> : : #define SLCA_VPD_NOT_COLLECTED 3</a>
+<a name="901"><span class="lineNum"> 901 </span> : : } __packed;</a>
+<a name="902"><span class="lineNum"> 902 </span> : : </a>
+<a name="903"><span class="lineNum"> 903 </span> : : /*</a>
+<a name="904"><span class="lineNum"> 904 </span> : : * System VPD</a>
+<a name="905"><span class="lineNum"> 905 </span> : : */</a>
+<a name="906"><span class="lineNum"> 906 </span> : : #define SYSVPD_HDIF_SIG &quot;SYSVPD&quot;</a>
+<a name="907"><span class="lineNum"> 907 </span> : : </a>
+<a name="908"><span class="lineNum"> 908 </span> : : /* Idata index 0 : FRU ID Data */</a>
+<a name="909"><span class="lineNum"> 909 </span> : : #define SYSVPD_IDATA_FRU_ID 0</a>
+<a name="910"><span class="lineNum"> 910 </span> : : </a>
+<a name="911"><span class="lineNum"> 911 </span> : : /* Idata index 1 : Keyword VPD */</a>
+<a name="912"><span class="lineNum"> 912 </span> : : #define SYSVPD_IDATA_KW_VPD 1</a>
+<a name="913"><span class="lineNum"> 913 </span> : : </a>
+<a name="914"><span class="lineNum"> 914 </span> : : /* Idata index 2 : Operational status */</a>
+<a name="915"><span class="lineNum"> 915 </span> : : #define SYSVPD_IDATA_OP_STATUS 2</a>
+<a name="916"><span class="lineNum"> 916 </span> : : </a>
+<a name="917"><span class="lineNum"> 917 </span> : : /*</a>
+<a name="918"><span class="lineNum"> 918 </span> : : * FRU keyword VPD structure</a>
+<a name="919"><span class="lineNum"> 919 </span> : : */</a>
+<a name="920"><span class="lineNum"> 920 </span> : : #define FRUVPD_HDIF_SIG &quot;FRUVPD&quot;</a>
+<a name="921"><span class="lineNum"> 921 </span> : : </a>
+<a name="922"><span class="lineNum"> 922 </span> : : /* Idata index 0 : FRU ID Data */</a>
+<a name="923"><span class="lineNum"> 923 </span> : : #define FRUVPD_IDATA_FRU_ID 0</a>
+<a name="924"><span class="lineNum"> 924 </span> : : </a>
+<a name="925"><span class="lineNum"> 925 </span> : : /* Idata index 1 : Keyword VPD */</a>
+<a name="926"><span class="lineNum"> 926 </span> : : #define FRUVPD_IDATA_KW_VPD 1</a>
+<a name="927"><span class="lineNum"> 927 </span> : : </a>
+<a name="928"><span class="lineNum"> 928 </span> : : /* Idata index 2 : Operational status */</a>
+<a name="929"><span class="lineNum"> 929 </span> : : #define FRUVPD_IDATA_OP_STATUS 2</a>
+<a name="930"><span class="lineNum"> 930 </span> : : </a>
+<a name="931"><span class="lineNum"> 931 </span> : : </a>
+<a name="932"><span class="lineNum"> 932 </span> : : /*</a>
+<a name="933"><span class="lineNum"> 933 </span> : : * SPPCIA structure. The SPIRA contain an array of these, one</a>
+<a name="934"><span class="lineNum"> 934 </span> : : * per processor core</a>
+<a name="935"><span class="lineNum"> 935 </span> : : */</a>
+<a name="936"><span class="lineNum"> 936 </span> : : #define SPPCIA_HDIF_SIG &quot;SPPCIA&quot;</a>
+<a name="937"><span class="lineNum"> 937 </span> : : </a>
+<a name="938"><span class="lineNum"> 938 </span> : : /* Idata index 0 : Core unique data */</a>
+<a name="939"><span class="lineNum"> 939 </span> : : #define SPPCIA_IDATA_CORE_UNIQUE 0</a>
+<a name="940"><span class="lineNum"> 940 </span> : : </a>
+<a name="941"><span class="lineNum"> 941 </span> : : struct sppcia_core_unique {</a>
+<a name="942"><span class="lineNum"> 942 </span> : : __be32 reserved;</a>
+<a name="943"><span class="lineNum"> 943 </span> : : __be32 proc_fru_id;</a>
+<a name="944"><span class="lineNum"> 944 </span> : : __be32 hw_proc_id;</a>
+<a name="945"><span class="lineNum"> 945 </span> : : #define CPU_ID_VERIFY_MASK 0xC0000000</a>
+<a name="946"><span class="lineNum"> 946 </span> : : #define CPU_ID_VERIFY_SHIFT 30</a>
+<a name="947"><span class="lineNum"> 947 </span> : : #define CPU_ID_VERIFY_USABLE_NO_FAILURES 0</a>
+<a name="948"><span class="lineNum"> 948 </span> : : #define CPU_ID_VERIFY_USABLE_FAILURES 1</a>
+<a name="949"><span class="lineNum"> 949 </span> : : #define CPU_ID_VERIFY_NOT_INSTALLED 2</a>
+<a name="950"><span class="lineNum"> 950 </span> : : #define CPU_ID_VERIFY_UNUSABLE 3</a>
+<a name="951"><span class="lineNum"> 951 </span> : : #define CPU_ID_SECONDARY_THREAD 0x20000000</a>
+<a name="952"><span class="lineNum"> 952 </span> : : #define CPU_ID_PCIA_RESERVED 0x10000000</a>
+<a name="953"><span class="lineNum"> 953 </span> : : #define CPU_ID_NUM_SECONDARY_THREAD_MASK 0x00FF0000</a>
+<a name="954"><span class="lineNum"> 954 </span> : : #define CPU_ID_NUM_SECONDARY_THREAD_SHIFT 16</a>
+<a name="955"><span class="lineNum"> 955 </span> : : __be32 verif_exist_flags;</a>
+<a name="956"><span class="lineNum"> 956 </span> : : __be32 chip_ec_level;</a>
+<a name="957"><span class="lineNum"> 957 </span> : : __be32 proc_chip_id;</a>
+<a name="958"><span class="lineNum"> 958 </span> : : __be32 reserved2;</a>
+<a name="959"><span class="lineNum"> 959 </span> : : __be32 reserved3;</a>
+<a name="960"><span class="lineNum"> 960 </span> : : __be32 reserved4;</a>
+<a name="961"><span class="lineNum"> 961 </span> : : __be32 hw_module_id;</a>
+<a name="962"><span class="lineNum"> 962 </span> : : __be64 reserved5;</a>
+<a name="963"><span class="lineNum"> 963 </span> : : __be32 reserved6;</a>
+<a name="964"><span class="lineNum"> 964 </span> : : __be32 reserved7;</a>
+<a name="965"><span class="lineNum"> 965 </span> : : __be32 reserved8;</a>
+<a name="966"><span class="lineNum"> 966 </span> : : __be32 ccm_node_id;</a>
+<a name="967"><span class="lineNum"> 967 </span> : : __be32 hw_card_id;</a>
+<a name="968"><span class="lineNum"> 968 </span> : : __be32 internal_drawer_node_id;</a>
+<a name="969"><span class="lineNum"> 969 </span> : : __be32 drawer_book_octant_blade_id;</a>
+<a name="970"><span class="lineNum"> 970 </span> : : __be32 memory_interleaving_scope;</a>
+<a name="971"><span class="lineNum"> 971 </span> : : __be32 lco_target;</a>
+<a name="972"><span class="lineNum"> 972 </span> : : __be32 reserved9;</a>
+<a name="973"><span class="lineNum"> 973 </span> : : } __packed;</a>
+<a name="974"><span class="lineNum"> 974 </span> : : </a>
+<a name="975"><span class="lineNum"> 975 </span> : : /* Idata index 1 : CPU Time base structure */</a>
+<a name="976"><span class="lineNum"> 976 </span> : : #define SPPCIA_IDATA_TIMEBASE 1</a>
+<a name="977"><span class="lineNum"> 977 </span> : : </a>
+<a name="978"><span class="lineNum"> 978 </span> : : struct sppcia_cpu_timebase {</a>
+<a name="979"><span class="lineNum"> 979 </span> : : __be32 cycle_time;</a>
+<a name="980"><span class="lineNum"> 980 </span> : : __be32 time_base;</a>
+<a name="981"><span class="lineNum"> 981 </span> : : __be32 actual_clock_speed;</a>
+<a name="982"><span class="lineNum"> 982 </span> : : __be32 memory_bus_frequency;</a>
+<a name="983"><span class="lineNum"> 983 </span> : : } __packed;</a>
+<a name="984"><span class="lineNum"> 984 </span> : : </a>
+<a name="985"><span class="lineNum"> 985 </span> : : /* Idata index 2 : CPU Cache Size Structure */</a>
+<a name="986"><span class="lineNum"> 986 </span> : : #define SPPCIA_IDATA_CPU_CACHE 2</a>
+<a name="987"><span class="lineNum"> 987 </span> : : </a>
+<a name="988"><span class="lineNum"> 988 </span> : : struct sppcia_cpu_cache {</a>
+<a name="989"><span class="lineNum"> 989 </span> : : __be32 icache_size_kb;</a>
+<a name="990"><span class="lineNum"> 990 </span> : : __be32 icache_line_size;</a>
+<a name="991"><span class="lineNum"> 991 </span> : : __be32 l1_dcache_size_kb;</a>
+<a name="992"><span class="lineNum"> 992 </span> : : __be32 l1_dcache_line_size;</a>
+<a name="993"><span class="lineNum"> 993 </span> : : __be32 l2_dcache_size_kb;</a>
+<a name="994"><span class="lineNum"> 994 </span> : : __be32 l2_line_size;</a>
+<a name="995"><span class="lineNum"> 995 </span> : : __be32 l3_dcache_size_kb;</a>
+<a name="996"><span class="lineNum"> 996 </span> : : __be32 l3_line_size;</a>
+<a name="997"><span class="lineNum"> 997 </span> : : __be32 dcache_block_size;</a>
+<a name="998"><span class="lineNum"> 998 </span> : : __be32 icache_block_size;</a>
+<a name="999"><span class="lineNum"> 999 </span> : : __be32 dcache_assoc_sets;</a>
+<a name="1000"><span class="lineNum"> 1000 </span> : : __be32 icache_assoc_sets;</a>
+<a name="1001"><span class="lineNum"> 1001 </span> : : __be32 dtlb_entries;</a>
+<a name="1002"><span class="lineNum"> 1002 </span> : : __be32 dtlb_assoc_sets;</a>
+<a name="1003"><span class="lineNum"> 1003 </span> : : __be32 itlb_entries;</a>
+<a name="1004"><span class="lineNum"> 1004 </span> : : __be32 itlb_assoc_sets;</a>
+<a name="1005"><span class="lineNum"> 1005 </span> : : __be32 reservation_size;</a>
+<a name="1006"><span class="lineNum"> 1006 </span> : : __be32 l2_cache_assoc_sets;</a>
+<a name="1007"><span class="lineNum"> 1007 </span> : : __be32 l35_dcache_size_kb;</a>
+<a name="1008"><span class="lineNum"> 1008 </span> : : __be32 l35_cache_line_size;</a>
+<a name="1009"><span class="lineNum"> 1009 </span> : : } __packed;</a>
+<a name="1010"><span class="lineNum"> 1010 </span> : : </a>
+<a name="1011"><span class="lineNum"> 1011 </span> : : </a>
+<a name="1012"><span class="lineNum"> 1012 </span> : : /* Idata index 3 : Thread Array Data</a>
+<a name="1013"><span class="lineNum"> 1013 </span> : : *</a>
+<a name="1014"><span class="lineNum"> 1014 </span> : : * HDIF array of</a>
+<a name="1015"><span class="lineNum"> 1015 </span> : : */</a>
+<a name="1016"><span class="lineNum"> 1016 </span> : : #define SPPCIA_IDATA_THREAD_ARRAY 3</a>
+<a name="1017"><span class="lineNum"> 1017 </span> : : </a>
+<a name="1018"><span class="lineNum"> 1018 </span> : : struct sppcia_cpu_thread {</a>
+<a name="1019"><span class="lineNum"> 1019 </span> : : __be32 proc_int_line;</a>
+<a name="1020"><span class="lineNum"> 1020 </span> : : __be32 phys_thread_id;</a>
+<a name="1021"><span class="lineNum"> 1021 </span> : : __be64 ibase;</a>
+<a name="1022"><span class="lineNum"> 1022 </span> : : __be32 pir;</a>
+<a name="1023"><span class="lineNum"> 1023 </span> : : } __packed;</a>
+<a name="1024"><span class="lineNum"> 1024 </span> : : </a>
+<a name="1025"><span class="lineNum"> 1025 </span> : : /* Idata index 4 : CPU Attributes */</a>
+<a name="1026"><span class="lineNum"> 1026 </span> : : #define SPPCIA_IDATA_CPU_ATTR 4</a>
+<a name="1027"><span class="lineNum"> 1027 </span> : : </a>
+<a name="1028"><span class="lineNum"> 1028 </span> : : struct sppcia_cpu_attr {</a>
+<a name="1029"><span class="lineNum"> 1029 </span> : : #define CPU_ATTR_UNIFIED_PL1 0x80</a>
+<a name="1030"><span class="lineNum"> 1030 </span> : : #define CPU_ATTR_SPLIT_TLB 0x40</a>
+<a name="1031"><span class="lineNum"> 1031 </span> : : #define CPU_ATTR_TLBIA 0x20</a>
+<a name="1032"><span class="lineNum"> 1032 </span> : : #define CPU_ATTR_PERF_MONITOR 0x10</a>
+<a name="1033"><span class="lineNum"> 1033 </span> : : #define CPU_ATTR_EXTERN_CONT 0x02</a>
+<a name="1034"><span class="lineNum"> 1034 </span> : : __be32 attr;</a>
+<a name="1035"><span class="lineNum"> 1035 </span> : : } __packed;</a>
+<a name="1036"><span class="lineNum"> 1036 </span> : : </a>
+<a name="1037"><span class="lineNum"> 1037 </span> : : /*</a>
+<a name="1038"><span class="lineNum"> 1038 </span> : : * Processor Chip Related Data. The SPIRA contain an array of these, one</a>
+<a name="1039"><span class="lineNum"> 1039 </span> : : * per chip</a>
+<a name="1040"><span class="lineNum"> 1040 </span> : : */</a>
+<a name="1041"><span class="lineNum"> 1041 </span> : : #define SPPCRD_HDIF_SIG &quot;SPPCRD&quot;</a>
+<a name="1042"><span class="lineNum"> 1042 </span> : : </a>
+<a name="1043"><span class="lineNum"> 1043 </span> : : /* Idata index 0 : Chip info */</a>
+<a name="1044"><span class="lineNum"> 1044 </span> : : #define SPPCRD_IDATA_CHIP_INFO 0</a>
+<a name="1045"><span class="lineNum"> 1045 </span> : : </a>
+<a name="1046"><span class="lineNum"> 1046 </span> : : struct sppcrd_chip_info {</a>
+<a name="1047"><span class="lineNum"> 1047 </span> : : __be32 proc_chip_id;</a>
+<a name="1048"><span class="lineNum"> 1048 </span> : : __be32 verif_exist_flags;</a>
+<a name="1049"><span class="lineNum"> 1049 </span> : : #define CHIP_VERIFY_MASK 0xC0000000</a>
+<a name="1050"><span class="lineNum"> 1050 </span> : : #define CHIP_VERIFY_SHIFT 30</a>
+<a name="1051"><span class="lineNum"> 1051 </span> : : #define CHIP_VERIFY_USABLE_NO_FAILURES 0</a>
+<a name="1052"><span class="lineNum"> 1052 </span> : : #define CHIP_VERIFY_USABLE_FAILURES 1</a>
+<a name="1053"><span class="lineNum"> 1053 </span> : : #define CHIP_VERIFY_NOT_INSTALLED 2</a>
+<a name="1054"><span class="lineNum"> 1054 </span> : : #define CHIP_VERIFY_UNUSABLE 3</a>
+<a name="1055"><span class="lineNum"> 1055 </span> : : #define CHIP_VERIFY_MASTER_PROC PPC_BIT32(4)</a>
+<a name="1056"><span class="lineNum"> 1056 </span> : : __be32 nx_state;</a>
+<a name="1057"><span class="lineNum"> 1057 </span> : : __be32 pore_state;</a>
+<a name="1058"><span class="lineNum"> 1058 </span> : : __be32 xscom_id;</a>
+<a name="1059"><span class="lineNum"> 1059 </span> : : /* Version 0xA */</a>
+<a name="1060"><span class="lineNum"> 1060 </span> : : __be32 reserved;</a>
+<a name="1061"><span class="lineNum"> 1061 </span> : : __be32 dbob_id;</a>
+<a name="1062"><span class="lineNum"> 1062 </span> : : __be32 occ_state;</a>
+<a name="1063"><span class="lineNum"> 1063 </span> : : /* Version 0xC - none of these are used */</a>
+<a name="1064"><span class="lineNum"> 1064 </span> : : __be32 processor_fru_id;</a>
+<a name="1065"><span class="lineNum"> 1065 </span> : : __be32 chip_ec_level;</a>
+<a name="1066"><span class="lineNum"> 1066 </span> : : __be32 hw_module_id;</a>
+<a name="1067"><span class="lineNum"> 1067 </span> : : __be32 hw_card_id;</a>
+<a name="1068"><span class="lineNum"> 1068 </span> : : __be32 internal_drawer_nid;</a>
+<a name="1069"><span class="lineNum"> 1069 </span> : : __be32 ccm_nid;</a>
+<a name="1070"><span class="lineNum"> 1070 </span> : : /* Version 0xD */</a>
+<a name="1071"><span class="lineNum"> 1071 </span> : : __be32 capp0_func_state;</a>
+<a name="1072"><span class="lineNum"> 1072 </span> : : /* Version 0xE */</a>
+<a name="1073"><span class="lineNum"> 1073 </span> : : __be32 capp1_func_state;</a>
+<a name="1074"><span class="lineNum"> 1074 </span> : : /* *possibly* from Version 0x20 - check spec */</a>
+<a name="1075"><span class="lineNum"> 1075 </span> : : __be32 stop_levels;</a>
+<a name="1076"><span class="lineNum"> 1076 </span> : : /* From latest version (possibly 0x21 and later) */</a>
+<a name="1077"><span class="lineNum"> 1077 </span> : : __be32 sw_xstop_fir_scom;</a>
+<a name="1078"><span class="lineNum"> 1078 </span> : : uint8_t sw_xstop_fir_bitpos;</a>
+<a name="1079"><span class="lineNum"> 1079 </span> : : uint8_t reserved_1[3];</a>
+<a name="1080"><span class="lineNum"> 1080 </span> : : } __packed;</a>
+<a name="1081"><span class="lineNum"> 1081 </span> : : </a>
+<a name="1082"><span class="lineNum"> 1082 </span> : : /* Idata index 1 : Chip TOD */</a>
+<a name="1083"><span class="lineNum"> 1083 </span> : : #define SPPCRD_IDATA_CHIP_TOD 1</a>
+<a name="1084"><span class="lineNum"> 1084 </span> : : </a>
+<a name="1085"><span class="lineNum"> 1085 </span> : : struct sppcrd_chip_tod {</a>
+<a name="1086"><span class="lineNum"> 1086 </span> : : __be32 flags;</a>
+<a name="1087"><span class="lineNum"> 1087 </span> : : /* CHIPTOD_ID_... values */</a>
+<a name="1088"><span class="lineNum"> 1088 </span> : : __be32 ctrl_reg_internal;</a>
+<a name="1089"><span class="lineNum"> 1089 </span> : : __be32 tod_ctrl_reg;</a>
+<a name="1090"><span class="lineNum"> 1090 </span> : : } __packed;</a>
+<a name="1091"><span class="lineNum"> 1091 </span> : : </a>
+<a name="1092"><span class="lineNum"> 1092 </span> : : /* Idata index 2 : FRU ID */</a>
+<a name="1093"><span class="lineNum"> 1093 </span> : : #define SPPCRD_IDATA_FRU_ID 2</a>
+<a name="1094"><span class="lineNum"> 1094 </span> : : </a>
+<a name="1095"><span class="lineNum"> 1095 </span> : : /* Idata index 3 : ASCII Keyword data */</a>
+<a name="1096"><span class="lineNum"> 1096 </span> : : #define SPPCRD_IDATA_KW_VPD 3</a>
+<a name="1097"><span class="lineNum"> 1097 </span> : : </a>
+<a name="1098"><span class="lineNum"> 1098 </span> : : /* Idata index 4 : Module VPD */</a>
+<a name="1099"><span class="lineNum"> 1099 </span> : : #define SPPCRD_IDATA_MODULE_VPD 4</a>
+<a name="1100"><span class="lineNum"> 1100 </span> : : </a>
+<a name="1101"><span class="lineNum"> 1101 </span> : : /* Idata index 5 : Chip attached I2C devices */</a>
+<a name="1102"><span class="lineNum"> 1102 </span> : : #define SPPCRD_IDATA_HOST_I2C 5</a>
+<a name="1103"><span class="lineNum"> 1103 </span> : : </a>
+<a name="1104"><span class="lineNum"> 1104 </span> : : /* Idata index 5 : Chip attached I2C devices */</a>
+<a name="1105"><span class="lineNum"> 1105 </span> : : #define SPPCRD_IDATA_PNOR 6</a>
+<a name="1106"><span class="lineNum"> 1106 </span> : : </a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : /* Idata index 6 : OpenCAPI/NVlink info */</a>
+<a name="1108"><span class="lineNum"> 1108 </span> : : #define SPPCRD_IDATA_SMP_LINK 7</a>
+<a name="1109"><span class="lineNum"> 1109 </span> : : struct sppcrd_smp_link {</a>
+<a name="1110"><span class="lineNum"> 1110 </span> : : __be32 link_id;</a>
+<a name="1111"><span class="lineNum"> 1111 </span> : : __be32 usage;</a>
+<a name="1112"><span class="lineNum"> 1112 </span> : : #define SMP_LINK_USE_NONE 0</a>
+<a name="1113"><span class="lineNum"> 1113 </span> : : #define SMP_LINK_USE_GPU 1</a>
+<a name="1114"><span class="lineNum"> 1114 </span> : : #define SMP_LINK_USE_OPENCAPI 2</a>
+<a name="1115"><span class="lineNum"> 1115 </span> : : #define SMP_LINK_USE_INTERPOSER 3</a>
+<a name="1116"><span class="lineNum"> 1116 </span> : : #define SMP_LINK_USE_DRAWER 4</a>
+<a name="1117"><span class="lineNum"> 1117 </span> : : #define SMP_LINK_USE_D2D 5 /* GPU to GPU */</a>
+<a name="1118"><span class="lineNum"> 1118 </span> : : __be32 brick_id;</a>
+<a name="1119"><span class="lineNum"> 1119 </span> : : __be32 lane_mask;</a>
+<a name="1120"><span class="lineNum"> 1120 </span> : : </a>
+<a name="1121"><span class="lineNum"> 1121 </span> : : /* bonded pci slots (mostly a NVLink thing) */</a>
+<a name="1122"><span class="lineNum"> 1122 </span> : : __be16 pci_slot_idx;</a>
+<a name="1123"><span class="lineNum"> 1123 </span> : : __be16 pci_sideband_slot_idx;</a>
+<a name="1124"><span class="lineNum"> 1124 </span> : : </a>
+<a name="1125"><span class="lineNum"> 1125 </span> : : __be16 slca_idx; /* SLCA index of the *external* port */</a>
+<a name="1126"><span class="lineNum"> 1126 </span> : : __be16 reserved;</a>
+<a name="1127"><span class="lineNum"> 1127 </span> : : </a>
+<a name="1128"><span class="lineNum"> 1128 </span> : : /* nvlink/ocapi detection devices */</a>
+<a name="1129"><span class="lineNum"> 1129 </span> : : __be32 i2c_link_cable;</a>
+<a name="1130"><span class="lineNum"> 1130 </span> : : __be32 i2c_presence;</a>
+<a name="1131"><span class="lineNum"> 1131 </span> : : __be32 i2c_micro;</a>
+<a name="1132"><span class="lineNum"> 1132 </span> : : uint8_t link_speed;</a>
+<a name="1133"><span class="lineNum"> 1133 </span> : : uint8_t occ_flag_bit;</a>
+<a name="1134"><span class="lineNum"> 1134 </span> : : __be16 gpu_slca;</a>
+<a name="1135"><span class="lineNum"> 1135 </span> : : } __packed;</a>
+<a name="1136"><span class="lineNum"> 1136 </span> : : </a>
+<a name="1137"><span class="lineNum"> 1137 </span> : : /* Idata index 8 : chip EC Level array */</a>
+<a name="1138"><span class="lineNum"> 1138 </span> : : #define SPPCRD_IDATA_EC_LEVEL 8</a>
+<a name="1139"><span class="lineNum"> 1139 </span> : : </a>
+<a name="1140"><span class="lineNum"> 1140 </span> : : struct sppcrd_ecid {</a>
+<a name="1141"><span class="lineNum"> 1141 </span> : : __be32 chip_id;</a>
+<a name="1142"><span class="lineNum"> 1142 </span> : : __be32 ec_level;</a>
+<a name="1143"><span class="lineNum"> 1143 </span> : : __be64 low; /* Processor ECID bit 0-63 */</a>
+<a name="1144"><span class="lineNum"> 1144 </span> : : __be64 high; /* Processor ECID bit 64-127 */</a>
+<a name="1145"><span class="lineNum"> 1145 </span> : : } __packed;</a>
+<a name="1146"><span class="lineNum"> 1146 </span> : : </a>
+<a name="1147"><span class="lineNum"> 1147 </span> : : /*</a>
+<a name="1148"><span class="lineNum"> 1148 </span> : : * Host Services Data.</a>
+<a name="1149"><span class="lineNum"> 1149 </span> : : */</a>
+<a name="1150"><span class="lineNum"> 1150 </span> : : #define HSERV_HDIF_SIG &quot;HOSTSR&quot;</a>
+<a name="1151"><span class="lineNum"> 1151 </span> : : </a>
+<a name="1152"><span class="lineNum"> 1152 </span> : : /* Idata index 0 : System attribute data */</a>
+<a name="1153"><span class="lineNum"> 1153 </span> : : #define HSERV_IDATA_SYS_ATTR 0</a>
+<a name="1154"><span class="lineNum"> 1154 </span> : : </a>
+<a name="1155"><span class="lineNum"> 1155 </span> : : /* IPMI sensors mapping data */</a>
+<a name="1156"><span class="lineNum"> 1156 </span> : : #define IPMI_SENSORS_HDIF_SIG &quot;FRUSE &quot;</a>
+<a name="1157"><span class="lineNum"> 1157 </span> : : </a>
+<a name="1158"><span class="lineNum"> 1158 </span> : : /* Idata index 0 : Sensor mapping data */</a>
+<a name="1159"><span class="lineNum"> 1159 </span> : : #define IPMI_SENSORS_IDATA_SENSORS 0</a>
+<a name="1160"><span class="lineNum"> 1160 </span> : : </a>
+<a name="1161"><span class="lineNum"> 1161 </span> : : struct ipmi_sensors_data {</a>
+<a name="1162"><span class="lineNum"> 1162 </span> : : __be32 slca_index;</a>
+<a name="1163"><span class="lineNum"> 1163 </span> : : uint8_t type;</a>
+<a name="1164"><span class="lineNum"> 1164 </span> : : uint8_t id;</a>
+<a name="1165"><span class="lineNum"> 1165 </span> : : uint8_t entity_id;</a>
+<a name="1166"><span class="lineNum"> 1166 </span> : : uint8_t reserved;</a>
+<a name="1167"><span class="lineNum"> 1167 </span> : : } __packed;</a>
+<a name="1168"><span class="lineNum"> 1168 </span> : : </a>
+<a name="1169"><span class="lineNum"> 1169 </span> : : struct ipmi_sensors {</a>
+<a name="1170"><span class="lineNum"> 1170 </span> : : __be32 count;</a>
+<a name="1171"><span class="lineNum"> 1171 </span> : : struct ipmi_sensors_data data[];</a>
+<a name="1172"><span class="lineNum"> 1172 </span> : : } __packed;</a>
+<a name="1173"><span class="lineNum"> 1173 </span> : : </a>
+<a name="1174"><span class="lineNum"> 1174 </span> : : /* Idata index 1 : LED - sensors ID mapping data */</a>
+<a name="1175"><span class="lineNum"> 1175 </span> : : #define IPMI_SENSORS_IDATA_LED 1</a>
+<a name="1176"><span class="lineNum"> 1176 </span> : : </a>
+<a name="1177"><span class="lineNum"> 1177 </span> : : /*</a>
+<a name="1178"><span class="lineNum"> 1178 </span> : : * Node Secure and Trusted Boot Related Data</a>
+<a name="1179"><span class="lineNum"> 1179 </span> : : */</a>
+<a name="1180"><span class="lineNum"> 1180 </span> : : #define STB_HDIF_SIG &quot;TPMREL&quot;</a>
+<a name="1181"><span class="lineNum"> 1181 </span> : : </a>
+<a name="1182"><span class="lineNum"> 1182 </span> : : /*</a>
+<a name="1183"><span class="lineNum"> 1183 </span> : : * Idata index 0 : Secure Boot and TPM Instance Info</a>
+<a name="1184"><span class="lineNum"> 1184 </span> : : *</a>
+<a name="1185"><span class="lineNum"> 1185 </span> : : * There can be multiple entries with each entry corresponding to</a>
+<a name="1186"><span class="lineNum"> 1186 </span> : : * a master processor that has a TPM device</a>
+<a name="1187"><span class="lineNum"> 1187 </span> : : */</a>
+<a name="1188"><span class="lineNum"> 1188 </span> : : #define TPMREL_IDATA_SECUREBOOT_TPM_INFO 0</a>
+<a name="1189"><span class="lineNum"> 1189 </span> : : </a>
+<a name="1190"><span class="lineNum"> 1190 </span> : : struct secureboot_tpm_info {</a>
+<a name="1191"><span class="lineNum"> 1191 </span> : : __be32 chip_id;</a>
+<a name="1192"><span class="lineNum"> 1192 </span> : : __be32 dbob_id;</a>
+<a name="1193"><span class="lineNum"> 1193 </span> : : uint8_t locality1;</a>
+<a name="1194"><span class="lineNum"> 1194 </span> : : uint8_t locality2;</a>
+<a name="1195"><span class="lineNum"> 1195 </span> : : uint8_t locality3;</a>
+<a name="1196"><span class="lineNum"> 1196 </span> : : uint8_t locality4;</a>
+<a name="1197"><span class="lineNum"> 1197 </span> : : #define TPM_PRESENT_AND_FUNCTIONAL 0x01</a>
+<a name="1198"><span class="lineNum"> 1198 </span> : : #define TPM_PRESENT_AND_NOT_FUNCTIONAL 0x02</a>
+<a name="1199"><span class="lineNum"> 1199 </span> : : #define TPM_NOT_PRESENT 0x03</a>
+<a name="1200"><span class="lineNum"> 1200 </span> : : uint8_t tpm_status;</a>
+<a name="1201"><span class="lineNum"> 1201 </span> : : uint8_t reserved[3];</a>
+<a name="1202"><span class="lineNum"> 1202 </span> : : /* zero indicates no tpm log data */</a>
+<a name="1203"><span class="lineNum"> 1203 </span> : : __be32 srtm_log_offset;</a>
+<a name="1204"><span class="lineNum"> 1204 </span> : : __be32 srtm_log_size;</a>
+<a name="1205"><span class="lineNum"> 1205 </span> : : /* zero indicates no tpm log data */</a>
+<a name="1206"><span class="lineNum"> 1206 </span> : : __be32 drtm_log_offset;</a>
+<a name="1207"><span class="lineNum"> 1207 </span> : : __be32 drtm_log_size;</a>
+<a name="1208"><span class="lineNum"> 1208 </span> : : } __packed;</a>
+<a name="1209"><span class="lineNum"> 1209 </span> : : </a>
+<a name="1210"><span class="lineNum"> 1210 </span> : : /* Idata index 2: Hash and Verification Function Offsets Array */</a>
+<a name="1211"><span class="lineNum"> 1211 </span> : : #define TPMREL_IDATA_HASH_VERIF_OFFSETS 2</a>
+<a name="1212"><span class="lineNum"> 1212 </span> : : </a>
+<a name="1213"><span class="lineNum"> 1213 </span> : : struct hash_and_verification {</a>
+<a name="1214"><span class="lineNum"> 1214 </span> : : #define TPMREL_HV_SHA512 0x00</a>
+<a name="1215"><span class="lineNum"> 1215 </span> : : #define TPMREL_HV_VERIFY 0x01</a>
+<a name="1216"><span class="lineNum"> 1216 </span> : : __be32 type;</a>
+<a name="1217"><span class="lineNum"> 1217 </span> : : __be32 version;</a>
+<a name="1218"><span class="lineNum"> 1218 </span> : : __be32 dbob_id;</a>
+<a name="1219"><span class="lineNum"> 1219 </span> : : __be32 offset;</a>
+<a name="1220"><span class="lineNum"> 1220 </span> : : } __packed;</a>
+<a name="1221"><span class="lineNum"> 1221 </span> : : </a>
+<a name="1222"><span class="lineNum"> 1222 </span> :<span class="lineCov"> 26 : static inline const char *cpu_state(u32 flags)</span></a>
+<a name="1223"><span class="lineNum"> 1223 </span> : : {</a>
+<a name="1224"><span class="lineNum"> 1224 </span> :<span class="lineCov"> 26 : switch ((flags &amp; CPU_ID_VERIFY_MASK) &gt;&gt; CPU_ID_VERIFY_SHIFT) {</span></a>
+<a name="1225"><span class="lineNum"> 1225 </span> :<span class="lineCov"> 26 : case CPU_ID_VERIFY_USABLE_NO_FAILURES:</span></a>
+<a name="1226"><span class="lineNum"> 1226 </span> :<span class="lineCov"> 26 : return &quot;OK&quot;;</span></a>
+<a name="1227"><span class="lineNum"> 1227 </span> :<span class="lineNoCov"> 0 : case CPU_ID_VERIFY_USABLE_FAILURES:</span></a>
+<a name="1228"><span class="lineNum"> 1228 </span> :<span class="lineNoCov"> 0 : return &quot;FAILURES&quot;;</span></a>
+<a name="1229"><span class="lineNum"> 1229 </span> :<span class="lineNoCov"> 0 : case CPU_ID_VERIFY_NOT_INSTALLED:</span></a>
+<a name="1230"><span class="lineNum"> 1230 </span> :<span class="lineNoCov"> 0 : return &quot;NOT-INSTALLED&quot;;</span></a>
+<a name="1231"><span class="lineNum"> 1231 </span> :<span class="lineNoCov"> 0 : case CPU_ID_VERIFY_UNUSABLE:</span></a>
+<a name="1232"><span class="lineNum"> 1232 </span> :<span class="lineNoCov"> 0 : return &quot;UNUSABLE&quot;;</span></a>
+<a name="1233"><span class="lineNum"> 1233 </span> : : }</a>
+<a name="1234"><span class="lineNum"> 1234 </span> :<span class="lineNoCov"> 0 : return &quot;**UNKNOWN**&quot;;</span></a>
+<a name="1235"><span class="lineNum"> 1235 </span> : : }</a>
+<a name="1236"><span class="lineNum"> 1236 </span> : : #endif /* __SPIRA_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/test/hdata_to_dt.c.func-sort-c.html b/coverage-report/hdata/test/hdata_to_dt.c.func-sort-c.html
new file mode 100644
index 0000000..6ceeb29
--- /dev/null
+++ b/coverage-report/hdata/test/hdata_to_dt.c.func-sort-c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/test/hdata_to_dt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hdata/test</a> - hdata_to_dt.c<span style="font-size: 80%;"> (<a href="hdata_to_dt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryLo">63.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="hdata_to_dt.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#109">add_ics_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#90">cpu_queue_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#167">fsp_present</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#115">is_power9n</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#172">op_display</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#40">this_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#264">dump_hdata_fdt</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#295">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#213">undefined_bytes</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#218">hash_prop</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#103">mfspr</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#234">squash_blobs</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#196">ntuple_addr</a></td>
+ <td class="coverFnHi">638</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#185">spira_check_ptr</a></td>
+ <td class="coverFnHi">1007</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/test/hdata_to_dt.c.func.html b/coverage-report/hdata/test/hdata_to_dt.c.func.html
new file mode 100644
index 0000000..50fa7f2
--- /dev/null
+++ b/coverage-report/hdata/test/hdata_to_dt.c.func.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/test/hdata_to_dt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hdata/test</a> - hdata_to_dt.c<span style="font-size: 80%;"> (<a href="hdata_to_dt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryLo">63.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="hdata_to_dt.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#109">add_ics_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#90">cpu_queue_job</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#264">dump_hdata_fdt</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#167">fsp_present</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#218">hash_prop</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#115">is_power9n</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#295">main</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#103">mfspr</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#196">ntuple_addr</a></td>
+ <td class="coverFnHi">638</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#172">op_display</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#185">spira_check_ptr</a></td>
+ <td class="coverFnHi">1007</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#234">squash_blobs</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#40">this_cpu</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="hdata_to_dt.c.gcov.html#213">undefined_bytes</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/test/hdata_to_dt.c.gcov.html b/coverage-report/hdata/test/hdata_to_dt.c.gcov.html
new file mode 100644
index 0000000..ab49816
--- /dev/null
+++ b/coverage-report/hdata/test/hdata_to_dt.c.gcov.html
@@ -0,0 +1,520 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/test/hdata_to_dt.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hdata/test</a> - hdata_to_dt.c<span style="font-size: 80%;"> (source / <a href="hdata_to_dt.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryLo">63.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Given a hdata dump, output the device tree.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/mman.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;assert.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;interrupts.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;bitutils.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &lt;skiboot-valgrind.h&gt;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;../../libfdt/fdt.c&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &quot;../../libfdt/fdt_ro.c&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &quot;../../libfdt/fdt_sw.c&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &quot;../../libfdt/fdt_strerror.c&quot;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : struct dt_node *opal_node;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* Our actual map. */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : static void *spira_heap;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : static off_t spira_heap_size;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : static uint64_t base_addr;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : /* Override ntuple_addr. */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #define ntuple_addr ntuple_addr</a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct spira_ntuple;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : static void *ntuple_addr(const struct spira_ntuple *n);</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : /* Stuff which core expects. */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : struct cpu_thread *my_fake_cpu;</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : static struct cpu_thread *this_cpu(void)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : return my_fake_cpu;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : }</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : unsigned long tb_hz = 512000000;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : /* Don't include processor-specific stuff. */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #define __PROCESSOR_H</a>
+<a name="51"><span class="lineNum"> 51 </span> : : /* PVR bits */</a>
+<a name="52"><span class="lineNum"> 52 </span> : : #define SPR_PVR_TYPE 0xffff0000</a>
+<a name="53"><span class="lineNum"> 53 </span> : : #define SPR_PVR_VERS_MAJ 0x00000f00</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #define SPR_PVR_VERS_MIN 0x000000ff</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : #define PVR_TYPE(_pvr) GETFIELD(SPR_PVR_TYPE, _pvr)</a>
+<a name="57"><span class="lineNum"> 57 </span> : : #define PVR_VERS_MAJ(_pvr) GETFIELD(SPR_PVR_VERS_MAJ, _pvr)</a>
+<a name="58"><span class="lineNum"> 58 </span> : : #define PVR_VERS_MIN(_pvr) GETFIELD(SPR_PVR_VERS_MIN, _pvr)</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : /* PVR definitions - copied from skiboot include/processor.h */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define PVR_TYPE_P8E 0x004b</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #define PVR_TYPE_P8 0x004d</a>
+<a name="63"><span class="lineNum"> 63 </span> : : #define PVR_TYPE_P8NVL 0x004c</a>
+<a name="64"><span class="lineNum"> 64 </span> : : #define PVR_TYPE_P9 0x004e</a>
+<a name="65"><span class="lineNum"> 65 </span> : : #define PVR_TYPE_P9P 0x004f</a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define PVR_P8E 0x004b0201</a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define PVR_P8 0x004d0200</a>
+<a name="68"><span class="lineNum"> 68 </span> : : #define PVR_P8NVL 0x004c0100</a>
+<a name="69"><span class="lineNum"> 69 </span> : : #define PVR_P9 0x004e0200</a>
+<a name="70"><span class="lineNum"> 70 </span> : : #define PVR_P9P 0x004f0100</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : #define SPR_PVR 0x11f /* RO: Processor version register */</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : #define MSR_SF 0x8000000000000000ULL</a>
+<a name="75"><span class="lineNum"> 75 </span> : : #define MSR_HV 0x1000000000000000ULL</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : #define __CPU_H</a>
+<a name="78"><span class="lineNum"> 78 </span> : : struct cpu_thread {</a>
+<a name="79"><span class="lineNum"> 79 </span> : : uint32_t pir;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : uint32_t chip_id;</a>
+<a name="81"><span class="lineNum"> 81 </span> : : bool is_fused_core;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : };</a>
+<a name="83"><span class="lineNum"> 83 </span> : : struct cpu_job *__cpu_queue_job(struct cpu_thread *cpu,</a>
+<a name="84"><span class="lineNum"> 84 </span> : : const char *name,</a>
+<a name="85"><span class="lineNum"> 85 </span> : : void (*func)(void *data), void *data,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : bool no_return);</a>
+<a name="87"><span class="lineNum"> 87 </span> : : void cpu_wait_job(struct cpu_job *job, bool free_it);</a>
+<a name="88"><span class="lineNum"> 88 </span> : : void cpu_process_local_jobs(void);</a>
+<a name="89"><span class="lineNum"> 89 </span> : : struct cpu_job *cpu_queue_job_on_node(uint32_t chip_id,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : const char *name,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : void (*func)(void *data), void *data);</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : static inline struct cpu_job *cpu_queue_job(struct cpu_thread *cpu,</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : const char *name,</a>
+<a name="94"><span class="lineNum"> 94 </span> : : void (*func)(void *data),</a>
+<a name="95"><span class="lineNum"> 95 </span> : : void *data)</a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : return __cpu_queue_job(cpu, name, func, data, false);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : }</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> : : struct cpu_thread __boot_cpu, *boot_cpu = &amp;__boot_cpu;</a>
+<a name="101"><span class="lineNum"> 101 </span> : : static unsigned long fake_pvr = PVR_P8;</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : unsigned int cpu_thread_count = 8;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 40 : static inline unsigned long mfspr(unsigned int spr)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : {</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 40 : assert(spr == SPR_PVR);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 40 : return fake_pvr;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : struct dt_node *add_ics_node(void)</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : {</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : }</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : // Copied from processor.h:</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : static inline bool is_power9n(uint32_t version)</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : {</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineNoCov"> 0 : if (PVR_TYPE(version) != PVR_TYPE_P9)</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : /*</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * Bit 13 tells us:</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * 0 = Scale out (aka Nimbus)</a>
+<a name="124"><span class="lineNum"> 124 </span> : : * 1 = Scale up (aka Cumulus)</a>
+<a name="125"><span class="lineNum"> 125 </span> : : */</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : if ((version &gt;&gt; 13) &amp; 1)</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : }</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : #include &lt;config.h&gt;</a>
+<a name="132"><span class="lineNum"> 132 </span> : : #include &lt;bitutils.h&gt;</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : /* Your pointers won't be correct, that's OK. */</a>
+<a name="135"><span class="lineNum"> 135 </span> : : #define spira_check_ptr spira_check_ptr</a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> : : static bool spira_check_ptr(const void *ptr, const char *file, unsigned int line);</a>
+<a name="138"><span class="lineNum"> 138 </span> : : </a>
+<a name="139"><span class="lineNum"> 139 </span> : : /* should probably check this */</a>
+<a name="140"><span class="lineNum"> 140 </span> : : #define BITS_PER_LONG 64</a>
+<a name="141"><span class="lineNum"> 141 </span> : : /* not used, just needs to exist */</a>
+<a name="142"><span class="lineNum"> 142 </span> : : #define cpu_max_pir 0x7</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> : : #include &quot;../cpu-common.c&quot;</a>
+<a name="145"><span class="lineNum"> 145 </span> : : #include &quot;../fsp.c&quot;</a>
+<a name="146"><span class="lineNum"> 146 </span> : : #include &quot;../hdif.c&quot;</a>
+<a name="147"><span class="lineNum"> 147 </span> : : #include &quot;../iohub.c&quot;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : #include &quot;../memory.c&quot;</a>
+<a name="149"><span class="lineNum"> 149 </span> : : #include &quot;../pcia.c&quot;</a>
+<a name="150"><span class="lineNum"> 150 </span> : : #include &quot;../spira.c&quot;</a>
+<a name="151"><span class="lineNum"> 151 </span> : : #include &quot;../vpd.c&quot;</a>
+<a name="152"><span class="lineNum"> 152 </span> : : #include &quot;../vpd-common.c&quot;</a>
+<a name="153"><span class="lineNum"> 153 </span> : : #include &quot;../slca.c&quot;</a>
+<a name="154"><span class="lineNum"> 154 </span> : : #include &quot;../hostservices.c&quot;</a>
+<a name="155"><span class="lineNum"> 155 </span> : : #include &quot;../i2c.c&quot;</a>
+<a name="156"><span class="lineNum"> 156 </span> : : #include &quot;../tpmrel.c&quot;</a>
+<a name="157"><span class="lineNum"> 157 </span> : : #include &quot;../../core/vpd.c&quot;</a>
+<a name="158"><span class="lineNum"> 158 </span> : : #include &quot;../../core/device.c&quot;</a>
+<a name="159"><span class="lineNum"> 159 </span> : : #include &quot;../../core/chip.c&quot;</a>
+<a name="160"><span class="lineNum"> 160 </span> : : #include &quot;../../test/dt_common.c&quot;</a>
+<a name="161"><span class="lineNum"> 161 </span> : : #include &quot;../../core/fdt.c&quot;</a>
+<a name="162"><span class="lineNum"> 162 </span> : : #include &quot;../../hw/phys-map.c&quot;</a>
+<a name="163"><span class="lineNum"> 163 </span> : : #include &quot;../../core/mem_region.c&quot;</a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : #include &lt;err.h&gt;</a>
+<a name="166"><span class="lineNum"> 166 </span> : : </a>
+<a name="167"><span class="lineNum"> 167 </span> : : #include &lt;op-panel.h&gt;</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : bool fsp_present()</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : {</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : void op_display(enum op_severity s, enum op_module m, uint16_t code)</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : {</a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;op_panel Severity: 0x%x (%s), module %x, %x\n&quot;,</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : s, (s == OP_FATAL) ? &quot;FATAL&quot; : &quot;non-fatal&quot;,</a>
+<a name="178"><span class="lineNum"> 178 </span> : : m, code);</a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : if (s == OP_FATAL)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : exit(EXIT_FAILURE);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> : : char __rodata_start[1], __rodata_end[1];</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> : : enum proc_gen proc_gen = proc_gen_p8;</a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 1007 : static bool spira_check_ptr(const void *ptr, const char *file, unsigned int line)</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : {</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 1007 : if (!ptr)</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 6 : return false;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : /* we fake the SPIRA pointer as it's relative to where it was loaded</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * on real hardware */</a>
+<a name="193"><span class="lineNum"> 193 </span> : : (void)file;</a>
+<a name="194"><span class="lineNum"> 194 </span> : : (void)line;</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1001 : return true;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : }</a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 638 : static void *ntuple_addr(const struct spira_ntuple *n)</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : {</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 638 : uint64_t addr = be64_to_cpu(n-&gt;addr);</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 638 : if (n-&gt;addr == 0)</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 6 : return NULL;</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 632 : if (addr &lt; base_addr) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;assert failed: addr &gt;= base_addr (%&quot;PRIu64&quot; &gt;= %&quot;PRIu64&quot;)\n&quot;, addr, base_addr);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : exit(EXIT_FAILURE);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : }</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 632 : if (addr &gt;= base_addr + spira_heap_size) {</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;assert failed: addr not in spira_heap\n&quot;);</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : exit(EXIT_FAILURE);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : }</a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 632 : return spira_heap + ((unsigned long)addr - base_addr);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : }</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> : : /* Make sure valgrind knows these are undefined bytes. */</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 2 : static void undefined_bytes(void *p, size_t len)</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> : : VALGRIND_MAKE_MEM_UNDEFINED(p, len);</a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 8 : static u32 hash_prop(const struct dt_property *p)</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : {</a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 8 : u32 i, hash = 0;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> : : /* a stupid checksum */</a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 401416 : for (i = 0; i &lt; p-&gt;len; i++)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 401408 : hash += (((signed char)p-&gt;prop[i] &amp; ~0x10) + 1) * i;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 8 : return hash;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /*</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * This filters out VPD blobs and other annoyances from the devicetree output.</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * We don't actually care about the contents of the blob, we just want to make</a>
+<a name="234"><span class="lineNum"> 234 </span> : : * sure it's there and that we aren't accidently corrupting the contents.</a>
+<a name="235"><span class="lineNum"> 235 </span> : : */</a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 236 : static void squash_blobs(struct dt_node *root)</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : {</a>
+<a name="238"><span class="lineNum"> 238 </span> : : struct dt_node *n;</a>
+<a name="239"><span class="lineNum"> 239 </span> : : struct dt_property *p;</a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 2793 : list_for_each(&amp;root-&gt;properties, p, list) {</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 2557 : if (strstarts(p-&gt;name, DT_PRIVATE))</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 8 : continue;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /*</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * Consider any property larger than 512 bytes a blob that can</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * be removed. This number was picked out of thin in so don't</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * feel bad about changing it.</a>
+<a name="249"><span class="lineNum"> 249 </span> : : */</a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 2549 : if (p-&gt;len &gt; 512) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 8 : u32 hash = hash_prop(p);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 8 : u32 *val = (u32 *) p-&gt;prop;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> : : /* Add a sentinel so we know it was truncated */</a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 8 : val[0] = cpu_to_be32(0xcafebeef);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 8 : val[1] = cpu_to_be32(p-&gt;len);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 8 : val[2] = cpu_to_be32(hash);</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 8 : p-&gt;len = 3 * sizeof(u32);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : }</a>
+<a name="260"><span class="lineNum"> 260 </span> : : }</a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 470 : list_for_each(&amp;root-&gt;children, n, list)</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 234 : squash_blobs(n);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 236 : }</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 2 : static void dump_hdata_fdt(struct dt_node *root)</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : {</a>
+<a name="268"><span class="lineNum"> 268 </span> : : struct dt_node *n;</a>
+<a name="269"><span class="lineNum"> 269 </span> : : void *fdt_blob;</a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : /* delete some properties that hardcode pointers */</a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 236 : dt_for_each_node(dt_root, n) {</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : struct dt_property *base;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /*</a>
+<a name="276"><span class="lineNum"> 276 </span> : : * sml-base is a raw pointer into the HDAT area so it changes</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * on each execution of hdata_to_dt. Work around this by</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * zeroing it.</a>
+<a name="279"><span class="lineNum"> 279 </span> : : */</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 234 : base = __dt_find_property(n, &quot;linux,sml-base&quot;);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 234 : if (base)</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : memset(base-&gt;prop, 0, base-&gt;len);</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 2 : fdt_blob = create_dtb(root, false);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 2 : if (!fdt_blob) {</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Unable to make flattened DT, no FDT written\n&quot;);</span></a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : }</a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 2 : fwrite(fdt_blob, fdt_totalsize(fdt_blob), 1, stdout);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 2 : free(fdt_blob);</span></a>
+<a name="295"><span class="lineNum"> 295 </span> : : }</a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 2 : int main(int argc, char *argv[])</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : {</a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 2 : int fd, r, i = 0, opt_count = 0;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 2 : bool verbose = false, quiet = false, new_spira = false, blobs = false;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 9 : while (argv[++i]) {</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 7 : if (strcmp(argv[i], &quot;-v&quot;) == 0) {</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : verbose = true;</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : opt_count++;</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 7 : } else if (strcmp(argv[i], &quot;-q&quot;) == 0) {</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : quiet = true;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : opt_count++;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 7 : } else if (strcmp(argv[i], &quot;-s&quot;) == 0) {</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 1 : new_spira = true;</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 1 : opt_count++;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 6 : } else if (strcmp(argv[i], &quot;-b&quot;) == 0) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : blobs = true;</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : opt_count++;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 6 : } else if (strcmp(argv[i], &quot;-8E&quot;) == 0) {</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 2 : fake_pvr = PVR_P8E;</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 2 : proc_gen = proc_gen_p8;</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 2 : opt_count++;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 4 : } else if (strcmp(argv[i], &quot;-8&quot;) == 0) {</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : fake_pvr = PVR_P8;</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : proc_gen = proc_gen_p8;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : opt_count++;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 4 : } else if (strcmp(argv[i], &quot;-9&quot;) == 0) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : fake_pvr = PVR_P9;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : proc_gen = proc_gen_p9;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineNoCov"> 0 : opt_count++;</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 4 : } else if (strcmp(argv[i], &quot;-9P&quot;) == 0) {</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : fake_pvr = PVR_P9P;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineNoCov"> 0 : proc_gen = proc_gen_p9;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : opt_count++;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : }</a>
+<a name="332"><span class="lineNum"> 332 </span> : : }</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 2 : argc -= opt_count;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 2 : argv += opt_count;</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 2 : if (argc != 3) {</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : errx(1, &quot;Converts HDAT dumps to DTB.\n&quot;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : &quot;\n&quot;</a>
+<a name="339"><span class="lineNum"> 339 </span> : : &quot;Usage:\n&quot;</a>
+<a name="340"><span class="lineNum"> 340 </span> : : &quot; hdata &lt;opts&gt; &lt;spira-dump&gt; &lt;heap-dump&gt;\n&quot;</a>
+<a name="341"><span class="lineNum"> 341 </span> : : &quot; hdata &lt;opts&gt; -s &lt;spirah-dump&gt; &lt;spiras-dump&gt;\n&quot;</a>
+<a name="342"><span class="lineNum"> 342 </span> : : &quot;Options: \n&quot;</a>
+<a name="343"><span class="lineNum"> 343 </span> : : &quot; -v Verbose\n&quot;</a>
+<a name="344"><span class="lineNum"> 344 </span> : : &quot; -q Quiet mode\n&quot;</a>
+<a name="345"><span class="lineNum"> 345 </span> : : &quot; -b Keep blobs in the output\n&quot;</a>
+<a name="346"><span class="lineNum"> 346 </span> : : &quot;\n&quot;</a>
+<a name="347"><span class="lineNum"> 347 </span> : : &quot; -8 Force PVR to POWER8\n&quot;</a>
+<a name="348"><span class="lineNum"> 348 </span> : : &quot; -8E Force PVR to POWER8E\n&quot;</a>
+<a name="349"><span class="lineNum"> 349 </span> : : &quot; -9 Force PVR to POWER9 (nimbus)\n&quot;</a>
+<a name="350"><span class="lineNum"> 350 </span> : : &quot;\n&quot;</a>
+<a name="351"><span class="lineNum"> 351 </span> : : &quot;When no PVR is specified -8 is assumed&quot;</a>
+<a name="352"><span class="lineNum"> 352 </span> : : &quot;\n&quot;</a>
+<a name="353"><span class="lineNum"> 353 </span> : : &quot;Pipe to 'dtc -I dtb -O dts' for human readable output\n&quot;);</a>
+<a name="354"><span class="lineNum"> 354 </span> : : }</a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 2 : phys_map_init(fake_pvr);</span></a>
+<a name="357"><span class="lineNum"> 357 </span> : : </a>
+<a name="358"><span class="lineNum"> 358 </span> : : /* Copy in spira dump (assumes little has changed!). */</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 2 : if (new_spira) {</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 1 : fd = open(argv[1], O_RDONLY);</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 1 : if (fd &lt; 0)</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : err(1, &quot;opening %s&quot;, argv[1]);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 1 : r = read(fd, &amp;spirah, sizeof(spirah));</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 1 : if (r &lt; sizeof(spirah.hdr))</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : err(1, &quot;reading %s gave %i&quot;, argv[1], r);</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1 : if (verbose)</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : printf(&quot;verbose: read spirah %u bytes\n&quot;, r);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 1 : close(fd);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 1 : undefined_bytes((void *)&amp;spirah + r, sizeof(spirah) - r);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : </a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 1 : base_addr = be64_to_cpu(spirah.ntuples.hs_data_area.addr);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : } else {</a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 1 : fd = open(argv[1], O_RDONLY);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 1 : if (fd &lt; 0)</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : err(1, &quot;opening %s&quot;, argv[1]);</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 1 : r = read(fd, &amp;spira, sizeof(spira));</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 1 : if (r &lt; sizeof(spira.hdr))</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : err(1, &quot;reading %s gave %i&quot;, argv[1], r);</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 1 : if (verbose)</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : printf(&quot;verbose: read spira %u bytes\n&quot;, r);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 1 : close(fd);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : </a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 1 : undefined_bytes((void *)&amp;spira + r, sizeof(spira) - r);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 1 : base_addr = be64_to_cpu(spira.ntuples.heap.addr);</span></a>
+<a name="387"><span class="lineNum"> 387 </span> : : }</a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 2 : if (!base_addr)</span></a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : errx(1, &quot;Invalid base addr&quot;);</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 2 : if (verbose)</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineNoCov"> 0 : printf(&quot;verbose: map.base_addr = %llx\n&quot;, (long long)base_addr);</span></a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 2 : fd = open(argv[2], O_RDONLY);</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 2 : if (fd &lt; 0)</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : err(1, &quot;opening %s&quot;, argv[2]);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 2 : spira_heap_size = lseek(fd, 0, SEEK_END);</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 2 : if (spira_heap_size &lt; 0)</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : err(1, &quot;lseek on %s&quot;, argv[2]);</span></a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 2 : spira_heap = mmap(NULL, spira_heap_size, PROT_READ, MAP_SHARED, fd, 0);</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 2 : if (spira_heap == MAP_FAILED)</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : err(1, &quot;mmaping %s&quot;, argv[3]);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 2 : if (verbose)</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : printf(&quot;verbose: mapped %zu at %p\n&quot;,</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : spira_heap_size, spira_heap);</a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 2 : close(fd);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 2 : if (new_spira)</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 1 : spiras = (struct spiras *)spira_heap;</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 2 : if (quiet) {</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : fclose(stdout);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : fclose(stderr);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> : : }</a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 2 : dt_root = dt_new_root(&quot;&quot;);</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 2 : if(parse_hdat(false) &lt; 0) {</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;FATAL ERROR parsing HDAT\n&quot;);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : dt_free(dt_root);</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : exit(EXIT_FAILURE);</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : }</a>
+<a name="423"><span class="lineNum"> 423 </span> : : </a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 2 : mem_region_init();</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 2 : mem_region_release_unused();</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 2 : if (!blobs)</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 2 : squash_blobs(dt_root);</span></a>
+<a name="429"><span class="lineNum"> 429 </span> : : </a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 2 : if (!quiet)</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 2 : dump_hdata_fdt(dt_root);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> : : </a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 2 : dt_free(dt_root);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/test/index-sort-b.html b/coverage-report/hdata/test/index-sort-b.html
new file mode 100644
index 0000000..6842e2c
--- /dev/null
+++ b/coverage-report/hdata/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hdata/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryLo">63.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata_to_dt.c.gcov.html">hdata_to_dt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=64 height=10 alt="63.8%"><img src="../../snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/test/index-sort-f.html b/coverage-report/hdata/test/index-sort-f.html
new file mode 100644
index 0000000..93724e1
--- /dev/null
+++ b/coverage-report/hdata/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hdata/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryLo">63.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata_to_dt.c.gcov.html">hdata_to_dt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=64 height=10 alt="63.8%"><img src="../../snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/test/index-sort-l.html b/coverage-report/hdata/test/index-sort-l.html
new file mode 100644
index 0000000..fdfc2fe
--- /dev/null
+++ b/coverage-report/hdata/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hdata/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryLo">63.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata_to_dt.c.gcov.html">hdata_to_dt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=64 height=10 alt="63.8%"><img src="../../snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/test/index.html b/coverage-report/hdata/test/index.html
new file mode 100644
index 0000000..32d505f
--- /dev/null
+++ b/coverage-report/hdata/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hdata/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">104</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryLo">63.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata_to_dt.c.gcov.html">hdata_to_dt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=64 height=10 alt="63.8%"><img src="../../snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/tpmrel.c.func-sort-c.html b/coverage-report/hdata/tpmrel.c.func-sort-c.html
new file mode 100644
index 0000000..f4dfb06
--- /dev/null
+++ b/coverage-report/hdata/tpmrel.c.func-sort-c.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/tpmrel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - tpmrel.c<span style="font-size: 80%;"> (<a href="tpmrel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">92</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="tpmrel.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#127">cvc_service_map_compat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#98">get_hb_reserved_memory</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#206">node_stb_parse</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#13">tpmrel_add_firmware_event_log</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#136">tpmrel_cvc_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/tpmrel.c.func.html b/coverage-report/hdata/tpmrel.c.func.html
new file mode 100644
index 0000000..8a8b2b2
--- /dev/null
+++ b/coverage-report/hdata/tpmrel.c.func.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/tpmrel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - tpmrel.c<span style="font-size: 80%;"> (<a href="tpmrel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">92</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="tpmrel.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#127">cvc_service_map_compat</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#98">get_hb_reserved_memory</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#206">node_stb_parse</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#13">tpmrel_add_firmware_event_log</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tpmrel.c.gcov.html#136">tpmrel_cvc_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/tpmrel.c.gcov.html b/coverage-report/hdata/tpmrel.c.gcov.html
new file mode 100644
index 0000000..224400e
--- /dev/null
+++ b/coverage-report/hdata/tpmrel.c.gcov.html
@@ -0,0 +1,305 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/tpmrel.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - tpmrel.c<span style="font-size: 80%;"> (source / <a href="tpmrel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">92</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef pr_fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define pr_fmt(fmt) &quot;TPMREL: &quot; fmt</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #endif</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;device.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;spira.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;hdif.h&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineNoCov"> 0 : static void tpmrel_add_firmware_event_log(const struct HDIF_common_hdr *hdif_hdr)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : const struct secureboot_tpm_info *stinfo;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : struct dt_node *xscom, *node;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : uint64_t addr;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : int count, i;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : unsigned int asize;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : /* Are the hdat values populated? */</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : if (!HDIF_get_idata(hdif_hdr, TPMREL_IDATA_SECUREBOOT_TPM_INFO, &amp;asize))</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : if (asize &lt; sizeof(struct HDIF_array_hdr)) {</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;secureboot_tpm_info idata not populated\n&quot;);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : count = HDIF_get_iarray_size(hdif_hdr, TPMREL_IDATA_SECUREBOOT_TPM_INFO);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : if (count &gt; 1) {</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;multiple TPM not supported, count=%d\n&quot;, count);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : /*</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * There can be multiple secureboot_tpm_info entries with each entry</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * corresponding to a master processor that has a tpm device.</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * This looks for the tpm node that supposedly exists under the xscom</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * node associated with the respective chip_id.</a>
+<a name="42"><span class="lineNum"> 42 </span> : : */</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : stinfo = HDIF_get_iarray_item(hdif_hdr,</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : TPMREL_IDATA_SECUREBOOT_TPM_INFO,</a>
+<a name="47"><span class="lineNum"> 47 </span> : : i, NULL);</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : /*</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * If tpm is not present, hostboot creates an empty</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * secureboot_tpm_info entry, but setting</a>
+<a name="52"><span class="lineNum"> 52 </span> : : * tpm_status=TPM_NOT_PRESENT</a>
+<a name="53"><span class="lineNum"> 53 </span> : : */</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : if (stinfo-&gt;tpm_status == TPM_NOT_PRESENT)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : xscom = find_xscom_for_chip(be32_to_cpu(stinfo-&gt;chip_id));</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : if (xscom) {</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : dt_for_each_node(xscom, node) {</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : if (dt_has_node_property(node, &quot;label&quot;, &quot;tpm&quot;))</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : }</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : if (node) {</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : addr = (uint64_t) stinfo +</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : be32_to_cpu(stinfo-&gt;srtm_log_offset);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : dt_add_property_u64s(node, &quot;linux,sml-base&quot;, addr);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;linux,sml-size&quot;,</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : be32_to_cpu(stinfo-&gt;srtm_log_size));</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : if (stinfo-&gt;tpm_status == TPM_PRESENT_AND_NOT_FUNCTIONAL)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;status&quot;, &quot;disabled&quot;);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : } else {</a>
+<a name="74"><span class="lineNum"> 74 </span> : : /**</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * @fwts-label HDATNoTpmForChipId</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * @fwts-advice HDAT secureboot_tpm_info</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * structure described a chip id, but no tpm</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * node was found under that xscom chip id.</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * This is most certainly a hostboot bug.</a>
+<a name="80"><span class="lineNum"> 80 </span> : : */</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;TPM node not found for &quot;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : &quot;chip_id=%d (HB bug)\n&quot;, stinfo-&gt;chip_id);</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : } else {</a>
+<a name="86"><span class="lineNum"> 86 </span> : : /**</a>
+<a name="87"><span class="lineNum"> 87 </span> : : * @fwts-label HDATBadChipIdForTPM</a>
+<a name="88"><span class="lineNum"> 88 </span> : : * @fwts-advice HDAT secureboot_tpm_info structure</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * described a chip id, but the xscom node for the</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * chip_id was not found.</a>
+<a name="91"><span class="lineNum"> 91 </span> : : * This is most certainly a firmware bug.</a>
+<a name="92"><span class="lineNum"> 92 </span> : : */</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;xscom node not found for chip_id=%d\n&quot;,</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : stinfo-&gt;chip_id);</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : }</a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : }</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : static struct dt_node *get_hb_reserved_memory(const char *label)</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> : : struct dt_node *node, *hb_reserved_mem;</a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : hb_reserved_mem = dt_find_by_path(dt_root, &quot;/ibm,hostboot/reserved-memory&quot;);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : if (!hb_reserved_mem) {</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;/ibm,hostboot/reserved-memory node not found\n&quot;);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : }</a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : dt_for_each_node(hb_reserved_mem, node) {</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : const char *prd_label;</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : if (!dt_find_property(node, &quot;ibm,prd-label&quot;))</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : prd_label = dt_prop_get(node, &quot;ibm,prd-label&quot;);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : if (!strcmp(prd_label, label))</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : return node;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : static struct {</a>
+<a name="122"><span class="lineNum"> 122 </span> : : uint32_t type;</a>
+<a name="123"><span class="lineNum"> 123 </span> : : const char *compat;</a>
+<a name="124"><span class="lineNum"> 124 </span> : : } cvc_services[] = {</a>
+<a name="125"><span class="lineNum"> 125 </span> : : { TPMREL_HV_SHA512, &quot;ibm,cvc-sha512&quot; },</a>
+<a name="126"><span class="lineNum"> 126 </span> : : { TPMREL_HV_VERIFY, &quot;ibm,cvc-verify&quot; },</a>
+<a name="127"><span class="lineNum"> 127 </span> : : };</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : static const char* cvc_service_map_compat(uint32_t type) {</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : int i;</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; ARRAY_SIZE(cvc_services); i++) {</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : if (cvc_services[i].type == type)</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : return cvc_services[i].compat;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : static void tpmrel_cvc_init(struct HDIF_common_hdr *hdif_hdr)</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : {</a>
+<a name="140"><span class="lineNum"> 140 </span> : : struct dt_node *cvc_reserved_mem, *node, *parent;</a>
+<a name="141"><span class="lineNum"> 141 </span> : : int count, i;</a>
+<a name="142"><span class="lineNum"> 142 </span> : : unsigned int asize;</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> : : /* Are the hdat values populated? */</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : if (!HDIF_get_idata(hdif_hdr, TPMREL_IDATA_HASH_VERIF_OFFSETS, &amp;asize))</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : if (asize &lt; sizeof(struct HDIF_array_hdr)) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;hash_and_verification idata not populated\n&quot;);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : }</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : node = dt_find_by_path(dt_root, &quot;/ibm,secureboot&quot;);</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (!node)</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : cvc_reserved_mem = get_hb_reserved_memory(&quot;secure-crypt-algo-code&quot;);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : if (!cvc_reserved_mem) {</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : /* Fallback to old style ibm,prd-label */</a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : cvc_reserved_mem = get_hb_reserved_memory(&quot;ibm,secure-crypt-algo-code&quot;);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : if (!cvc_reserved_mem) {</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;CVC reserved memory not found\n&quot;);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : }</a>
+<a name="164"><span class="lineNum"> 164 </span> : : }</a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : parent = dt_new(node, &quot;ibm,cvc&quot;);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : assert(parent);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(parent, &quot;#address-cells&quot;, 1);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(parent, &quot;#size-cells&quot;, 0);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(parent, &quot;compatible&quot;, &quot;ibm,container-verification-code&quot;);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(parent, &quot;memory-region&quot;, cvc_reserved_mem-&gt;phandle);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> : : /*</a>
+<a name="174"><span class="lineNum"> 174 </span> : : * Initialize each service provided by the container verification code</a>
+<a name="175"><span class="lineNum"> 175 </span> : : */</a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : count = HDIF_get_iarray_size(hdif_hdr, TPMREL_IDATA_HASH_VERIF_OFFSETS);</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : if (count &lt;= 0 ) {</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;no CVC service found\n&quot;);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : }</a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : const struct hash_and_verification *hv;</a>
+<a name="184"><span class="lineNum"> 184 </span> : : uint32_t type, offset, version;</a>
+<a name="185"><span class="lineNum"> 185 </span> : : const char *compat;</a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineNoCov"> 0 : hv = HDIF_get_iarray_item(hdif_hdr,</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : TPMREL_IDATA_HASH_VERIF_OFFSETS,</a>
+<a name="189"><span class="lineNum"> 189 </span> : : i, NULL);</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : type = be32_to_cpu(hv-&gt;type);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : offset = be32_to_cpu(hv-&gt;offset);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : version = be32_to_cpu(hv-&gt;version);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : compat = cvc_service_map_compat(type);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : if (!compat) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;CVC service type 0x%x unknown\n&quot;, type);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : }</a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : node = dt_new_addr(parent, &quot;ibm,cvc-service&quot;, offset);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : dt_add_property_strings(node, &quot;compatible&quot;, compat);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;reg&quot;, offset);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : dt_add_property_cells(node, &quot;version&quot;, version);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : }</a>
+<a name="206"><span class="lineNum"> 206 </span> : : }</a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : void node_stb_parse(void)</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : {</a>
+<a name="210"><span class="lineNum"> 210 </span> : : struct HDIF_common_hdr *hdif_hdr;</a>
+<a name="211"><span class="lineNum"> 211 </span> : : </a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineNoCov"> 0 : hdif_hdr = get_hdif(&amp;spira.ntuples.node_stb_data, STB_HDIF_SIG);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : if (!hdif_hdr) {</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : prlog(PR_DEBUG, &quot;TPMREL data not found\n&quot;);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : tpmrel_add_firmware_event_log(hdif_hdr);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : tpmrel_cvc_init(hdif_hdr);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/vpd-common.c.func-sort-c.html b/coverage-report/hdata/vpd-common.c.func-sort-c.html
new file mode 100644
index 0000000..bed52a1
--- /dev/null
+++ b/coverage-report/hdata/vpd-common.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/vpd-common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - vpd-common.c<span style="font-size: 80%;"> (<a href="vpd-common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="vpd-common.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd-common.c.gcov.html#16">machine_info_lookup</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/vpd-common.c.func.html b/coverage-report/hdata/vpd-common.c.func.html
new file mode 100644
index 0000000..9ab289d
--- /dev/null
+++ b/coverage-report/hdata/vpd-common.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/vpd-common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - vpd-common.c<span style="font-size: 80%;"> (<a href="vpd-common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="vpd-common.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd-common.c.gcov.html#16">machine_info_lookup</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/vpd-common.c.gcov.html b/coverage-report/hdata/vpd-common.c.gcov.html
new file mode 100644
index 0000000..f475a8c
--- /dev/null
+++ b/coverage-report/hdata/vpd-common.c.gcov.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/vpd-common.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - vpd-common.c<span style="font-size: 80%;"> (source / <a href="vpd-common.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;string.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;device.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : static const struct machine_info machine_table[] = {</a>
+<a name="10"><span class="lineNum"> 10 </span> : : {&quot;8247-21L&quot;, &quot;IBM Power System S812L&quot;},</a>
+<a name="11"><span class="lineNum"> 11 </span> : : {&quot;8247-22L&quot;, &quot;IBM Power System S822L&quot;},</a>
+<a name="12"><span class="lineNum"> 12 </span> : : {&quot;8247-24L&quot;, &quot;IBM Power System S824L&quot;},</a>
+<a name="13"><span class="lineNum"> 13 </span> : : {&quot;8286-41A&quot;, &quot;IBM Power System S814&quot;},</a>
+<a name="14"><span class="lineNum"> 14 </span> : : {&quot;8286-22A&quot;, &quot;IBM Power System S822&quot;},</a>
+<a name="15"><span class="lineNum"> 15 </span> : : {&quot;8286-42A&quot;, &quot;IBM Power System S824&quot;},</a>
+<a name="16"><span class="lineNum"> 16 </span> : : };</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 2 : const struct machine_info *machine_info_lookup(const char *mtm)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : int i;</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 6 : for(i = 0; i &lt; ARRAY_SIZE(machine_table); i++)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 6 : if (!strcmp(machine_table[i].mtm, mtm))</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 2 : return &amp;machine_table[i];</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/vpd.c.func-sort-c.html b/coverage-report/hdata/vpd.c.func-sort-c.html
new file mode 100644
index 0000000..04677a9
--- /dev/null
+++ b/coverage-report/hdata/vpd.c.func-sort-c.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/vpd.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - vpd.c<span style="font-size: 80%;"> (<a href="vpd.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">207</td>
+ <td class="headerCovTableEntry">273</td>
+ <td class="headerCovTableEntryMed">75.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="vpd.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#573">sysvpd_parse_opp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#257">vpd_opfr_parse</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#541">dt_add_model_name</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#407">dt_init_vpd_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#677">iohub_vpd_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#618">sysvpd_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#592">sysvpd_parse_legacy</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#724">vpd_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#655">iokid_vpd_parse</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#241">dt_add_proc_vendor</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#294">vpd_vrml_parse</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#711">_vpd_parse</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#201">card_info_lookup</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#313">vpd_vini_parse</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#491">dt_add_vpd_node</a></td>
+ <td class="coverFnHi">27</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#396">vpd_data_parse</a></td>
+ <td class="coverFnHi">30</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#387">valid_child_entry</a></td>
+ <td class="coverFnHi">139</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#187">vpd_map_name</a></td>
+ <td class="coverFnHi">157</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#212">dt_add_prop_sanitize_val</a></td>
+ <td class="coverFnHi">218</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/vpd.c.func.html b/coverage-report/hdata/vpd.c.func.html
new file mode 100644
index 0000000..55b2c42
--- /dev/null
+++ b/coverage-report/hdata/vpd.c.func.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/vpd.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - vpd.c<span style="font-size: 80%;"> (<a href="vpd.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">207</td>
+ <td class="headerCovTableEntry">273</td>
+ <td class="headerCovTableEntryMed">75.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="vpd.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#711">_vpd_parse</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#201">card_info_lookup</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#541">dt_add_model_name</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#241">dt_add_proc_vendor</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#212">dt_add_prop_sanitize_val</a></td>
+ <td class="coverFnHi">218</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#491">dt_add_vpd_node</a></td>
+ <td class="coverFnHi">27</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#407">dt_init_vpd_node</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#677">iohub_vpd_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#655">iokid_vpd_parse</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#618">sysvpd_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#592">sysvpd_parse_legacy</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#573">sysvpd_parse_opp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#387">valid_child_entry</a></td>
+ <td class="coverFnHi">139</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#396">vpd_data_parse</a></td>
+ <td class="coverFnHi">30</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#187">vpd_map_name</a></td>
+ <td class="coverFnHi">157</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#257">vpd_opfr_parse</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#724">vpd_parse</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#313">vpd_vini_parse</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vpd.c.gcov.html#294">vpd_vrml_parse</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hdata/vpd.c.gcov.html b/coverage-report/hdata/vpd.c.gcov.html
new file mode 100644
index 0000000..4edc50c
--- /dev/null
+++ b/coverage-report/hdata/vpd.c.gcov.html
@@ -0,0 +1,851 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hdata/vpd.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hdata</a> - vpd.c<span style="font-size: 80%;"> (source / <a href="vpd.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">207</td>
+ <td class="headerCovTableEntry">273</td>
+ <td class="headerCovTableEntryMed">75.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;vpd.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;string.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &quot;spira.h&quot;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;device.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;hdata.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct card_info {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : const char *ccin; /* Customer card identification number */</a>
+<a name="16"><span class="lineNum"> 16 </span> : : const char *description;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : };</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : static const struct card_info card_table[] = {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : {&quot;2B06&quot;, &quot;System planar 2S4U&quot;},</a>
+<a name="21"><span class="lineNum"> 21 </span> : : {&quot;2B07&quot;, &quot;System planar 1S4U&quot;},</a>
+<a name="22"><span class="lineNum"> 22 </span> : : {&quot;2B2E&quot;, &quot;System planar 2S2U&quot;},</a>
+<a name="23"><span class="lineNum"> 23 </span> : : {&quot;2B2F&quot;, &quot;System planar 1S2U&quot;},</a>
+<a name="24"><span class="lineNum"> 24 </span> : : {&quot;2CD4&quot;, &quot;System planar 2S4U&quot;},</a>
+<a name="25"><span class="lineNum"> 25 </span> : : {&quot;2CD5&quot;, &quot;System planar 1S4U&quot;},</a>
+<a name="26"><span class="lineNum"> 26 </span> : : {&quot;2CD6&quot;, &quot;System planar 2S2U&quot;},</a>
+<a name="27"><span class="lineNum"> 27 </span> : : {&quot;2CD7&quot;, &quot;System planar 1S2U&quot;},</a>
+<a name="28"><span class="lineNum"> 28 </span> : : {&quot;2CD7&quot;, &quot;System planar 1S2U&quot;},</a>
+<a name="29"><span class="lineNum"> 29 </span> : : {&quot;2B09&quot;, &quot;Base JBOD, RAID and Backplane HD&quot;},</a>
+<a name="30"><span class="lineNum"> 30 </span> : : {&quot;57D7&quot;, &quot;Split JBOD, RAID Card&quot;},</a>
+<a name="31"><span class="lineNum"> 31 </span> : : {&quot;2B0B&quot;, &quot;Native I/O Card&quot;},</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* Anchor cards */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : {&quot;52FE&quot;, &quot;System Anchor Card - IBM Power 824&quot;},</a>
+<a name="35"><span class="lineNum"> 35 </span> : : {&quot;52F2&quot;, &quot;System Anchor Card - IBM Power 814&quot;},</a>
+<a name="36"><span class="lineNum"> 36 </span> : : {&quot;52F5&quot;, &quot;System Anchor Card - IBM Power 822&quot;},</a>
+<a name="37"><span class="lineNum"> 37 </span> : : {&quot;561A&quot;, &quot;System Anchor Card - IBM Power 824L&quot;},</a>
+<a name="38"><span class="lineNum"> 38 </span> : : {&quot;524D&quot;, &quot;System Anchor Card - IBM Power 822L&quot;},</a>
+<a name="39"><span class="lineNum"> 39 </span> : : {&quot;560F&quot;, &quot;System Anchor Card - IBM Power 812L&quot;},</a>
+<a name="40"><span class="lineNum"> 40 </span> : : {&quot;561C&quot;, &quot;System Anchor Card - DS8870&quot;},</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /* Memory DIMMs */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : {&quot;31E0&quot;, &quot;16GB CDIMM&quot;},</a>
+<a name="44"><span class="lineNum"> 44 </span> : : {&quot;31E8&quot;, &quot;16GB CDIMM&quot;},</a>
+<a name="45"><span class="lineNum"> 45 </span> : : {&quot;31E1&quot;, &quot;32GB CDIMM&quot;},</a>
+<a name="46"><span class="lineNum"> 46 </span> : : {&quot;31E9&quot;, &quot;32GB CDIMM&quot;},</a>
+<a name="47"><span class="lineNum"> 47 </span> : : {&quot;31E2&quot;, &quot;64GB CDIMM&quot;},</a>
+<a name="48"><span class="lineNum"> 48 </span> : : {&quot;31EA&quot;, &quot;64GB CDIMM&quot;},</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : /* Power supplies */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : {&quot;2B1D&quot;, &quot;Power Supply 900W AC&quot;},</a>
+<a name="52"><span class="lineNum"> 52 </span> : : {&quot;2B1E&quot;, &quot;Power Supply 1400W AC&quot;},</a>
+<a name="53"><span class="lineNum"> 53 </span> : : {&quot;2B75&quot;, &quot;Power Supply 1400W HVDC&quot;},</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : /* Fans */</a>
+<a name="56"><span class="lineNum"> 56 </span> : : {&quot;2B1F&quot;, &quot;Fan 4U (A1, A2, A3, A4)&quot;},</a>
+<a name="57"><span class="lineNum"> 57 </span> : : {&quot;2B29&quot;, &quot;Fan 2U (A1, A2, A3, A4, A5, A6)&quot;},</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> : : /* Other cards */</a>
+<a name="60"><span class="lineNum"> 60 </span> : : };</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> : : struct vpd_key_map {</a>
+<a name="63"><span class="lineNum"> 63 </span> : : const char *keyword; /* 2 char keyword */</a>
+<a name="64"><span class="lineNum"> 64 </span> : : const char *description;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : };</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : static const struct vpd_key_map vpd_key_table[] = {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : {&quot;AA&quot;, &quot;ac-power-supply&quot;},</a>
+<a name="69"><span class="lineNum"> 69 </span> : : {&quot;AM&quot;, &quot;air-mover&quot;},</a>
+<a name="70"><span class="lineNum"> 70 </span> : : {&quot;AV&quot;, &quot;anchor-card&quot;},</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : {&quot;BA&quot;, &quot;bus-adapter-card&quot;},</a>
+<a name="73"><span class="lineNum"> 73 </span> : : {&quot;BC&quot;, &quot;battery-charger&quot;},</a>
+<a name="74"><span class="lineNum"> 74 </span> : : {&quot;BD&quot;, &quot;bus-daughter-card&quot;},</a>
+<a name="75"><span class="lineNum"> 75 </span> : : {&quot;BE&quot;, &quot;bus-expansion-card&quot;},</a>
+<a name="76"><span class="lineNum"> 76 </span> : : {&quot;BP&quot;, &quot;backplane&quot;},</a>
+<a name="77"><span class="lineNum"> 77 </span> : : {&quot;BR&quot;, &quot;backplane-riser&quot;},</a>
+<a name="78"><span class="lineNum"> 78 </span> : : {&quot;BX&quot;, &quot;backplane-extender&quot;},</a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : {&quot;CA&quot;, &quot;calgary-bridge&quot;},</a>
+<a name="81"><span class="lineNum"> 81 </span> : : {&quot;CB&quot;, &quot;infiniband-connector&quot;},</a>
+<a name="82"><span class="lineNum"> 82 </span> : : {&quot;CC&quot;, &quot;clock-card&quot;},</a>
+<a name="83"><span class="lineNum"> 83 </span> : : {&quot;CD&quot;, &quot;card-connector&quot;},</a>
+<a name="84"><span class="lineNum"> 84 </span> : : {&quot;CE&quot;, &quot;ethernet-connector&quot;},</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {&quot;CL&quot;, &quot;calgary-phb&quot;},</a>
+<a name="86"><span class="lineNum"> 86 </span> : : {&quot;CI&quot;, &quot;capacity-card&quot;},</a>
+<a name="87"><span class="lineNum"> 87 </span> : : {&quot;CO&quot;, &quot;sma-connector&quot;},</a>
+<a name="88"><span class="lineNum"> 88 </span> : : {&quot;CP&quot;, &quot;processor-capacity-card&quot;},</a>
+<a name="89"><span class="lineNum"> 89 </span> : : {&quot;CR&quot;, &quot;rio-connector&quot;},</a>
+<a name="90"><span class="lineNum"> 90 </span> : : {&quot;CS&quot;, &quot;serial-connector&quot;},</a>
+<a name="91"><span class="lineNum"> 91 </span> : : {&quot;CU&quot;, &quot;usb-connector&quot;},</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> : : {&quot;DB&quot;, &quot;dasd-backplane&quot;},</a>
+<a name="94"><span class="lineNum"> 94 </span> : : {&quot;DC&quot;, &quot;drawer-card&quot;},</a>
+<a name="95"><span class="lineNum"> 95 </span> : : {&quot;DE&quot;, &quot;drawer-extension&quot;},</a>
+<a name="96"><span class="lineNum"> 96 </span> : : {&quot;DI&quot;, &quot;drawer-interposer&quot;},</a>
+<a name="97"><span class="lineNum"> 97 </span> : : {&quot;DL&quot;, &quot;p7ih-dlink-connector&quot;},</a>
+<a name="98"><span class="lineNum"> 98 </span> : : {&quot;DT&quot;, &quot;legacy-pci-card&quot;},</a>
+<a name="99"><span class="lineNum"> 99 </span> : : {&quot;DV&quot;, &quot;media-drawer-led&quot;},</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : {&quot;EI&quot;, &quot;enclosure-led&quot;},</a>
+<a name="102"><span class="lineNum"> 102 </span> : : {&quot;EF&quot;, &quot;enclosure-fault-led&quot;},</a>
+<a name="103"><span class="lineNum"> 103 </span> : : {&quot;ES&quot;, &quot;embedded-sas&quot;},</a>
+<a name="104"><span class="lineNum"> 104 </span> : : {&quot;ET&quot;, &quot;ethernet-riser&quot;},</a>
+<a name="105"><span class="lineNum"> 105 </span> : : {&quot;EV&quot;, &quot;enclosure&quot;},</a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : {&quot;FM&quot;, &quot;frame&quot;},</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> : : {&quot;HB&quot;, &quot;host-rio-pci-card&quot;},</a>
+<a name="110"><span class="lineNum"> 110 </span> : : {&quot;HD&quot;, &quot;high-speed-card&quot;},</a>
+<a name="111"><span class="lineNum"> 111 </span> : : {&quot;HM&quot;, &quot;hmc-connector&quot;},</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : {&quot;IB&quot;, &quot;io-backplane&quot;},</a>
+<a name="114"><span class="lineNum"> 114 </span> : : {&quot;IC&quot;, &quot;io-card&quot;},</a>
+<a name="115"><span class="lineNum"> 115 </span> : : {&quot;ID&quot;, &quot;ide-connector&quot;},</a>
+<a name="116"><span class="lineNum"> 116 </span> : : {&quot;II&quot;, &quot;io-drawer-led&quot;},</a>
+<a name="117"><span class="lineNum"> 117 </span> : : {&quot;IP&quot;, &quot;interplane-card&quot;},</a>
+<a name="118"><span class="lineNum"> 118 </span> : : {&quot;IS&quot;, &quot;smp-vbus-cable&quot;},</a>
+<a name="119"><span class="lineNum"> 119 </span> : : {&quot;IT&quot;, &quot;enclosure-cable&quot;},</a>
+<a name="120"><span class="lineNum"> 120 </span> : : {&quot;IV&quot;, &quot;io-enclosure&quot;},</a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : {&quot;KV&quot;, &quot;keyboard-led&quot;},</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : {&quot;L2&quot;, &quot;l2-cache-module&quot;},</a>
+<a name="125"><span class="lineNum"> 125 </span> : : {&quot;L3&quot;, &quot;l3-cache-module&quot;},</a>
+<a name="126"><span class="lineNum"> 126 </span> : : {&quot;LC&quot;, &quot;squadrons-light-connector&quot;},</a>
+<a name="127"><span class="lineNum"> 127 </span> : : {&quot;LR&quot;, &quot;p7ih-connector&quot;},</a>
+<a name="128"><span class="lineNum"> 128 </span> : : {&quot;LO&quot;, &quot;system-locate-led&quot;},</a>
+<a name="129"><span class="lineNum"> 129 </span> : : {&quot;LT&quot;, &quot;squadrons-light-strip&quot;},</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : {&quot;MB&quot;, &quot;media-backplane&quot;},</a>
+<a name="132"><span class="lineNum"> 132 </span> : : {&quot;ME&quot;, &quot;map-extension&quot;},</a>
+<a name="133"><span class="lineNum"> 133 </span> : : {&quot;MM&quot;, &quot;mip-meter&quot;},</a>
+<a name="134"><span class="lineNum"> 134 </span> : : {&quot;MS&quot;, &quot;ms-dimm&quot;},</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : {&quot;NB&quot;, &quot;nvram-battery&quot;},</a>
+<a name="137"><span class="lineNum"> 137 </span> : : {&quot;NC&quot;, &quot;sp-node-controller&quot;},</a>
+<a name="138"><span class="lineNum"> 138 </span> : : {&quot;ND&quot;, &quot;numa-dimm&quot;},</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> : : {&quot;OD&quot;, &quot;cuod-card&quot;},</a>
+<a name="141"><span class="lineNum"> 141 </span> : : {&quot;OP&quot;, &quot;op-panel&quot;},</a>
+<a name="142"><span class="lineNum"> 142 </span> : : {&quot;OS&quot;, &quot;oscillator&quot;},</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> : : {&quot;P2&quot;, &quot;ioc&quot;},</a>
+<a name="145"><span class="lineNum"> 145 </span> : : {&quot;P5&quot;, &quot;ioc-bridge&quot;},</a>
+<a name="146"><span class="lineNum"> 146 </span> : : {&quot;PB&quot;, &quot;io-drawer-backplane&quot;},</a>
+<a name="147"><span class="lineNum"> 147 </span> : : {&quot;PC&quot;, &quot;power-capacitor&quot;},</a>
+<a name="148"><span class="lineNum"> 148 </span> : : {&quot;PD&quot;, &quot;processor-card&quot;},</a>
+<a name="149"><span class="lineNum"> 149 </span> : : {&quot;PF&quot;, &quot;processor&quot;},</a>
+<a name="150"><span class="lineNum"> 150 </span> : : {&quot;PI&quot;, &quot;ioc-phb&quot;},</a>
+<a name="151"><span class="lineNum"> 151 </span> : : {&quot;PO&quot;, &quot;spcn&quot;},</a>
+<a name="152"><span class="lineNum"> 152 </span> : : {&quot;PN&quot;, &quot;spcn-connector&quot;},</a>
+<a name="153"><span class="lineNum"> 153 </span> : : {&quot;PR&quot;, &quot;pci-riser-card&quot;},</a>
+<a name="154"><span class="lineNum"> 154 </span> : : {&quot;PS&quot;, &quot;power-supply&quot;},</a>
+<a name="155"><span class="lineNum"> 155 </span> : : {&quot;PT&quot;, &quot;pass-through-card&quot;},</a>
+<a name="156"><span class="lineNum"> 156 </span> : : {&quot;PX&quot;, &quot;psc-sync-card&quot;},</a>
+<a name="157"><span class="lineNum"> 157 </span> : : {&quot;PW&quot;, &quot;power-connector&quot;},</a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> : : {&quot;RG&quot;, &quot;regulator&quot;},</a>
+<a name="160"><span class="lineNum"> 160 </span> : : {&quot;RI&quot;, &quot;riser&quot;},</a>
+<a name="161"><span class="lineNum"> 161 </span> : : {&quot;RK&quot;, &quot;rack-indicator&quot;},</a>
+<a name="162"><span class="lineNum"> 162 </span> : : {&quot;RW&quot;, &quot;riscwatch-connector&quot;},</a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> : : {&quot;SA&quot;, &quot;sys-attn-led&quot;},</a>
+<a name="165"><span class="lineNum"> 165 </span> : : {&quot;SB&quot;, &quot;backup-sysvpd&quot;},</a>
+<a name="166"><span class="lineNum"> 166 </span> : : {&quot;SC&quot;, &quot;scsi-connector&quot;},</a>
+<a name="167"><span class="lineNum"> 167 </span> : : {&quot;SD&quot;, &quot;sas-connector&quot;},</a>
+<a name="168"><span class="lineNum"> 168 </span> : : {&quot;SI&quot;, &quot;scsi-ide-converter&quot;},</a>
+<a name="169"><span class="lineNum"> 169 </span> : : {&quot;SL&quot;, &quot;phb-slot&quot;},</a>
+<a name="170"><span class="lineNum"> 170 </span> : : {&quot;SN&quot;, &quot;smp-cable-connector&quot;},</a>
+<a name="171"><span class="lineNum"> 171 </span> : : {&quot;SP&quot;, &quot;service-processor&quot;},</a>
+<a name="172"><span class="lineNum"> 172 </span> : : {&quot;SR&quot;, &quot;service-card&quot;},</a>
+<a name="173"><span class="lineNum"> 173 </span> : : {&quot;SS&quot;, &quot;soft-switch&quot;},</a>
+<a name="174"><span class="lineNum"> 174 </span> : : {&quot;SV&quot;, &quot;system-vpd&quot;},</a>
+<a name="175"><span class="lineNum"> 175 </span> : : {&quot;SY&quot;, &quot;legacy-sysvpd&quot;},</a>
+<a name="176"><span class="lineNum"> 176 </span> : : </a>
+<a name="177"><span class="lineNum"> 177 </span> : : {&quot;TD&quot;, &quot;tod-clock&quot;},</a>
+<a name="178"><span class="lineNum"> 178 </span> : : {&quot;TI&quot;, &quot;torrent-pcie-phb&quot;},</a>
+<a name="179"><span class="lineNum"> 179 </span> : : {&quot;TL&quot;, &quot;torrent-riser&quot;},</a>
+<a name="180"><span class="lineNum"> 180 </span> : : {&quot;TM&quot;, &quot;thermal-sensor&quot;},</a>
+<a name="181"><span class="lineNum"> 181 </span> : : {&quot;TP&quot;, &quot;tpmd-adapter&quot;},</a>
+<a name="182"><span class="lineNum"> 182 </span> : : {&quot;TR&quot;, &quot;torrent-bridge&quot;},</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : {&quot;VV&quot;, &quot;root-node-vpd&quot;},</a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> : : {&quot;WD&quot;, &quot;water_device&quot;},</a>
+<a name="187"><span class="lineNum"> 187 </span> : : };</a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 157 : static const char *vpd_map_name(const char *vpd_name)</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : {</a>
+<a name="191"><span class="lineNum"> 191 </span> : : int i;</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 5382 : for (i = 0; i &lt; ARRAY_SIZE(vpd_key_table); i++)</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 5382 : if (!strcmp(vpd_key_table[i].keyword, vpd_name))</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 157 : return vpd_key_table[i].description;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;VPD: Could not map FRU ID %s to a known name\n&quot;,</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : vpd_name);</a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : return &quot;Unknown&quot;;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> : : }</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 24 : static const struct card_info *card_info_lookup(char *ccin)</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : {</a>
+<a name="205"><span class="lineNum"> 205 </span> : : int i;</a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 474 : for(i = 0; i &lt; ARRAY_SIZE(card_table); i++)</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : /* CCIN is always 4 bytes in size */</a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 466 : if (!strncmp(card_table[i].ccin, ccin, 4))</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 16 : return &amp;card_table[i];</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 8 : return NULL;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /* Discard trailing spaces and populate device tree */</a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 218 : static struct dt_property *dt_add_prop_sanitize_val(struct dt_node *node,</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : const char *name, const char *val, int vlen)</a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 218 : char *prop = zalloc(vlen + 1);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : int i;</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 218 : struct dt_property *p = NULL;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 218 : if (!prop)</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : return p;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 218 : memcpy(prop, val, vlen);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 226 : for (i = vlen - 1; i &gt;= 0; i--) {</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 226 : if (prop[i] != 0x20) {</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 218 : prop[i + 1] = '\0';</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 218 : break;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : }</a>
+<a name="231"><span class="lineNum"> 231 </span> : : </a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 218 : if (i &gt;= 0 &amp;&amp; !dt_find_property(node, name))</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 218 : p = dt_add_property_string(node, name, prop);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 218 : free(prop);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 218 : return p;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : }</a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> : : /*</a>
+<a name="240"><span class="lineNum"> 240 </span> : : * OpenPower system does not provide processor vendor name under FRU VPD.</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * Parse processor module VPD to get vendor detail</a>
+<a name="242"><span class="lineNum"> 242 </span> : : */</a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 6 : void dt_add_proc_vendor(struct dt_node *proc_node,</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : const void *mvpd, unsigned int mvpd_sz)</a>
+<a name="245"><span class="lineNum"> 245 </span> : : {</a>
+<a name="246"><span class="lineNum"> 246 </span> : : const void *kw;</a>
+<a name="247"><span class="lineNum"> 247 </span> : : uint8_t sz;</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 6 : kw = vpd_find(mvpd, mvpd_sz, &quot;VINI&quot;, &quot;VN&quot;, &amp;sz);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 6 : if (kw)</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(proc_node, &quot;vendor&quot;, kw, sz);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 6 : }</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> : : /*</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * For OpenPOWER, we only decipher OPFR records. While OP HDAT have VINI</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * records too, populating the fields in there is optional. Also, there</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * is an overlap in the fields contained therein.</a>
+<a name="258"><span class="lineNum"> 258 </span> : : */</a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineNoCov"> 0 : static void vpd_opfr_parse(struct dt_node *node,</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : const void *fruvpd, unsigned int fruvpd_sz)</a>
+<a name="261"><span class="lineNum"> 261 </span> : : {</a>
+<a name="262"><span class="lineNum"> 262 </span> : : const void *kw;</a>
+<a name="263"><span class="lineNum"> 263 </span> : : uint8_t sz;</a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> : : /* Vendor Name */</a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;OPFR&quot;, &quot;VN&quot;, &amp;sz);</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : if (kw)</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(node, &quot;vendor&quot;, kw, sz);</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> : : /* FRU Description */</a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;OPFR&quot;, &quot;DR&quot;, &amp;sz);</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : if (kw)</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(node, &quot;description&quot;, kw, sz);</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /* Part number */</a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;OPFR&quot;, &quot;VP&quot;, &amp;sz);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : if (kw)</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(node, &quot;part-number&quot;, kw, sz);</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> : : /* Serial number */</a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;OPFR&quot;, &quot;VS&quot;, &amp;sz);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : if (kw)</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(node, &quot;serial-number&quot;, kw, sz);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> : : /* Build date in BCD */</a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;OPFR&quot;, &quot;MB&quot;, &amp;sz);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : if (kw)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(node, &quot;build-date&quot;, kw, sz);</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : }</a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> : : /*</a>
+<a name="294"><span class="lineNum"> 294 </span> : : * For CPUs, parse the VRML data.</a>
+<a name="295"><span class="lineNum"> 295 </span> : : */</a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 6 : static void vpd_vrml_parse(struct dt_node *node,</span></a>
+<a name="297"><span class="lineNum"> 297 </span> : : const void *fruvpd, unsigned int fruvpd_sz)</a>
+<a name="298"><span class="lineNum"> 298 </span> : : {</a>
+<a name="299"><span class="lineNum"> 299 </span> : : const void *kw;</a>
+<a name="300"><span class="lineNum"> 300 </span> : : uint8_t sz;</a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> : : /* Part number */</a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 6 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VRML&quot;, &quot;PN&quot;, &amp;sz);</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 6 : if (kw)</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 6 : dt_add_prop_sanitize_val(node, &quot;part-number&quot;, kw, sz);</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> : : /* Serial number */</a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 6 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VRML&quot;, &quot;SN&quot;, &amp;sz);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 6 : if (kw)</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 6 : dt_add_prop_sanitize_val(node, &quot;serial-number&quot;, kw, sz);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 6 : return;</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : }</a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 24 : static void vpd_vini_parse(struct dt_node *node,</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : const void *fruvpd, unsigned int fruvpd_sz)</a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> : : const void *kw;</a>
+<a name="319"><span class="lineNum"> 319 </span> : : const char *desc;</a>
+<a name="320"><span class="lineNum"> 320 </span> : : uint8_t sz;</a>
+<a name="321"><span class="lineNum"> 321 </span> : : const struct card_info *cinfo;</a>
+<a name="322"><span class="lineNum"> 322 </span> : : </a>
+<a name="323"><span class="lineNum"> 323 </span> : : /* FRU Stocking Part Number */</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;FN&quot;, &amp;sz);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;fru-number&quot;, kw, sz);</span></a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /* Serial Number */</a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;SN&quot;, &amp;sz);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;serial-number&quot;, kw, sz);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> : : </a>
+<a name="333"><span class="lineNum"> 333 </span> : : /* Part Number */</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;PN&quot;, &amp;sz);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;part-number&quot;, kw, sz);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : /* Vendor Name */</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;VN&quot;, &amp;sz);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(node, &quot;vendor&quot;, kw, sz);</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : </a>
+<a name="343"><span class="lineNum"> 343 </span> : : /* CCIN Extension */</a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;CE&quot;, &amp;sz);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;ccin-extension&quot;, kw, sz);</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /* HW Version info */</a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;HW&quot;, &amp;sz);</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;hw-version&quot;, kw, sz);</span></a>
+<a name="352"><span class="lineNum"> 352 </span> : : </a>
+<a name="353"><span class="lineNum"> 353 </span> : : /* Card type info */</a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;CT&quot;, &amp;sz);</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;card-type&quot;, kw, sz);</span></a>
+<a name="357"><span class="lineNum"> 357 </span> : : </a>
+<a name="358"><span class="lineNum"> 358 </span> : : /* HW characteristics info */</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;B3&quot;, &amp;sz);</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 24 : if (kw)</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;hw-characteristics&quot;, kw, sz);</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> : : /* Customer Card Identification Number (CCIN) */</a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 24 : kw = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;CC&quot;, &amp;sz);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 24 : if (kw) {</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 24 : dt_add_prop_sanitize_val(node, &quot;ccin&quot;, kw, sz);</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 24 : cinfo = card_info_lookup((char *)kw);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 24 : if (cinfo) {</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 16 : dt_add_property_string(node,</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : &quot;description&quot;, cinfo-&gt;description);</a>
+<a name="372"><span class="lineNum"> 372 </span> : : } else {</a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 8 : desc = vpd_find(fruvpd, fruvpd_sz, &quot;VINI&quot;, &quot;DR&quot;, &amp;sz);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 8 : if (desc) {</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 8 : dt_add_prop_sanitize_val(node,</span></a>
+<a name="376"><span class="lineNum"> 376 </span> : : &quot;description&quot;, desc, sz);</a>
+<a name="377"><span class="lineNum"> 377 </span> : : } else {</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(node, &quot;description&quot;, &quot;Unknown&quot;);</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING,</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : &quot;VPD: CCIN desc not available for: %s\n&quot;,</a>
+<a name="381"><span class="lineNum"> 381 </span> : : (char*)kw);</a>
+<a name="382"><span class="lineNum"> 382 </span> : : }</a>
+<a name="383"><span class="lineNum"> 383 </span> : : }</a>
+<a name="384"><span class="lineNum"> 384 </span> : : }</a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 24 : return;</span></a>
+<a name="387"><span class="lineNum"> 387 </span> : : }</a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 139 : static bool valid_child_entry(const struct slca_entry *entry)</span></a>
+<a name="390"><span class="lineNum"> 390 </span> : : {</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 139 : if ((entry-&gt;install_indic == SLCA_INSTALL_INSTALLED) &amp;&amp;</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 66 : (entry-&gt;vpd_collected == SLCA_VPD_COLLECTED))</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 66 : return true;</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : </a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 73 : return false;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> : : }</a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 30 : void vpd_data_parse(struct dt_node *node, const void *fruvpd, u32 fruvpd_sz)</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : {</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 30 : if (vpd_find_record(fruvpd, fruvpd_sz, &quot;OPFR&quot;, NULL))</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : vpd_opfr_parse(node, fruvpd, fruvpd_sz);</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 30 : else if (vpd_find_record(fruvpd, fruvpd_sz, &quot;VRML&quot;, NULL))</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 6 : vpd_vrml_parse(node, fruvpd, fruvpd_sz);</span></a>
+<a name="404"><span class="lineNum"> 404 </span> : : else</a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 24 : vpd_vini_parse(node, fruvpd, fruvpd_sz);</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 30 : }</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> : : /* Create the /vpd node and add its children */</a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 2 : void dt_init_vpd_node(void)</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : {</a>
+<a name="411"><span class="lineNum"> 411 </span> : : const char *name, *p_name;</a>
+<a name="412"><span class="lineNum"> 412 </span> : : int count, index;</a>
+<a name="413"><span class="lineNum"> 413 </span> : : uint64_t addr, p_addr;</a>
+<a name="414"><span class="lineNum"> 414 </span> : : struct dt_node *dt_vpd;</a>
+<a name="415"><span class="lineNum"> 415 </span> : : struct HDIF_common_hdr *slca_hdr;</a>
+<a name="416"><span class="lineNum"> 416 </span> : : struct dt_node *parent, *node;</a>
+<a name="417"><span class="lineNum"> 417 </span> : : const struct slca_entry *entry, *p_entry;</a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineCov"> 2 : dt_vpd = dt_new(dt_root, &quot;vpd&quot;);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 2 : assert(dt_vpd);</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineCov"> 2 : dt_add_property_string(dt_vpd, &quot;compatible&quot;, &quot;ibm,opal-v3-vpd&quot;);</span></a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineCov"> 2 : dt_add_property_cells(dt_vpd, &quot;#size-cells&quot;, 0);</span></a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 2 : dt_add_property_cells(dt_vpd, &quot;#address-cells&quot;, 1);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> : : </a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 2 : slca_hdr = get_hdif(&amp;spira.ntuples.slca, SLCA_HDIF_SIG);</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 2 : if (!slca_hdr) {</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SLCA Invalid\n&quot;);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="429"><span class="lineNum"> 429 </span> : : }</a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 2 : count = HDIF_get_iarray_size(slca_hdr, SLCA_IDATA_ARRAY);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 2 : if (count &lt; 0) {</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : prerror(&quot;SLCA: Can't find SLCA array size!\n&quot;);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 141 : for (index = 0; index &lt; count; index++) {</span></a>
+<a name="438"><span class="lineNum"> 438 </span> : : /* Get SLCA entry */</a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 139 : entry = slca_get_entry(index);</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 139 : if (!entry)</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> : : /*</a>
+<a name="444"><span class="lineNum"> 444 </span> : : * A child entry is valid if all of the following criteria is met</a>
+<a name="445"><span class="lineNum"> 445 </span> : : * a. SLCA_INSTALL_INSTALLED is set in s_entry-&gt;install_indic</a>
+<a name="446"><span class="lineNum"> 446 </span> : : * b. SLCA_VPD_COLLECTED is set in s_entry-&gt;vpd_collected</a>
+<a name="447"><span class="lineNum"> 447 </span> : : * c. The SLCA is not a duplicate entry.</a>
+<a name="448"><span class="lineNum"> 448 </span> : : */</a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineCov"> 139 : if (!valid_child_entry(entry))</span></a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineCov"> 73 : goto next_entry;</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : </a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 66 : name = vpd_map_name(entry-&gt;fru_id);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 66 : addr = be16_to_cpu(entry-&gt;rsrc_id);</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : /* Check node is already created or not */</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 66 : if (dt_find_by_name_addr(dt_vpd, name, addr))</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : goto next_entry;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : </a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* Get parent node */</a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 66 : if (index == SLCA_ROOT_INDEX) {</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 2 : parent = dt_vpd;</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : } else {</a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 64 : p_entry = slca_get_entry(be16_to_cpu(entry-&gt;parent_index));</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 64 : if (!p_entry)</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : goto next_entry;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineCov"> 64 : p_name = vpd_map_name(p_entry-&gt;fru_id);</span></a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 64 : p_addr = be16_to_cpu(p_entry-&gt;rsrc_id);</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 64 : parent = dt_find_by_name_addr(dt_vpd, p_name, p_addr);</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : }</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 66 : if (!parent)</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : goto next_entry;</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 66 : node = dt_new_addr(parent, name, addr);</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 66 : if (!node) {</span></a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineNoCov"> 0 : prerror(&quot;VPD: Creating node at %s@%&quot;PRIx64&quot; failed\n&quot;,</span></a>
+<a name="475"><span class="lineNum"> 475 </span> : : name, addr);</a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : goto next_entry;</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : }</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> : : /* Add location code */</a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineCov"> 66 : slca_vpd_add_loc_code(node, be16_to_cpu(entry-&gt;my_index));</span></a>
+<a name="481"><span class="lineNum"> 481 </span> : : /* Add FRU label */</a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 66 : dt_add_property(node, &quot;fru-type&quot;, entry-&gt;fru_id, 2);</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 66 : dt_add_property_cells(node, &quot;reg&quot;, addr);</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 66 : dt_add_property_cells(node, &quot;#size-cells&quot;, 0);</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineCov"> 66 : dt_add_property_cells(node, &quot;#address-cells&quot;, 1);</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : </a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 139 : next_entry:</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : /* Skip dups -- dups are contiguous */</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 139 : index += entry-&gt;nr_dups;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> : : }</a>
+<a name="491"><span class="lineNum"> 491 </span> : : }</a>
+<a name="492"><span class="lineNum"> 492 </span> : : </a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 27 : struct dt_node *dt_add_vpd_node(const struct HDIF_common_hdr *hdr,</span></a>
+<a name="494"><span class="lineNum"> 494 </span> : : int indx_fru, int indx_vpd)</a>
+<a name="495"><span class="lineNum"> 495 </span> : : {</a>
+<a name="496"><span class="lineNum"> 496 </span> : : const struct spira_fru_id *fru_id;</a>
+<a name="497"><span class="lineNum"> 497 </span> : : unsigned int fruvpd_sz, fru_id_sz;</a>
+<a name="498"><span class="lineNum"> 498 </span> : : const struct slca_entry *entry;</a>
+<a name="499"><span class="lineNum"> 499 </span> : : struct dt_node *dt_vpd, *node;</a>
+<a name="500"><span class="lineNum"> 500 </span> : : const void *fruvpd;</a>
+<a name="501"><span class="lineNum"> 501 </span> : : const char *name;</a>
+<a name="502"><span class="lineNum"> 502 </span> : : uint64_t addr;</a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 27 : fru_id = HDIF_get_idata(hdr, indx_fru, &amp;fru_id_sz);</span></a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineCov"> 27 : if (!fru_id)</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="507"><span class="lineNum"> 507 </span> : : </a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 27 : fruvpd = HDIF_get_idata(hdr, indx_vpd, &amp;fruvpd_sz);</span></a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 27 : if (!CHECK_SPPTR(fruvpd))</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> : : </a>
+<a name="512"><span class="lineNum"> 512 </span> :<span class="lineCov"> 27 : dt_vpd = dt_find_by_path(dt_root, &quot;/vpd&quot;);</span></a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 27 : if (!dt_vpd)</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : </a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineCov"> 27 : entry = slca_get_entry(be16_to_cpu(fru_id-&gt;slca_index));</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 27 : if (!entry)</span></a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 27 : name = vpd_map_name(entry-&gt;fru_id);</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineCov"> 27 : addr = be16_to_cpu(entry-&gt;rsrc_id);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> : : /* Get the node already created */</a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineCov"> 27 : node = dt_find_by_name_addr(dt_vpd, name, addr);</span></a>
+<a name="524"><span class="lineNum"> 524 </span> : : /*</a>
+<a name="525"><span class="lineNum"> 525 </span> : : * It is unlikely that node not found because vpd nodes have the</a>
+<a name="526"><span class="lineNum"> 526 </span> : : * corresponding slca entry which we would have used to populate the vpd</a>
+<a name="527"><span class="lineNum"> 527 </span> : : * tree during the 'first' pass above so that we just need to perform</a>
+<a name="528"><span class="lineNum"> 528 </span> : : * VINI parse and add the vpd data..</a>
+<a name="529"><span class="lineNum"> 529 </span> : : */</a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 27 : if (!node)</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : </a>
+<a name="533"><span class="lineNum"> 533 </span> : : /* Parse VPD fields, ensure that it has not been added already */</a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineCov"> 27 : if (vpd_valid(fruvpd, fruvpd_sz)</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineCov"> 27 : &amp;&amp; !dt_find_property(node, &quot;ibm,vpd&quot;)) {</span></a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineCov"> 24 : dt_add_property(node, &quot;ibm,vpd&quot;, fruvpd, fruvpd_sz);</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineCov"> 24 : vpd_data_parse(node, fruvpd, fruvpd_sz);</span></a>
+<a name="538"><span class="lineNum"> 538 </span> : : }</a>
+<a name="539"><span class="lineNum"> 539 </span> : : </a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 27 : return node;</span></a>
+<a name="541"><span class="lineNum"> 541 </span> : : }</a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 2 : static void dt_add_model_name(void)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : {</a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 2 : const char *model_name = NULL;</span></a>
+<a name="546"><span class="lineNum"> 546 </span> : : const struct machine_info *mi;</a>
+<a name="547"><span class="lineNum"> 547 </span> : : const struct iplparams_sysparams *p;</a>
+<a name="548"><span class="lineNum"> 548 </span> : : const struct HDIF_common_hdr *iplp;</a>
+<a name="549"><span class="lineNum"> 549 </span> : : const struct dt_property *model;</a>
+<a name="550"><span class="lineNum"> 550 </span> : : </a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineCov"> 2 : model = dt_find_property(dt_root, &quot;model&quot;);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> : : </a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineCov"> 2 : iplp = get_hdif(&amp;spira.ntuples.ipl_parms, &quot;IPLPMS&quot;);</span></a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineCov"> 2 : if (!iplp)</span></a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : goto def_model;</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : </a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineCov"> 2 : p = HDIF_get_idata(iplp, IPLPARAMS_SYSPARAMS, NULL);</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(p))</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : goto def_model;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : </a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineCov"> 2 : if (be16_to_cpu(iplp-&gt;version) &gt;= 0x60)</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : model_name = p-&gt;sys_type_str;</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : </a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineCov"> 2 : def_model:</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineCov"> 2 : if ((!model_name || model_name[0] == '\0') &amp;&amp; model) {</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 2 : mi = machine_info_lookup(model-&gt;prop);</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineCov"> 2 : if (mi)</span></a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineCov"> 2 : model_name = mi-&gt;name;</span></a>
+<a name="569"><span class="lineNum"> 569 </span> : : }</a>
+<a name="570"><span class="lineNum"> 570 </span> : : </a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineCov"> 2 : if(model_name)</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineCov"> 2 : dt_add_property_string(dt_root, &quot;model-name&quot;, model_name);</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : </a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineNoCov"> 0 : static void sysvpd_parse_opp(const void *sysvpd, unsigned int sysvpd_sz)</span></a>
+<a name="576"><span class="lineNum"> 576 </span> : : {</a>
+<a name="577"><span class="lineNum"> 577 </span> : : const char *v;</a>
+<a name="578"><span class="lineNum"> 578 </span> : : uint8_t sz;</a>
+<a name="579"><span class="lineNum"> 579 </span> : : </a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineNoCov"> 0 : v = vpd_find(sysvpd, sysvpd_sz, &quot;OSYS&quot;, &quot;MM&quot;, &amp;sz);</span></a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : if (v)</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(dt_root, &quot;model&quot;, v, sz);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> : : else</a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dt_root, &quot;model&quot;, &quot;Unknown&quot;);</span></a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : v = vpd_find(sysvpd, sysvpd_sz, &quot;OSYS&quot;, &quot;SS&quot;, &amp;sz);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : if (v)</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : dt_add_prop_sanitize_val(dt_root, &quot;system-id&quot;, v, sz);</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : else</a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dt_root, &quot;system-id&quot;, &quot;Unknown&quot;);</span></a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> : : </a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineCov"> 2 : static void sysvpd_parse_legacy(const void *sysvpd, unsigned int sysvpd_sz)</span></a>
+<a name="595"><span class="lineNum"> 595 </span> : : {</a>
+<a name="596"><span class="lineNum"> 596 </span> : : const char *model;</a>
+<a name="597"><span class="lineNum"> 597 </span> : : const char *system_id;</a>
+<a name="598"><span class="lineNum"> 598 </span> : : const char *brand;</a>
+<a name="599"><span class="lineNum"> 599 </span> : : uint8_t sz;</a>
+<a name="600"><span class="lineNum"> 600 </span> : : </a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 2 : model = vpd_find(sysvpd, sysvpd_sz, &quot;VSYS&quot;, &quot;TM&quot;, &amp;sz);</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 2 : if (model)</span></a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineCov"> 2 : dt_add_prop_sanitize_val(dt_root, &quot;model&quot;, model, sz);</span></a>
+<a name="604"><span class="lineNum"> 604 </span> : : else</a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dt_root, &quot;model&quot;, &quot;Unknown&quot;);</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineCov"> 2 : system_id = vpd_find(sysvpd, sysvpd_sz, &quot;VSYS&quot;, &quot;SE&quot;, &amp;sz);</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineCov"> 2 : if (system_id)</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineCov"> 2 : dt_add_prop_sanitize_val(dt_root, &quot;system-id&quot;, system_id, sz);</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : else</a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dt_root, &quot;system-id&quot;, &quot;Unknown&quot;);</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineCov"> 2 : brand = vpd_find(sysvpd, sysvpd_sz, &quot;VSYS&quot;, &quot;BR&quot;, &amp;sz);</span></a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 2 : if (brand)</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 2 : dt_add_prop_sanitize_val(dt_root, &quot;system-brand&quot;, brand, sz);</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : else</a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : dt_add_property_string(dt_root, &quot;brand&quot;, &quot;Unknown&quot;);</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="619"><span class="lineNum"> 619 </span> : : </a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineCov"> 2 : static void sysvpd_parse(void)</span></a>
+<a name="621"><span class="lineNum"> 621 </span> : : {</a>
+<a name="622"><span class="lineNum"> 622 </span> : : const void *sysvpd;</a>
+<a name="623"><span class="lineNum"> 623 </span> : : unsigned int sysvpd_sz;</a>
+<a name="624"><span class="lineNum"> 624 </span> : : unsigned int fru_id_sz;</a>
+<a name="625"><span class="lineNum"> 625 </span> : : struct dt_node *dt_vpd;</a>
+<a name="626"><span class="lineNum"> 626 </span> : : const struct spira_fru_id *fru_id;</a>
+<a name="627"><span class="lineNum"> 627 </span> : : struct HDIF_common_hdr *sysvpd_hdr;</a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 2 : sysvpd_hdr = get_hdif(&amp;spira.ntuples.system_vpd, SYSVPD_HDIF_SIG);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 2 : if (!sysvpd_hdr)</span></a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="632"><span class="lineNum"> 632 </span> : : </a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineCov"> 2 : fru_id = HDIF_get_idata(sysvpd_hdr, SYSVPD_IDATA_FRU_ID, &amp;fru_id_sz);</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 2 : if (!fru_id)</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineCov"> 2 : sysvpd = HDIF_get_idata(sysvpd_hdr, SYSVPD_IDATA_KW_VPD, &amp;sysvpd_sz);</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineCov"> 2 : if (!CHECK_SPPTR(sysvpd))</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="640"><span class="lineNum"> 640 </span> : : </a>
+<a name="641"><span class="lineNum"> 641 </span> : : /* Add system VPD */</a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineCov"> 2 : dt_vpd = dt_find_by_path(dt_root, &quot;/vpd&quot;);</span></a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 2 : if (dt_vpd) {</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineCov"> 2 : dt_add_property(dt_vpd, &quot;ibm,vpd&quot;, sysvpd, sysvpd_sz);</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 2 : slca_vpd_add_loc_code(dt_vpd, be16_to_cpu(fru_id-&gt;slca_index));</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : }</a>
+<a name="647"><span class="lineNum"> 647 </span> : : </a>
+<a name="648"><span class="lineNum"> 648 </span> : : /* Look for the new OpenPower &quot;OSYS&quot; first */</a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineCov"> 2 : if (vpd_find_record(sysvpd, sysvpd_sz, &quot;OSYS&quot;, NULL))</span></a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineNoCov"> 0 : sysvpd_parse_opp(sysvpd, sysvpd_sz);</span></a>
+<a name="651"><span class="lineNum"> 651 </span> : : else</a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 2 : sysvpd_parse_legacy(sysvpd, sysvpd_sz);</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 2 : dt_add_model_name();</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : }</a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 3 : static void iokid_vpd_parse(const struct HDIF_common_hdr *iohub_hdr)</span></a>
+<a name="658"><span class="lineNum"> 658 </span> : : {</a>
+<a name="659"><span class="lineNum"> 659 </span> : : const struct HDIF_child_ptr *iokids;</a>
+<a name="660"><span class="lineNum"> 660 </span> : : const struct HDIF_common_hdr *iokid;</a>
+<a name="661"><span class="lineNum"> 661 </span> : : unsigned int i;</a>
+<a name="662"><span class="lineNum"> 662 </span> : : </a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 3 : iokids = HDIF_child_arr(iohub_hdr, CECHUB_CHILD_IO_KIDS);</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineCov"> 3 : if (!CHECK_SPPTR(iokids)) {</span></a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineNoCov"> 0 : prerror(&quot;VPD: No IOKID child array\n&quot;);</span></a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="667"><span class="lineNum"> 667 </span> : : }</a>
+<a name="668"><span class="lineNum"> 668 </span> : : </a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineCov"> 6 : for (i = 0; i &lt; be32_to_cpu(iokids-&gt;count); i++) {</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineCov"> 3 : iokid = HDIF_child(iohub_hdr, iokids, i,</span></a>
+<a name="671"><span class="lineNum"> 671 </span> : : IOKID_FRU_HDIF_SIG);</a>
+<a name="672"><span class="lineNum"> 672 </span> : : /* IO KID VPD structure layout is similar to FRUVPD */</a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineCov"> 3 : if (iokid)</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineCov"> 3 : dt_add_vpd_node(iokid,</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : FRUVPD_IDATA_FRU_ID, FRUVPD_IDATA_KW_VPD);</a>
+<a name="676"><span class="lineNum"> 676 </span> : : }</a>
+<a name="677"><span class="lineNum"> 677 </span> : : }</a>
+<a name="678"><span class="lineNum"> 678 </span> : : </a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineCov"> 2 : static void iohub_vpd_parse(void)</span></a>
+<a name="680"><span class="lineNum"> 680 </span> : : {</a>
+<a name="681"><span class="lineNum"> 681 </span> : : const struct HDIF_common_hdr *iohub_hdr;</a>
+<a name="682"><span class="lineNum"> 682 </span> : : const struct cechub_hub_fru_id *fru_id_data;</a>
+<a name="683"><span class="lineNum"> 683 </span> : : unsigned int i, vpd_sz, fru_id_sz;</a>
+<a name="684"><span class="lineNum"> 684 </span> : : </a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineCov"> 2 : if (!get_hdif(&amp;spira.ntuples.cec_iohub_fru, CECHUB_FRU_HDIF_SIG)) {</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : prerror(&quot;VPD: Could not find IO HUB FRU data\n&quot;);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> : : }</a>
+<a name="689"><span class="lineNum"> 689 </span> : : </a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineCov"> 5 : for_each_ntuple_idx(&amp;spira.ntuples.cec_iohub_fru, iohub_hdr,</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : i, CECHUB_FRU_HDIF_SIG) {</a>
+<a name="692"><span class="lineNum"> 692 </span> : : </a>
+<a name="693"><span class="lineNum"> 693 </span> :<span class="lineCov"> 3 : fru_id_data = HDIF_get_idata(iohub_hdr,</span></a>
+<a name="694"><span class="lineNum"> 694 </span> : : CECHUB_FRU_ID_DATA_AREA,</a>
+<a name="695"><span class="lineNum"> 695 </span> : : &amp;fru_id_sz);</a>
+<a name="696"><span class="lineNum"> 696 </span> : : </a>
+<a name="697"><span class="lineNum"> 697 </span> : : /* P8, IO HUB is on processor card and we have a</a>
+<a name="698"><span class="lineNum"> 698 </span> : : * daughter card array</a>
+<a name="699"><span class="lineNum"> 699 </span> : : */</a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 6 : if (fru_id_data &amp;&amp;</span></a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineCov"> 3 : be32_to_cpu(fru_id_data-&gt;card_type) == CECHUB_FRU_TYPE_CPU_CARD) {</span></a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineCov"> 3 : iokid_vpd_parse(iohub_hdr);</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 3 : continue;</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : }</a>
+<a name="705"><span class="lineNum"> 705 </span> : : </a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : if (HDIF_get_idata(iohub_hdr,</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : CECHUB_ASCII_KEYWORD_VPD, &amp;vpd_sz))</a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineNoCov"> 0 : dt_add_vpd_node(iohub_hdr, CECHUB_FRU_ID_DATA,</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : CECHUB_ASCII_KEYWORD_VPD);</a>
+<a name="710"><span class="lineNum"> 710 </span> : : }</a>
+<a name="711"><span class="lineNum"> 711 </span> : : }</a>
+<a name="712"><span class="lineNum"> 712 </span> : : </a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 14 : static void _vpd_parse(struct spira_ntuple tuple)</span></a>
+<a name="714"><span class="lineNum"> 714 </span> : : {</a>
+<a name="715"><span class="lineNum"> 715 </span> : : const struct HDIF_common_hdr *fruvpd_hdr;</a>
+<a name="716"><span class="lineNum"> 716 </span> : : unsigned int i;</a>
+<a name="717"><span class="lineNum"> 717 </span> : : </a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 14 : if (!get_hdif(&amp;tuple, FRUVPD_HDIF_SIG))</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 4 : return;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 20 : for_each_ntuple_idx(&amp;tuple, fruvpd_hdr, i, FRUVPD_HDIF_SIG)</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 10 : dt_add_vpd_node(fruvpd_hdr,</span></a>
+<a name="723"><span class="lineNum"> 723 </span> : : FRUVPD_IDATA_FRU_ID, FRUVPD_IDATA_KW_VPD);</a>
+<a name="724"><span class="lineNum"> 724 </span> : : }</a>
+<a name="725"><span class="lineNum"> 725 </span> : : </a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineCov"> 2 : void vpd_parse(void)</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : {</a>
+<a name="728"><span class="lineNum"> 728 </span> : : const struct HDIF_common_hdr *fruvpd_hdr;</a>
+<a name="729"><span class="lineNum"> 729 </span> : : </a>
+<a name="730"><span class="lineNum"> 730 </span> : : /* System VPD uses the VSYS record, so its special */</a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineCov"> 2 : sysvpd_parse();</span></a>
+<a name="732"><span class="lineNum"> 732 </span> : : </a>
+<a name="733"><span class="lineNum"> 733 </span> : : /* Enclosure */</a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineCov"> 2 : _vpd_parse(spira.ntuples.nt_enclosure_vpd);</span></a>
+<a name="735"><span class="lineNum"> 735 </span> : : </a>
+<a name="736"><span class="lineNum"> 736 </span> : : /* Backplane */</a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineCov"> 2 : _vpd_parse(spira.ntuples.backplane_vpd);</span></a>
+<a name="738"><span class="lineNum"> 738 </span> : : </a>
+<a name="739"><span class="lineNum"> 739 </span> : : /* clock card -- does this use the FRUVPD sig? */</a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 2 : _vpd_parse(spira.ntuples.clock_vpd);</span></a>
+<a name="741"><span class="lineNum"> 741 </span> : : </a>
+<a name="742"><span class="lineNum"> 742 </span> : : /* Anchor card */</a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineCov"> 2 : _vpd_parse(spira.ntuples.anchor_vpd);</span></a>
+<a name="744"><span class="lineNum"> 744 </span> : : </a>
+<a name="745"><span class="lineNum"> 745 </span> : : /* Op panel -- does this use the FRUVPD sig? */</a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineCov"> 2 : _vpd_parse(spira.ntuples.op_panel_vpd);</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> : : /* External cache FRU vpd -- does this use the FRUVPD sig? */</a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineCov"> 2 : _vpd_parse(spira.ntuples.ext_cache_fru_vpd);</span></a>
+<a name="750"><span class="lineNum"> 750 </span> : : </a>
+<a name="751"><span class="lineNum"> 751 </span> : : /* Misc CEC FRU */</a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineCov"> 2 : _vpd_parse(spira.ntuples.misc_cec_fru_vpd);</span></a>
+<a name="753"><span class="lineNum"> 753 </span> : : </a>
+<a name="754"><span class="lineNum"> 754 </span> : : /* CEC IO HUB FRU */</a>
+<a name="755"><span class="lineNum"> 755 </span> :<span class="lineCov"> 2 : iohub_vpd_parse();</span></a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> : : /*</a>
+<a name="758"><span class="lineNum"> 758 </span> : : * SP subsystem -- while the rest of the SPINFO structure is</a>
+<a name="759"><span class="lineNum"> 759 </span> : : * different, the FRU ID data and pointer pair to keyword VPD</a>
+<a name="760"><span class="lineNum"> 760 </span> : : * are the same offset as a FRUVPD entry. So reuse it</a>
+<a name="761"><span class="lineNum"> 761 </span> : : */</a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineCov"> 2 : fruvpd_hdr = get_hdif(&amp;spira.ntuples.sp_subsys, SPSS_HDIF_SIG);</span></a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 2 : if (fruvpd_hdr)</span></a>
+<a name="764"><span class="lineNum"> 764 </span> :<span class="lineCov"> 2 : dt_add_vpd_node(fruvpd_hdr,</span></a>
+<a name="765"><span class="lineNum"> 765 </span> : : FRUVPD_IDATA_FRU_ID, FRUVPD_IDATA_KW_VPD);</a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineCov"> 2 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/index-sort-b.html b/coverage-report/hw/index-sort-b.html
new file mode 100644
index 0000000..eafb6a9
--- /dev/null
+++ b/coverage-report/hw/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hw</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">113</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntryHi">95.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lpc-port80h.c.gcov.html">lpc-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="98.7%"><img src="../snow.png" width=1 height=10 alt="98.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.7&nbsp;%</td>
+ <td class="coverNumHi">77 / 78</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map.c.gcov.html">phys-map.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="87.8%"><img src="../snow.png" width=12 height=10 alt="87.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">87.8&nbsp;%</td>
+ <td class="coverNumMed">36 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/index-sort-f.html b/coverage-report/hw/index-sort-f.html
new file mode 100644
index 0000000..458abc4
--- /dev/null
+++ b/coverage-report/hw/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hw</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">113</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntryHi">95.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lpc-port80h.c.gcov.html">lpc-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="98.7%"><img src="../snow.png" width=1 height=10 alt="98.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.7&nbsp;%</td>
+ <td class="coverNumHi">77 / 78</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map.c.gcov.html">phys-map.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="87.8%"><img src="../snow.png" width=12 height=10 alt="87.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">87.8&nbsp;%</td>
+ <td class="coverNumMed">36 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/index-sort-l.html b/coverage-report/hw/index-sort-l.html
new file mode 100644
index 0000000..5c617e9
--- /dev/null
+++ b/coverage-report/hw/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hw</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">113</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntryHi">95.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map.c.gcov.html">phys-map.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="87.8%"><img src="../snow.png" width=12 height=10 alt="87.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">87.8&nbsp;%</td>
+ <td class="coverNumMed">36 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lpc-port80h.c.gcov.html">lpc-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="98.7%"><img src="../snow.png" width=1 height=10 alt="98.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.7&nbsp;%</td>
+ <td class="coverNumHi">77 / 78</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/index.html b/coverage-report/hw/index.html
new file mode 100644
index 0000000..23f8643
--- /dev/null
+++ b/coverage-report/hw/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - hw</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">113</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntryHi">95.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lpc-port80h.c.gcov.html">lpc-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=99 height=10 alt="98.7%"><img src="../snow.png" width=1 height=10 alt="98.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.7&nbsp;%</td>
+ <td class="coverNumHi">77 / 78</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map.c.gcov.html">phys-map.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=88 height=10 alt="87.8%"><img src="../snow.png" width=12 height=10 alt="87.8%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">87.8&nbsp;%</td>
+ <td class="coverNumMed">36 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/index-sort-b.html b/coverage-report/hw/ipmi/index-sort-b.html
new file mode 100644
index 0000000..a282437
--- /dev/null
+++ b/coverage-report/hw/ipmi/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/ipmi</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">99</td>
+ <td class="headerCovTableEntryLo">64.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-fru.c.gcov.html">ipmi-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=65 height=10 alt="64.6%"><img src="../../snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/index-sort-f.html b/coverage-report/hw/ipmi/index-sort-f.html
new file mode 100644
index 0000000..987633e
--- /dev/null
+++ b/coverage-report/hw/ipmi/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/ipmi</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">99</td>
+ <td class="headerCovTableEntryLo">64.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-fru.c.gcov.html">ipmi-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=65 height=10 alt="64.6%"><img src="../../snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/index-sort-l.html b/coverage-report/hw/ipmi/index-sort-l.html
new file mode 100644
index 0000000..20e1ec3
--- /dev/null
+++ b/coverage-report/hw/ipmi/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/ipmi</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">99</td>
+ <td class="headerCovTableEntryLo">64.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-fru.c.gcov.html">ipmi-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=65 height=10 alt="64.6%"><img src="../../snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/index.html b/coverage-report/hw/ipmi/index.html
new file mode 100644
index 0000000..b09d4da
--- /dev/null
+++ b/coverage-report/hw/ipmi/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/ipmi</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">99</td>
+ <td class="headerCovTableEntryLo">64.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-fru.c.gcov.html">ipmi-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=65 height=10 alt="64.6%"><img src="../../snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/ipmi-fru.c.func-sort-c.html b/coverage-report/hw/ipmi/ipmi-fru.c.func-sort-c.html
new file mode 100644
index 0000000..4d72d1e
--- /dev/null
+++ b/coverage-report/hw/ipmi/ipmi-fru.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/ipmi-fru.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/ipmi</a> - ipmi-fru.c<span style="font-size: 80%;"> (<a href="ipmi-fru.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">99</td>
+ <td class="headerCovTableEntryLo">64.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ipmi-fru.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#193">fru_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#164">fru_write_complete</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#223">ipmi_fru_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#116">fru_add</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#64">fru_checksum</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#80">fru_fill_product_info</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#48">fru_insert_string</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/ipmi-fru.c.func.html b/coverage-report/hw/ipmi/ipmi-fru.c.func.html
new file mode 100644
index 0000000..2e2268f
--- /dev/null
+++ b/coverage-report/hw/ipmi/ipmi-fru.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/ipmi-fru.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/ipmi</a> - ipmi-fru.c<span style="font-size: 80%;"> (<a href="ipmi-fru.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">99</td>
+ <td class="headerCovTableEntryLo">64.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ipmi-fru.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#116">fru_add</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#64">fru_checksum</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#80">fru_fill_product_info</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#48">fru_insert_string</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#193">fru_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#164">fru_write_complete</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-fru.c.gcov.html#223">ipmi_fru_init</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/ipmi-fru.c.gcov.html b/coverage-report/hw/ipmi/ipmi-fru.c.gcov.html
new file mode 100644
index 0000000..6da67b5
--- /dev/null
+++ b/coverage-report/hw/ipmi/ipmi-fru.c.gcov.html
@@ -0,0 +1,316 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/ipmi-fru.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/ipmi</a> - ipmi-fru.c<span style="font-size: 80%;"> (source / <a href="ipmi-fru.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">64</td>
+ <td class="headerCovTableEntry">99</td>
+ <td class="headerCovTableEntryLo">64.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryLo">57.1 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Fill out firmware related FRUs (Field Replaceable Units)</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;ipmi.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;lock.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;opal.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;device.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : struct product_info {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : char *manufacturer;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : char *product;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : char *part_no;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : char *version;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : char *serial_no;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : char *asset_tag;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : };</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct common_header {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : u8 version;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : u8 internal_offset;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : u8 chassis_offset;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : u8 board_offset;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : u8 product_offset;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : u8 multirecord_offset;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : u8 pad;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : u8 checksum;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : } __packed;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : /* The maximum amount of FRU data we can store. */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define FRU_DATA_SIZE 256</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /* We allocate two bytes at these locations in the data array to track</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * state. */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define WRITE_INDEX 256</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define REMAINING 257</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : /* The ASCII string encoding used only has 5 bits to encode length</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * hence the maximum is 31 characters. */</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define MAX_STR_LEN 31</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : static u8 fru_dev_id = 0;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 16 : static int fru_insert_string(u8 *buf, char *str)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 16 : int len = strlen(str);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : /* The ASCII type/length format only supports a string length</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * between 2 and 31 characters. Zero characters is ok though</a>
+<a name="56"><span class="lineNum"> 56 </span> : : * as it indicates no data present. */</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 16 : if (len == 1 || len &gt; MAX_STR_LEN)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 2 : return OPAL_PARAMETER;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 14 : buf[0] = 0xc0 | len;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 14 : memcpy(&amp;buf[1], str, len);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 14 : return len + 1;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 5 : static u8 fru_checksum(u8 *buf, int len)</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : int i;</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 5 : u8 checksum = 0;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 153 : for(i = 0; i &lt; len; i++) {</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 148 : checksum += buf[i];</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 5 : checksum = ~checksum + 1;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 5 : return checksum;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : #define FRU_INSERT_STRING(x, y) \</a>
+<a name="79"><span class="lineNum"> 79 </span> : : ({ rc = fru_insert_string(x, y); \</a>
+<a name="80"><span class="lineNum"> 80 </span> : : { if (rc &lt; 1) return OPAL_PARAMETER; } rc; })</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 6 : static int fru_fill_product_info(u8 *buf, struct product_info *info, size_t size)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 6 : size_t total_size = 11;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 6 : int index = 0;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : int rc;</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 6 : total_size += strlen(info-&gt;manufacturer);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 6 : total_size += strlen(info-&gt;product);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 6 : total_size += strlen(info-&gt;part_no);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 6 : total_size += strlen(info-&gt;version);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 6 : total_size += strlen(info-&gt;serial_no);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 6 : total_size += strlen(info-&gt;asset_tag);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 6 : total_size += (8 - (total_size % 8)) % 8;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 6 : if (total_size &gt; size)</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 2 : return OPAL_PARAMETER;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 4 : buf[index++] = 0x1; /* Version */</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 4 : buf[index++] = total_size / 8; /* Size */</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 4 : buf[index++] = 0; /* Language code (English) */</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 4 : index += FRU_INSERT_STRING(&amp;buf[index], info-&gt;manufacturer);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 3 : index += FRU_INSERT_STRING(&amp;buf[index], info-&gt;product);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 3 : index += FRU_INSERT_STRING(&amp;buf[index], info-&gt;part_no);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 2 : index += FRU_INSERT_STRING(&amp;buf[index], info-&gt;version);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 2 : index += FRU_INSERT_STRING(&amp;buf[index], info-&gt;serial_no);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 2 : index += FRU_INSERT_STRING(&amp;buf[index], info-&gt;asset_tag);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 2 : buf[index++] = 0xc1; /* End of data marker */</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 2 : memset(&amp;buf[index], 0, total_size - index - 1);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 2 : index += total_size - index - 1;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 2 : buf[index] = fru_checksum(buf, index);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 2 : assert(index == total_size - 1);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 2 : return total_size;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : }</a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 3 : static int fru_add(u8 *buf, int size)</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : {</a>
+<a name="120"><span class="lineNum"> 120 </span> : : int len;</a>
+<a name="121"><span class="lineNum"> 121 </span> : : struct common_header common_hdr;</a>
+<a name="122"><span class="lineNum"> 122 </span> : : char *short_version;</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 3 : struct product_info info = {</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : .manufacturer = (char *) &quot;IBM&quot;,</a>
+<a name="125"><span class="lineNum"> 125 </span> : : .product = (char *) &quot;skiboot&quot;,</a>
+<a name="126"><span class="lineNum"> 126 </span> : : .part_no = (char *) &quot;&quot;,</a>
+<a name="127"><span class="lineNum"> 127 </span> : : .serial_no = (char *) &quot;&quot;,</a>
+<a name="128"><span class="lineNum"> 128 </span> : : .asset_tag = (char *) &quot;&quot;,</a>
+<a name="129"><span class="lineNum"> 129 </span> : : };</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 3 : if (size &lt; sizeof(common_hdr))</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : /* We currently only support adding the version number at the</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * product information offset. We choose an offset of 64 bytes</a>
+<a name="136"><span class="lineNum"> 136 </span> : : * because that's what the standard recommends. */</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 2 : common_hdr.version = 1;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 2 : common_hdr.internal_offset = 0;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 2 : common_hdr.chassis_offset = 0;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 2 : common_hdr.board_offset = 0;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 2 : common_hdr.product_offset = 64/8;</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 2 : common_hdr.multirecord_offset = 0;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 2 : common_hdr.pad = 0;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 2 : common_hdr.checksum = fru_checksum((u8 *) &amp;common_hdr, sizeof(common_hdr) - 1);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 2 : memcpy(buf, &amp;common_hdr, sizeof(common_hdr));</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 2 : short_version = strdup(version);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 2 : info.version = short_version;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : if (!strncmp(version, &quot;skiboot-&quot;, 8))</a>
+<a name="150"><span class="lineNum"> 150 </span> : : info.version = &amp;short_version[8];</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 2 : if (strlen(info.version) &gt;= MAX_STR_LEN) {</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 2 : if (info.version[MAX_STR_LEN] != '\0')</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 2 : info.version[MAX_STR_LEN - 1] = '+';</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 2 : info.version[MAX_STR_LEN] = '\0';</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 2 : len = fru_fill_product_info(&amp;buf[64], &amp;info, size - 64);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 2 : free(short_version);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 2 : if (len &lt; 0)</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 1 : return len + 64;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : }</a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : static void fru_write_complete(struct ipmi_msg *msg)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : {</a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : u8 write_count = msg-&gt;data[0];</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : u16 offset;</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[WRITE_INDEX] += write_count;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[REMAINING] -= write_count;</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : if (msg-&gt;data[REMAINING] == 0)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : offset = msg-&gt;data[WRITE_INDEX];</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : ipmi_init_msg(msg, IPMI_DEFAULT_INTERFACE, IPMI_WRITE_FRU,</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : fru_write_complete, NULL,</a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : MIN(msg-&gt;data[REMAINING] + 3, IPMI_MAX_REQ_SIZE), 2);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : memmove(&amp;msg-&gt;data[3], &amp;msg-&gt;data[offset + 3], msg-&gt;req_size - 3);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[0] = fru_dev_id; /* FRU Device ID */</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[1] = offset &amp; 0xff; /* Offset LSB */</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[2] = (offset &gt;&gt; 8) &amp; 0xff; /* Offset MSB */</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineNoCov"> 0 : ipmi_queue_msg(msg);</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : ipmi_free_msg(msg);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : static int fru_write(void)</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : {</a>
+<a name="197"><span class="lineNum"> 197 </span> : : struct ipmi_msg *msg;</a>
+<a name="198"><span class="lineNum"> 198 </span> : : int len;</a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> : : /* We allocate FRU_DATA_SIZE + 5 bytes for the message:</a>
+<a name="201"><span class="lineNum"> 201 </span> : : * - 3 bytes for the the write FRU command header</a>
+<a name="202"><span class="lineNum"> 202 </span> : : * - FRU_DATA_SIZE bytes for FRU data</a>
+<a name="203"><span class="lineNum"> 203 </span> : : * - 2 bytes for offset &amp; bytes remaining count</a>
+<a name="204"><span class="lineNum"> 204 </span> : : */</a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE, IPMI_WRITE_FRU,</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : fru_write_complete, NULL, NULL, FRU_DATA_SIZE + 5, 2);</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : if (!msg)</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[0] = fru_dev_id; /* FRU Device ID */</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[1] = 0x0; /* Offset LSB (we always write a new common header) */</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[2] = 0x0; /* Offset MSB */</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : len = fru_add(&amp;msg-&gt;data[3], FRU_DATA_SIZE);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : if (len &lt; 0)</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : return len;</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* Three bytes for the actual FRU Data Command */</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[WRITE_INDEX] = 0;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : msg-&gt;data[REMAINING] = len;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : msg-&gt;req_size = MIN(len + 3, IPMI_MAX_REQ_SIZE);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : return ipmi_queue_msg(msg);</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : }</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : void ipmi_fru_init(u8 dev_id)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : {</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : fru_dev_id = dev_id;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : fru_write();</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/test/index-sort-b.html b/coverage-report/hw/ipmi/test/index-sort-b.html
new file mode 100644
index 0000000..d9a237a
--- /dev/null
+++ b/coverage-report/hw/ipmi/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - hw/ipmi/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-fru.c.gcov.html">run-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=71 height=10 alt="71.4%"><img src="../../../snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/test/index-sort-f.html b/coverage-report/hw/ipmi/test/index-sort-f.html
new file mode 100644
index 0000000..a0b8ed7
--- /dev/null
+++ b/coverage-report/hw/ipmi/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - hw/ipmi/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-fru.c.gcov.html">run-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=71 height=10 alt="71.4%"><img src="../../../snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/test/index-sort-l.html b/coverage-report/hw/ipmi/test/index-sort-l.html
new file mode 100644
index 0000000..acfd52e
--- /dev/null
+++ b/coverage-report/hw/ipmi/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - hw/ipmi/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-fru.c.gcov.html">run-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=71 height=10 alt="71.4%"><img src="../../../snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/test/index.html b/coverage-report/hw/ipmi/test/index.html
new file mode 100644
index 0000000..b53ef5a
--- /dev/null
+++ b/coverage-report/hw/ipmi/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - hw/ipmi/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-fru.c.gcov.html">run-fru.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=71 height=10 alt="71.4%"><img src="../../../snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/test/run-fru.c.func-sort-c.html b/coverage-report/hw/ipmi/test/run-fru.c.func-sort-c.html
new file mode 100644
index 0000000..c656170
--- /dev/null
+++ b/coverage-report/hw/ipmi/test/run-fru.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/test/run-fru.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">hw/ipmi/test</a> - run-fru.c<span style="font-size: 80%;"> (<a href="run-fru.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-fru.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#41">_prlog</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#16">ipmi_free_msg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#20">ipmi_init_msg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#28">ipmi_mkmsg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#36">ipmi_queue_msg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#46">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/test/run-fru.c.func.html b/coverage-report/hw/ipmi/test/run-fru.c.func.html
new file mode 100644
index 0000000..6b163f6
--- /dev/null
+++ b/coverage-report/hw/ipmi/test/run-fru.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/test/run-fru.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">hw/ipmi/test</a> - run-fru.c<span style="font-size: 80%;"> (<a href="run-fru.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-fru.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#41">_prlog</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#16">ipmi_free_msg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#20">ipmi_init_msg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#28">ipmi_mkmsg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#36">ipmi_queue_msg</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-fru.c.gcov.html#46">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/ipmi/test/run-fru.c.gcov.html b/coverage-report/hw/ipmi/test/run-fru.c.gcov.html
new file mode 100644
index 0000000..bc92321
--- /dev/null
+++ b/coverage-report/hw/ipmi/test/run-fru.c.gcov.html
@@ -0,0 +1,201 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/ipmi/test/run-fru.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">hw/ipmi/test</a> - run-fru.c<span style="font-size: 80%;"> (source / <a href="run-fru.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntry">35</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define __TEST__</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;../ipmi-fru.c&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;string.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : int error = 0;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : const char version[] = &quot;a-too-long-version-test-string-is-here&quot;;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineNoCov"> 0 : void ipmi_free_msg(struct ipmi_msg __unused *msg)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : void ipmi_init_msg(struct ipmi_msg __unused *msg, int __unused interface,</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : uint32_t __unused code,</a>
+<a name="24"><span class="lineNum"> 24 </span> : : void __unused (*complete)(struct ipmi_msg *),</a>
+<a name="25"><span class="lineNum"> 25 </span> : : void __unused *user_data, size_t __unused req_size,</a>
+<a name="26"><span class="lineNum"> 26 </span> : : size_t __unused resp_size)</a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : struct ipmi_msg *ipmi_mkmsg(int __unused interface, uint32_t __unused code,</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : void __unused (*complete)(struct ipmi_msg *),</a>
+<a name="32"><span class="lineNum"> 32 </span> : : void __unused *user_data, void __unused *req_data, size_t __unused req_size,</a>
+<a name="33"><span class="lineNum"> 33 </span> : : size_t __unused resp_size)</a>
+<a name="34"><span class="lineNum"> 34 </span> : : {</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : int ipmi_queue_msg(struct ipmi_msg __unused *msg)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : void _prlog(int __unused log_level, const __unused char* fmt, ...)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : {</a>
+<a name="50"><span class="lineNum"> 50 </span> : : u8 *buf;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : int len;</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : struct product_info info = {</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : .manufacturer = (char *) &quot;IBM&quot;,</a>
+<a name="54"><span class="lineNum"> 54 </span> : : .product = (char *) &quot;skiboot&quot;,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : .part_no = (char *) &quot;hello&quot;,</a>
+<a name="56"><span class="lineNum"> 56 </span> : : .version = (char *) &quot;12345&quot;,</a>
+<a name="57"><span class="lineNum"> 57 </span> : : .serial_no = (char *) &quot;12345&quot;,</a>
+<a name="58"><span class="lineNum"> 58 </span> : : .asset_tag = (char *) &quot;abcd&quot;,</a>
+<a name="59"><span class="lineNum"> 59 </span> : : };</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : struct product_info invalid_info = {</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : .manufacturer = (char *) &quot;I&quot;,</a>
+<a name="62"><span class="lineNum"> 62 </span> : : .product = (char *) &quot;skiboot&quot;,</a>
+<a name="63"><span class="lineNum"> 63 </span> : : .part_no = (char *) &quot;hello&quot;,</a>
+<a name="64"><span class="lineNum"> 64 </span> : : .version = (char *) &quot;12345&quot;,</a>
+<a name="65"><span class="lineNum"> 65 </span> : : .serial_no = (char *) &quot;12345&quot;,</a>
+<a name="66"><span class="lineNum"> 66 </span> : : .asset_tag = (char *) &quot;abcd&quot;,</a>
+<a name="67"><span class="lineNum"> 67 </span> : : };</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 1 : struct product_info invalid_info2 = {</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : .manufacturer = (char *) &quot;IBM&quot;,</a>
+<a name="70"><span class="lineNum"> 70 </span> : : .product = (char *) &quot;skiboot&quot;,</a>
+<a name="71"><span class="lineNum"> 71 </span> : : .part_no = (char *) &quot;this is a really long string that's more&quot;</a>
+<a name="72"><span class="lineNum"> 72 </span> : : &quot;than 32 characters, because it turns out that's invalid.&quot;,</a>
+<a name="73"><span class="lineNum"> 73 </span> : : .version = (char *) &quot;12345&quot;,</a>
+<a name="74"><span class="lineNum"> 74 </span> : : .serial_no = (char *) &quot;12345&quot;,</a>
+<a name="75"><span class="lineNum"> 75 </span> : : .asset_tag = (char *) &quot;abcd&quot;,</a>
+<a name="76"><span class="lineNum"> 76 </span> : : };</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : buf = malloc(256);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : len = fru_fill_product_info(buf, &amp;info, 40);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : assert(len == 40);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : assert(memcmp(buf, &quot;\001\005\000\303IBM\307skiboot\305hello&quot;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : &quot;\30512345\30512345\304abcd\301-&quot;,len) == 0);</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /* Make sure the checksum is right */</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : assert(!fru_checksum(buf, len));</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* This should fail (not enough space) */</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : assert(fru_fill_product_info(buf, &amp;info, 39) &lt; 0);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : memset(buf, 0, 256);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : len = fru_fill_product_info(buf, &amp;invalid_info, 40);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : assert(len == OPAL_PARAMETER);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : memset(buf, 0, 256);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : len = fru_fill_product_info(buf, &amp;invalid_info2, 256);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : assert(len == OPAL_PARAMETER);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : memset(buf, 0, 256);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : assert(fru_add(buf, 256) &gt; 0);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : assert(0 == memcmp(&amp;buf[64], &quot;\001\a\000\303IBM\307skiboot\300&quot;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : &quot;\337a-too-long-version-test-string+\300\300\301&quot;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : &quot;\0\0\0&quot;,54));</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : memset(buf, 0, 256);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : assert(fru_add(buf, 1) == OPAL_PARAMETER);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : memset(buf, 0, 256);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : assert(fru_add(buf, 65) == OPAL_PARAMETER);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/lpc-port80h.c.func-sort-c.html b/coverage-report/hw/lpc-port80h.c.func-sort-c.html
new file mode 100644
index 0000000..d8b7081
--- /dev/null
+++ b/coverage-report/hw/lpc-port80h.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/lpc-port80h.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hw</a> - lpc-port80h.c<span style="font-size: 80%;"> (<a href="lpc-port80h.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntry">78</td>
+ <td class="headerCovTableEntryHi">98.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="lpc-port80h.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lpc-port80h.c.gcov.html#156">op_display_lpc</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lpc-port80h.c.gcov.html#30">op_display_to_port80</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lpc-port80h.c.gcov.html#103">op_display_to_port8x</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/lpc-port80h.c.func.html b/coverage-report/hw/lpc-port80h.c.func.html
new file mode 100644
index 0000000..9371b3a
--- /dev/null
+++ b/coverage-report/hw/lpc-port80h.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/lpc-port80h.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hw</a> - lpc-port80h.c<span style="font-size: 80%;"> (<a href="lpc-port80h.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntry">78</td>
+ <td class="headerCovTableEntryHi">98.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="lpc-port80h.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lpc-port80h.c.gcov.html#156">op_display_lpc</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lpc-port80h.c.gcov.html#30">op_display_to_port80</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lpc-port80h.c.gcov.html#103">op_display_to_port8x</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/lpc-port80h.c.gcov.html b/coverage-report/hw/lpc-port80h.c.gcov.html
new file mode 100644
index 0000000..ecb3f9e
--- /dev/null
+++ b/coverage-report/hw/lpc-port80h.c.gcov.html
@@ -0,0 +1,258 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/lpc-port80h.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hw</a> - lpc-port80h.c<span style="font-size: 80%;"> (source / <a href="lpc-port80h.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntry">78</td>
+ <td class="headerCovTableEntryHi">98.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * op_display() but over the 1 byte LPC port 80h just like an original IBM PC</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2018-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #define pr_fmt(fmt) &quot;Port80h: &quot; fmt</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;lpc.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;op-panel.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;chip.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : /*</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * Convert our detailed op_display() call into 1 byte for LPC port 80h</a>
+<a name="16"><span class="lineNum"> 16 </span> : : *</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * Our layout looks like this:</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * MSB (bit 7): 1 = Comes from OPAL</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * bit 6 : 0 = OP_MOD_INIT (the main one), 1 = (see bit 5)</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * bit 5432 : (if bit 6=0, low nibble of op-panel code)</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * bit 5432 : (if bit 6=1, other OP_MOD_ values in bits 54:</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * 00b=OP_MOD_CPU, 01b=OP_MOD_LOCK,</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * 10b=OP_MOD_MEM, 11b=OP_MOD_CHIPTOD</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * bits 0,1 from code in bits 32)</a>
+<a name="25"><span class="lineNum"> 25 </span> : : *</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * bit 1,0: 00b=OP_LOG, 10b=OP_WARN, 01b=OP_ERROR, 11b=OP_FATAL</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * i.e. bit 0 indicates ERROR or FATAL.</a>
+<a name="28"><span class="lineNum"> 28 </span> : : *</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * If port 80h number has the MSB and LSB set, then you died in OPAL.</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * Any *odd* number with the MSB set (i.e. &gt; 0x80) indicates error.</a>
+<a name="31"><span class="lineNum"> 31 </span> : : */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 16 : static inline uint8_t op_display_to_port80(uint8_t last_value, enum op_severity s, enum op_module m, uint16_t c)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 16 : uint8_t r = 0x80; /* Start with top bit set indicating in OPAL */</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 16 : switch(m) {</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 7 : case OP_MOD_INIT:</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : /* bit 6 is zero */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : /* bits 5432 have low nibble of c */</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 7 : r |= (c &amp; 0x0f) &lt;&lt; 2;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 7 : break;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : case OP_MOD_CPU:</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : r |= 0x40 | (c &amp; 0x03) &lt;&lt; 2;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 2 : case OP_MOD_LOCK:</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 2 : r |= 0x50 | (c &amp; 0x03) &lt;&lt; 2;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 2 : case OP_MOD_MEM:</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 2 : r |= 0x60 | (c &amp; 0x03) &lt;&lt; 2;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : case OP_MOD_CHIPTOD:</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : r |= 0x70 | (c &amp; 0x03) &lt;&lt; 2;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : case OP_MOD_CORE:</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : /*</a>
+<a name="56"><span class="lineNum"> 56 </span> : : * Only current OP_MOD_CORE is where we're OP_FATAL,</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * So let's go for the last value set and tweak the</a>
+<a name="58"><span class="lineNum"> 58 </span> : : * bits for OP_FATAL.</a>
+<a name="59"><span class="lineNum"> 59 </span> : : */</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : r = last_value &amp; 0xFC;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 2 : case OP_MOD_FSP:</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : case OP_MOD_FSPCON:</a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* Should never be hit, port80h only used on non-FSP! */</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : }</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 16 : switch(s) {</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 7 : case OP_LOG:</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 7 : break;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 3 : case OP_WARN:</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 3 : r |= 0x02;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 3 : break;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : case OP_ERROR:</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : r |= 0x01;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 5 : case OP_FATAL:</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 5 : r |= 0x03;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 16 : return r;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : /*</a>
+<a name="85"><span class="lineNum"> 85 </span> : : * Convert our detailed op_display() call into 2 bytes for LPC port 81h and 82h</a>
+<a name="86"><span class="lineNum"> 86 </span> : : *</a>
+<a name="87"><span class="lineNum"> 87 </span> : : * This looks pretty similar to our port80 code.</a>
+<a name="88"><span class="lineNum"> 88 </span> : : * Notably we now have more bits to throw progress into.</a>
+<a name="89"><span class="lineNum"> 89 </span> : : *</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * Our layout looks like this:</a>
+<a name="91"><span class="lineNum"> 91 </span> : : * MSB (bit 15): 1 = Comes from OPAL</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * bit 14 : 0 = OP_MOD_INIT (the main one), 1 = (see bit 13)</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * bits 13-2 : (if bit 6=0, low 12 bits of op-panel code)</a>
+<a name="94"><span class="lineNum"> 94 </span> : : * bit 13,12 : (if bit 6=1, other OP_MOD_ values in bits 13 and 12:</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * 00b=OP_MOD_CPU, 01b=OP_MOD_LOCK,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : * 10b=OP_MOD_MEM, 11b=OP_MOD_CHIPTOD)</a>
+<a name="97"><span class="lineNum"> 97 </span> : : * and bits 11-2 are low 10 bits of op-panel code)</a>
+<a name="98"><span class="lineNum"> 98 </span> : : *</a>
+<a name="99"><span class="lineNum"> 99 </span> : : * bit 1,0: 00b=OP_LOG, 10b=OP_WARN, 01b=OP_ERROR, 11b=OP_FATAL</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * i.e. bit 0 indicates ERROR or FATAL.</a>
+<a name="101"><span class="lineNum"> 101 </span> : : *</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * If port 80h number has the MSB and LSB set, then you died in OPAL.</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Any *odd* number with the MSB set (i.e. &gt; 0x80) indicates error.</a>
+<a name="104"><span class="lineNum"> 104 </span> : : */</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 16 : static inline uint16_t op_display_to_port8x(uint16_t last_value, enum op_severity s, enum op_module m, uint16_t c)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : {</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 16 : uint16_t r = 0x8000; /* Start with top bit set indicating in OPAL */</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 16 : switch(m) {</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 7 : case OP_MOD_INIT:</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : /* bit 6 is zero */</a>
+<a name="112"><span class="lineNum"> 112 </span> : : /* bits 13 through 2 have low 12 bits of c */</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 7 : r |= (c &amp; 0xFFF) &lt;&lt; 2;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 7 : break;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : case OP_MOD_CPU:</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : r |= 0x4000 | (c &amp; 0x03FF) &lt;&lt; 2;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 2 : case OP_MOD_LOCK:</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 2 : r |= 0x5000 | (c &amp; 0x03FF) &lt;&lt; 2;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 2 : case OP_MOD_MEM:</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 2 : r |= 0x6000 | (c &amp; 0x03FF) &lt;&lt; 2;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : case OP_MOD_CHIPTOD:</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : r |= 0x7000 | (c &amp; 0x03FF) &lt;&lt; 2;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : case OP_MOD_CORE:</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : /*</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * Only current OP_MOD_CORE is where we're OP_FATAL,</a>
+<a name="130"><span class="lineNum"> 130 </span> : : * So let's go for the last value set and tweak the</a>
+<a name="131"><span class="lineNum"> 131 </span> : : * bits for OP_FATAL.</a>
+<a name="132"><span class="lineNum"> 132 </span> : : */</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 1 : r = last_value &amp; 0xFFFC;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 2 : case OP_MOD_FSP:</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : case OP_MOD_FSPCON:</a>
+<a name="137"><span class="lineNum"> 137 </span> : : /* Should never be hit, port80h only used on non-FSP! */</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 16 : switch(s) {</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 7 : case OP_LOG:</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 7 : break;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 3 : case OP_WARN:</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 3 : r |= 0x02;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 3 : break;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 1 : case OP_ERROR:</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 1 : r |= 0x01;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 5 : case OP_FATAL:</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 5 : r |= 0x03;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : }</a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 16 : return r;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : }</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 16 : void op_display_lpc(enum op_severity s, enum op_module m, uint16_t c)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : {</a>
+<a name="160"><span class="lineNum"> 160 </span> : : static uint8_t port80_val = 0x80;</a>
+<a name="161"><span class="lineNum"> 161 </span> : : static uint16_t port8x_val = 0x8000;</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 16 : if (chip_quirk(QUIRK_SIMICS))</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 16 : port80_val = op_display_to_port80(port80_val, s, m, c);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 16 : port8x_val = op_display_to_port8x(port8x_val, s, m, c);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 16 : lpc_probe_write(OPAL_LPC_IO, 0x80, port80_val, 1);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 16 : lpc_probe_write(OPAL_LPC_IO, 0x81, port8x_val &gt;&gt; 8, 1);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 16 : lpc_probe_write(OPAL_LPC_IO, 0x82, port8x_val &amp; 0xff, 1);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/phys-map.c.func-sort-c.html b/coverage-report/hw/phys-map.c.func-sort-c.html
new file mode 100644
index 0000000..ded9213
--- /dev/null
+++ b/coverage-report/hw/phys-map.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/phys-map.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hw</a> - phys-map.c<span style="font-size: 80%;"> (<a href="phys-map.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">36</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryMed">87.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="phys-map.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map.c.gcov.html#323">phys_map_init</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map.c.gcov.html#278">phys_map_get</a></td>
+ <td class="coverFnHi">185</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map.c.gcov.html#267">phys_map_entry_null</a></td>
+ <td class="coverFnHi">9392</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/phys-map.c.func.html b/coverage-report/hw/phys-map.c.func.html
new file mode 100644
index 0000000..a573558
--- /dev/null
+++ b/coverage-report/hw/phys-map.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/phys-map.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hw</a> - phys-map.c<span style="font-size: 80%;"> (<a href="phys-map.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">36</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryMed">87.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="phys-map.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map.c.gcov.html#267">phys_map_entry_null</a></td>
+ <td class="coverFnHi">9392</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map.c.gcov.html#278">phys_map_get</a></td>
+ <td class="coverFnHi">185</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map.c.gcov.html#323">phys_map_init</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/phys-map.c.gcov.html b/coverage-report/hw/phys-map.c.gcov.html
new file mode 100644
index 0000000..60c3f81
--- /dev/null
+++ b/coverage-report/hw/phys-map.c.gcov.html
@@ -0,0 +1,431 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/phys-map.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">hw</a> - phys-map.c<span style="font-size: 80%;"> (source / <a href="phys-map.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">36</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryMed">87.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Physical memory map</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2017-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;phys-map.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;chip.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;opal-api.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stack.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : struct phys_map_entry {</a>
+<a name="16"><span class="lineNum"> 16 </span> : : enum phys_map_type type;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : int index;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : uint64_t addr;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : uint64_t size;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : };</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct phys_map_info {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : int chip_select_shift;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : const struct phys_map_entry *table;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : };</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : static const struct phys_map_info *phys_map;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : static const struct phys_map_entry phys_map_table_nimbus[] = {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* System memory upto 4TB minus GPU memory */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : { SYSTEM_MEM, 0, 0x0000000000000000ull, 0x0000034000000000ull },</a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* GPU memory from 4TB - 128GB*GPU */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : { GPU_MEM_4T_DOWN, 5, 0x0000034000000000ull, 0x0000002000000000ull },</a>
+<a name="35"><span class="lineNum"> 35 </span> : : { GPU_MEM_4T_DOWN, 4, 0x0000036000000000ull, 0x0000002000000000ull },</a>
+<a name="36"><span class="lineNum"> 36 </span> : : { GPU_MEM_4T_DOWN, 3, 0x0000038000000000ull, 0x0000002000000000ull },</a>
+<a name="37"><span class="lineNum"> 37 </span> : : { GPU_MEM_4T_DOWN, 2, 0x000003a000000000ull, 0x0000002000000000ull },</a>
+<a name="38"><span class="lineNum"> 38 </span> : : { GPU_MEM_4T_DOWN, 1, 0x000003c000000000ull, 0x0000002000000000ull },</a>
+<a name="39"><span class="lineNum"> 39 </span> : : { GPU_MEM_4T_DOWN, 0, 0x000003e000000000ull, 0x0000002000000000ull },</a>
+<a name="40"><span class="lineNum"> 40 </span> : : /* GPU memory from 4TB + 128GB*GPU. 4 GPUs only */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : { GPU_MEM_4T_UP, 0, 0x0000040000000000ull, 0x0000002000000000ull },</a>
+<a name="42"><span class="lineNum"> 42 </span> : : { GPU_MEM_4T_UP, 1, 0x0000042000000000ull, 0x0000002000000000ull },</a>
+<a name="43"><span class="lineNum"> 43 </span> : : { GPU_MEM_4T_UP, 2, 0x0000044000000000ull, 0x0000002000000000ull },</a>
+<a name="44"><span class="lineNum"> 44 </span> : : { GPU_MEM_4T_UP, 3, 0x0000046000000000ull, 0x0000002000000000ull },</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : /*</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * OpenCAPI LPC Memory</a>
+<a name="48"><span class="lineNum"> 48 </span> : : *</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * With chip address extension enabled, we allocate 4TB ranges</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * (in the second non-mirrored region) for each OpenCAPI link</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * by varying the upper 2 bits of the group ID.</a>
+<a name="52"><span class="lineNum"> 52 </span> : : *</a>
+<a name="53"><span class="lineNum"> 53 </span> : : * We don't currently support &gt;4TB ranges.</a>
+<a name="54"><span class="lineNum"> 54 </span> : : */</a>
+<a name="55"><span class="lineNum"> 55 </span> : : { OCAPI_MEM, 0, 0x0002000000000000ull, 0x0000040000000000ull },</a>
+<a name="56"><span class="lineNum"> 56 </span> : : { OCAPI_MEM, 1, 0x0002800000000000ull, 0x0000040000000000ull },</a>
+<a name="57"><span class="lineNum"> 57 </span> : : { OCAPI_MEM, 2, 0x0003000000000000ull, 0x0000040000000000ull },</a>
+<a name="58"><span class="lineNum"> 58 </span> : : { OCAPI_MEM, 3, 0x0003800000000000ull, 0x0000040000000000ull },</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : /* 0 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : { PHB4_64BIT_MMIO, 0, 0x0006000000000000ull, 0x0000004000000000ull },</a>
+<a name="62"><span class="lineNum"> 62 </span> : : { PHB4_64BIT_MMIO, 1, 0x0006004000000000ull, 0x0000004000000000ull },</a>
+<a name="63"><span class="lineNum"> 63 </span> : : { PHB4_64BIT_MMIO, 2, 0x0006008000000000ull, 0x0000004000000000ull },</a>
+<a name="64"><span class="lineNum"> 64 </span> : : { PHB4_32BIT_MMIO, 0, 0x000600c000000000ull, 0x0000000080000000ull },</a>
+<a name="65"><span class="lineNum"> 65 </span> : : { PHB4_32BIT_MMIO, 1, 0x000600c080000000ull, 0x0000000080000000ull },</a>
+<a name="66"><span class="lineNum"> 66 </span> : : { PHB4_32BIT_MMIO, 2, 0x000600c100000000ull, 0x0000000080000000ull },</a>
+<a name="67"><span class="lineNum"> 67 </span> : : { PHB4_32BIT_MMIO, 3, 0x000600c180000000ull, 0x0000000080000000ull },</a>
+<a name="68"><span class="lineNum"> 68 </span> : : { PHB4_32BIT_MMIO, 4, 0x000600c200000000ull, 0x0000000080000000ull },</a>
+<a name="69"><span class="lineNum"> 69 </span> : : { PHB4_32BIT_MMIO, 5, 0x000600c280000000ull, 0x0000000080000000ull },</a>
+<a name="70"><span class="lineNum"> 70 </span> : : { PHB4_XIVE_ESB , 0, 0x000600c300000000ull, 0x0000000020000000ull },</a>
+<a name="71"><span class="lineNum"> 71 </span> : : { PHB4_XIVE_ESB , 1, 0x000600c320000000ull, 0x0000000020000000ull },</a>
+<a name="72"><span class="lineNum"> 72 </span> : : { PHB4_XIVE_ESB , 2, 0x000600c340000000ull, 0x0000000020000000ull },</a>
+<a name="73"><span class="lineNum"> 73 </span> : : { PHB4_XIVE_ESB , 3, 0x000600c360000000ull, 0x0000000020000000ull },</a>
+<a name="74"><span class="lineNum"> 74 </span> : : { PHB4_XIVE_ESB , 4, 0x000600c380000000ull, 0x0000000020000000ull },</a>
+<a name="75"><span class="lineNum"> 75 </span> : : { PHB4_XIVE_ESB , 5, 0x000600c3a0000000ull, 0x0000000020000000ull },</a>
+<a name="76"><span class="lineNum"> 76 </span> : : { PHB4_REG_SPC , 0, 0x000600c3c0000000ull, 0x0000000000100000ull },</a>
+<a name="77"><span class="lineNum"> 77 </span> : : { PHB4_REG_SPC , 1, 0x000600c3c0100000ull, 0x0000000000100000ull },</a>
+<a name="78"><span class="lineNum"> 78 </span> : : { PHB4_REG_SPC , 2, 0x000600c3c0200000ull, 0x0000000000100000ull },</a>
+<a name="79"><span class="lineNum"> 79 </span> : : { PHB4_REG_SPC , 3, 0x000600c3c0300000ull, 0x0000000000100000ull },</a>
+<a name="80"><span class="lineNum"> 80 </span> : : { PHB4_REG_SPC , 4, 0x000600c3c0400000ull, 0x0000000000100000ull },</a>
+<a name="81"><span class="lineNum"> 81 </span> : : { PHB4_REG_SPC , 5, 0x000600c3c0500000ull, 0x0000000000100000ull },</a>
+<a name="82"><span class="lineNum"> 82 </span> : : { RESV , 0, 0x000600c3c0600000ull, 0x0000000c3fa00000ull },</a>
+<a name="83"><span class="lineNum"> 83 </span> : : { NPU_OCAPI_MMIO , 0, 0x000600d000000000ull, 0x0000000800000000ull },</a>
+<a name="84"><span class="lineNum"> 84 </span> : : { NPU_OCAPI_MMIO , 1, 0x000600d800000000ull, 0x0000000800000000ull },</a>
+<a name="85"><span class="lineNum"> 85 </span> : : { NPU_OCAPI_MMIO , 2, 0x000600e000000000ull, 0x0000000800000000ull },</a>
+<a name="86"><span class="lineNum"> 86 </span> : : { NPU_OCAPI_MMIO , 3, 0x000600e800000000ull, 0x0000000800000000ull },</a>
+<a name="87"><span class="lineNum"> 87 </span> : : { NPU_OCAPI_MMIO , 4, 0x000600f000000000ull, 0x0000000800000000ull },</a>
+<a name="88"><span class="lineNum"> 88 </span> : : { NPU_OCAPI_MMIO , 5, 0x000600f800000000ull, 0x0000000800000000ull },</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : /* 1 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="91"><span class="lineNum"> 91 </span> : : { XIVE_VC , 0, 0x0006010000000000ull, 0x0000008000000000ull },</a>
+<a name="92"><span class="lineNum"> 92 </span> : : { XIVE_PC , 0, 0x0006018000000000ull, 0x0000001000000000ull },</a>
+<a name="93"><span class="lineNum"> 93 </span> : : { VAS_USER_WIN , 0, 0x0006019000000000ull, 0x0000000100000000ull },</a>
+<a name="94"><span class="lineNum"> 94 </span> : : { VAS_HYP_WIN , 0, 0x0006019100000000ull, 0x0000000002000000ull },</a>
+<a name="95"><span class="lineNum"> 95 </span> : : { RESV , 1, 0x0006019102000000ull, 0x000000001e000000ull },</a>
+<a name="96"><span class="lineNum"> 96 </span> : : { OCAB_XIVE_ESB , 0, 0x0006019120000000ull, 0x0000000020000000ull },</a>
+<a name="97"><span class="lineNum"> 97 </span> : : { RESV , 3, 0x0006019140000000ull, 0x0000006ec0000000ull },</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /* 2 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : { PHB4_64BIT_MMIO, 3, 0x0006020000000000ull, 0x0000004000000000ull },</a>
+<a name="101"><span class="lineNum"> 101 </span> : : { PHB4_64BIT_MMIO, 4, 0x0006024000000000ull, 0x0000004000000000ull },</a>
+<a name="102"><span class="lineNum"> 102 </span> : : { PHB4_64BIT_MMIO, 5, 0x0006028000000000ull, 0x0000004000000000ull },</a>
+<a name="103"><span class="lineNum"> 103 </span> : : { RESV , 4, 0x000602c000000000ull, 0x0000004000000000ull },</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> : : /* 3 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="106"><span class="lineNum"> 106 </span> : : { LPC_BUS , 0, 0x0006030000000000ull, 0x0000000100000000ull },</a>
+<a name="107"><span class="lineNum"> 107 </span> : : { FSP_MMIO , 0, 0x0006030100000000ull, 0x0000000100000000ull },</a>
+<a name="108"><span class="lineNum"> 108 </span> : : { NPU_REGS , 0, 0x0006030200000000ull, 0x0000000001000000ull },</a>
+<a name="109"><span class="lineNum"> 109 </span> : : { NPU_USR , 0, 0x0006030201000000ull, 0x0000000000200000ull },</a>
+<a name="110"><span class="lineNum"> 110 </span> : : { NPU_PHY , 0, 0x0006030201200000ull, 0x0000000000200000ull },</a>
+<a name="111"><span class="lineNum"> 111 </span> : : { NPU_PHY , 1, 0x0006030201400000ull, 0x0000000000200000ull },</a>
+<a name="112"><span class="lineNum"> 112 </span> : : { NPU_NTL , 0, 0x0006030201600000ull, 0x0000000000020000ull },</a>
+<a name="113"><span class="lineNum"> 113 </span> : : { NPU_NTL , 1, 0x0006030201620000ull, 0x0000000000020000ull },</a>
+<a name="114"><span class="lineNum"> 114 </span> : : { NPU_NTL , 2, 0x0006030201640000ull, 0x0000000000020000ull },</a>
+<a name="115"><span class="lineNum"> 115 </span> : : { NPU_NTL , 3, 0x0006030201660000ull, 0x0000000000020000ull },</a>
+<a name="116"><span class="lineNum"> 116 </span> : : { NPU_NTL , 4, 0x0006030201680000ull, 0x0000000000020000ull },</a>
+<a name="117"><span class="lineNum"> 117 </span> : : { NPU_NTL , 5, 0x00060302016a0000ull, 0x0000000000020000ull },</a>
+<a name="118"><span class="lineNum"> 118 </span> : : { NPU_GENID , 0, 0x00060302016c0000ull, 0x0000000000020000ull },</a>
+<a name="119"><span class="lineNum"> 119 </span> : : { NPU_GENID , 1, 0x00060302016e0000ull, 0x0000000000020000ull },</a>
+<a name="120"><span class="lineNum"> 120 </span> : : { NPU_GENID , 2, 0x0006030201700000ull, 0x0000000000020000ull },</a>
+<a name="121"><span class="lineNum"> 121 </span> : : { RESV , 5, 0x0006030201720000ull, 0x00000000018e0000ull },</a>
+<a name="122"><span class="lineNum"> 122 </span> : : { PSIHB_REG , 0, 0x0006030203000000ull, 0x0000000000100000ull },</a>
+<a name="123"><span class="lineNum"> 123 </span> : : { XIVE_IC , 0, 0x0006030203100000ull, 0x0000000000080000ull },</a>
+<a name="124"><span class="lineNum"> 124 </span> : : { XIVE_TM , 0, 0x0006030203180000ull, 0x0000000000040000ull },</a>
+<a name="125"><span class="lineNum"> 125 </span> : : { PSIHB_ESB , 0, 0x00060302031c0000ull, 0x0000000000010000ull },</a>
+<a name="126"><span class="lineNum"> 126 </span> : : { NX_RNG , 0, 0x00060302031d0000ull, 0x0000000000010000ull },</a>
+<a name="127"><span class="lineNum"> 127 </span> : : { RESV , 6, 0x00060302031e0000ull, 0x000000001ce20000ull },</a>
+<a name="128"><span class="lineNum"> 128 </span> : : { CENTAUR_SCOM , 0, 0x0006030220000000ull, 0x0000000020000000ull },</a>
+<a name="129"><span class="lineNum"> 129 </span> : : { RESV , 7, 0x0006030240000000ull, 0x000000f9c0000000ull },</a>
+<a name="130"><span class="lineNum"> 130 </span> : : { XSCOM , 0, 0x000603fc00000000ull, 0x0000000400000000ull },</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* NULL entry at end */</a>
+<a name="133"><span class="lineNum"> 133 </span> : : { NULL_MAP, 0, 0, 0 },</a>
+<a name="134"><span class="lineNum"> 134 </span> : : };</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : static const struct phys_map_info phys_map_nimbus = {</a>
+<a name="137"><span class="lineNum"> 137 </span> : : .chip_select_shift = 42,</a>
+<a name="138"><span class="lineNum"> 138 </span> : : .table = phys_map_table_nimbus,</a>
+<a name="139"><span class="lineNum"> 139 </span> : : };</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : static const struct phys_map_entry phys_map_table_axone[] = {</a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : /* System memory up to 4TB minus GPU memory */</a>
+<a name="144"><span class="lineNum"> 144 </span> : : { SYSTEM_MEM, 0, 0x0000000000000000ull, 0x0000034000000000ull },</a>
+<a name="145"><span class="lineNum"> 145 </span> : : /* GPU memory from 4TB - 128GB*GPU */</a>
+<a name="146"><span class="lineNum"> 146 </span> : : { GPU_MEM_4T_DOWN, 5, 0x0000034000000000ull, 0x0000002000000000ull },</a>
+<a name="147"><span class="lineNum"> 147 </span> : : { GPU_MEM_4T_DOWN, 4, 0x0000036000000000ull, 0x0000002000000000ull },</a>
+<a name="148"><span class="lineNum"> 148 </span> : : { GPU_MEM_4T_DOWN, 3, 0x0000038000000000ull, 0x0000002000000000ull },</a>
+<a name="149"><span class="lineNum"> 149 </span> : : { GPU_MEM_4T_DOWN, 2, 0x000003a000000000ull, 0x0000002000000000ull },</a>
+<a name="150"><span class="lineNum"> 150 </span> : : { GPU_MEM_4T_DOWN, 1, 0x000003c000000000ull, 0x0000002000000000ull },</a>
+<a name="151"><span class="lineNum"> 151 </span> : : { GPU_MEM_4T_DOWN, 0, 0x000003e000000000ull, 0x0000002000000000ull },</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> : : /* 0 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="154"><span class="lineNum"> 154 </span> : : { PHB4_64BIT_MMIO, 0, 0x0006000000000000ull, 0x0000004000000000ull },</a>
+<a name="155"><span class="lineNum"> 155 </span> : : { PHB4_64BIT_MMIO, 1, 0x0006004000000000ull, 0x0000004000000000ull },</a>
+<a name="156"><span class="lineNum"> 156 </span> : : { PHB4_64BIT_MMIO, 2, 0x0006008000000000ull, 0x0000004000000000ull },</a>
+<a name="157"><span class="lineNum"> 157 </span> : : { PHB4_32BIT_MMIO, 0, 0x000600c000000000ull, 0x0000000080000000ull },</a>
+<a name="158"><span class="lineNum"> 158 </span> : : { PHB4_32BIT_MMIO, 1, 0x000600c080000000ull, 0x0000000080000000ull },</a>
+<a name="159"><span class="lineNum"> 159 </span> : : { PHB4_32BIT_MMIO, 2, 0x000600c100000000ull, 0x0000000080000000ull },</a>
+<a name="160"><span class="lineNum"> 160 </span> : : { PHB4_32BIT_MMIO, 3, 0x000600c180000000ull, 0x0000000080000000ull },</a>
+<a name="161"><span class="lineNum"> 161 </span> : : { PHB4_32BIT_MMIO, 4, 0x000600c200000000ull, 0x0000000080000000ull },</a>
+<a name="162"><span class="lineNum"> 162 </span> : : { PHB4_32BIT_MMIO, 5, 0x000600c280000000ull, 0x0000000080000000ull },</a>
+<a name="163"><span class="lineNum"> 163 </span> : : { PHB4_XIVE_ESB, 0, 0x000600c300000000ull, 0x0000000020000000ull },</a>
+<a name="164"><span class="lineNum"> 164 </span> : : { PHB4_XIVE_ESB, 1, 0x000600c320000000ull, 0x0000000020000000ull },</a>
+<a name="165"><span class="lineNum"> 165 </span> : : { PHB4_XIVE_ESB, 2, 0x000600c340000000ull, 0x0000000020000000ull },</a>
+<a name="166"><span class="lineNum"> 166 </span> : : { PHB4_XIVE_ESB, 3, 0x000600c360000000ull, 0x0000000020000000ull },</a>
+<a name="167"><span class="lineNum"> 167 </span> : : { PHB4_XIVE_ESB, 4, 0x000600c380000000ull, 0x0000000020000000ull },</a>
+<a name="168"><span class="lineNum"> 168 </span> : : { PHB4_XIVE_ESB, 5, 0x000600c3a0000000ull, 0x0000000020000000ull },</a>
+<a name="169"><span class="lineNum"> 169 </span> : : { PHB4_REG_SPC, 0, 0x000600c3c0000000ull, 0x0000000000100000ull },</a>
+<a name="170"><span class="lineNum"> 170 </span> : : { PHB4_REG_SPC, 1, 0x000600c3c0100000ull, 0x0000000000100000ull },</a>
+<a name="171"><span class="lineNum"> 171 </span> : : { PHB4_REG_SPC, 2, 0x000600c3c0200000ull, 0x0000000000100000ull },</a>
+<a name="172"><span class="lineNum"> 172 </span> : : { PHB4_REG_SPC, 3, 0x000600c3c0300000ull, 0x0000000000100000ull },</a>
+<a name="173"><span class="lineNum"> 173 </span> : : { PHB4_REG_SPC, 4, 0x000600c3c0400000ull, 0x0000000000100000ull },</a>
+<a name="174"><span class="lineNum"> 174 </span> : : { PHB4_REG_SPC, 5, 0x000600c3c0500000ull, 0x0000000000100000ull },</a>
+<a name="175"><span class="lineNum"> 175 </span> : : { RESV, 0, 0x000600c3c0600000ull, 0x0000000c3fa00000ull },</a>
+<a name="176"><span class="lineNum"> 176 </span> : : { NPU_OCAPI_MMIO, 0, 0x000600d000000000ull, 0x0000000800000000ull },</a>
+<a name="177"><span class="lineNum"> 177 </span> : : { NPU_OCAPI_MMIO, 1, 0x000600d800000000ull, 0x0000000800000000ull },</a>
+<a name="178"><span class="lineNum"> 178 </span> : : { NPU_OCAPI_MMIO, 2, 0x000600e000000000ull, 0x0000000800000000ull },</a>
+<a name="179"><span class="lineNum"> 179 </span> : : { NPU_OCAPI_MMIO, 3, 0x000600e800000000ull, 0x0000000800000000ull },</a>
+<a name="180"><span class="lineNum"> 180 </span> : : { NPU_OCAPI_MMIO, 4, 0x000600f000000000ull, 0x0000000800000000ull },</a>
+<a name="181"><span class="lineNum"> 181 </span> : : { NPU_OCAPI_MMIO, 5, 0x000600f800000000ull, 0x0000000800000000ull },</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> : : /* 1 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="184"><span class="lineNum"> 184 </span> : : { XIVE_VC, 0, 0x0006010000000000ull, 0x0000008000000000ull },</a>
+<a name="185"><span class="lineNum"> 185 </span> : : { XIVE_PC, 0, 0x0006018000000000ull, 0x0000004000000000ull },</a>
+<a name="186"><span class="lineNum"> 186 </span> : : { VAS_USER_WIN, 0, 0x000601c000000000ull, 0x0000000100000000ull },</a>
+<a name="187"><span class="lineNum"> 187 </span> : : { VAS_HYP_WIN, 0, 0x000601c100000000ull, 0x0000000002000000ull },</a>
+<a name="188"><span class="lineNum"> 188 </span> : : { RESV, 1, 0x000601c102000000ull, 0x0000003efe000000ull },</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> : : /* 2 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="191"><span class="lineNum"> 191 </span> : : { PHB4_64BIT_MMIO, 3, 0x0006020000000000ull, 0x0000004000000000ull },</a>
+<a name="192"><span class="lineNum"> 192 </span> : : { PHB4_64BIT_MMIO, 4, 0x0006024000000000ull, 0x0000004000000000ull },</a>
+<a name="193"><span class="lineNum"> 193 </span> : : { PHB4_64BIT_MMIO, 5, 0x0006028000000000ull, 0x0000004000000000ull },</a>
+<a name="194"><span class="lineNum"> 194 </span> : : { RESV, 2, 0x000602c000000000ull, 0x0000004000000000ull },</a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> : : /* 3 TB offset @ MMIO 0x0006000000000000ull */</a>
+<a name="197"><span class="lineNum"> 197 </span> : : { LPC_BUS, 0, 0x0006030000000000ull, 0x0000000100000000ull },</a>
+<a name="198"><span class="lineNum"> 198 </span> : : { FSP_MMIO, 0, 0x0006030100000000ull, 0x0000000100000000ull },</a>
+<a name="199"><span class="lineNum"> 199 </span> : : { RESV, 3, 0x0006030200000000ull, 0x0000000003000000ull },</a>
+<a name="200"><span class="lineNum"> 200 </span> : : { PSIHB_REG, 0, 0x0006030203000000ull, 0x0000000000100000ull },</a>
+<a name="201"><span class="lineNum"> 201 </span> : : { XIVE_IC, 0, 0x0006030203100000ull, 0x0000000000080000ull },</a>
+<a name="202"><span class="lineNum"> 202 </span> : : { XIVE_TM, 0, 0x0006030203180000ull, 0x0000000000040000ull },</a>
+<a name="203"><span class="lineNum"> 203 </span> : : { PSIHB_ESB, 0, 0x00060302031c0000ull, 0x0000000000010000ull },</a>
+<a name="204"><span class="lineNum"> 204 </span> : : { NX_RNG, 0, 0x00060302031d0000ull, 0x0000000000010000ull },</a>
+<a name="205"><span class="lineNum"> 205 </span> : : { RESV, 4, 0x00060302031e0000ull, 0x00000001fce20000ull },</a>
+<a name="206"><span class="lineNum"> 206 </span> : : { MC_OCMB_CFG, 0, 0x0006030400000000ull, 0x0000000080000000ull },</a>
+<a name="207"><span class="lineNum"> 207 </span> : : { MC_OCMB_CFG, 1, 0x0006030480000000ull, 0x0000000080000000ull },</a>
+<a name="208"><span class="lineNum"> 208 </span> : : { MC_OCMB_MMIO, 0, 0x0006030500000000ull, 0x0000000080000000ull },</a>
+<a name="209"><span class="lineNum"> 209 </span> : : { MC_OCMB_MMIO, 1, 0x0006030580000000ull, 0x0000000080000000ull },</a>
+<a name="210"><span class="lineNum"> 210 </span> : : { MC_OCMB_CFG, 2, 0x0006030600000000ull, 0x0000000080000000ull },</a>
+<a name="211"><span class="lineNum"> 211 </span> : : { MC_OCMB_CFG, 3, 0x0006030680000000ull, 0x0000000080000000ull },</a>
+<a name="212"><span class="lineNum"> 212 </span> : : { MC_OCMB_MMIO, 2, 0x0006030700000000ull, 0x0000000080000000ull },</a>
+<a name="213"><span class="lineNum"> 213 </span> : : { MC_OCMB_MMIO, 3, 0x0006030780000000ull, 0x0000000080000000ull },</a>
+<a name="214"><span class="lineNum"> 214 </span> : : { MC_OCMB_CFG, 4, 0x0006030800000000ull, 0x0000000080000000ull },</a>
+<a name="215"><span class="lineNum"> 215 </span> : : { MC_OCMB_CFG, 5, 0x0006030880000000ull, 0x0000000080000000ull },</a>
+<a name="216"><span class="lineNum"> 216 </span> : : { MC_OCMB_MMIO, 4, 0x0006030900000000ull, 0x0000000080000000ull },</a>
+<a name="217"><span class="lineNum"> 217 </span> : : { MC_OCMB_MMIO, 5, 0x0006030980000000ull, 0x0000000080000000ull },</a>
+<a name="218"><span class="lineNum"> 218 </span> : : { MC_OCMB_CFG, 6, 0x0006030a00000000ull, 0x0000000080000000ull },</a>
+<a name="219"><span class="lineNum"> 219 </span> : : { MC_OCMB_CFG, 7, 0x0006030a80000000ull, 0x0000000080000000ull },</a>
+<a name="220"><span class="lineNum"> 220 </span> : : { MC_OCMB_MMIO, 6, 0x0006030b00000000ull, 0x0000000080000000ull },</a>
+<a name="221"><span class="lineNum"> 221 </span> : : { MC_OCMB_MMIO, 7, 0x0006030b80000000ull, 0x0000000080000000ull },</a>
+<a name="222"><span class="lineNum"> 222 </span> : : { MC_OCMB_CFG, 8, 0x0006030c00000000ull, 0x0000000080000000ull },</a>
+<a name="223"><span class="lineNum"> 223 </span> : : { MC_OCMB_CFG, 9, 0x0006030c80000000ull, 0x0000000080000000ull },</a>
+<a name="224"><span class="lineNum"> 224 </span> : : { MC_OCMB_MMIO, 8, 0x0006030d00000000ull, 0x0000000080000000ull },</a>
+<a name="225"><span class="lineNum"> 225 </span> : : { MC_OCMB_MMIO, 9, 0x0006030d80000000ull, 0x0000000080000000ull },</a>
+<a name="226"><span class="lineNum"> 226 </span> : : { MC_OCMB_CFG, 10, 0x0006030e00000000ull, 0x0000000080000000ull },</a>
+<a name="227"><span class="lineNum"> 227 </span> : : { MC_OCMB_CFG, 11, 0x0006030e80000000ull, 0x0000000080000000ull },</a>
+<a name="228"><span class="lineNum"> 228 </span> : : { MC_OCMB_MMIO, 10, 0x0006030f00000000ull, 0x0000000080000000ull },</a>
+<a name="229"><span class="lineNum"> 229 </span> : : { MC_OCMB_MMIO, 11, 0x0006030f80000000ull, 0x0000000080000000ull },</a>
+<a name="230"><span class="lineNum"> 230 </span> : : { MC_OCMB_CFG, 12, 0x0006031000000000ull, 0x0000000080000000ull },</a>
+<a name="231"><span class="lineNum"> 231 </span> : : { MC_OCMB_CFG, 13, 0x0006031080000000ull, 0x0000000080000000ull },</a>
+<a name="232"><span class="lineNum"> 232 </span> : : { MC_OCMB_MMIO, 12, 0x0006031100000000ull, 0x0000000080000000ull },</a>
+<a name="233"><span class="lineNum"> 233 </span> : : { MC_OCMB_MMIO, 13, 0x0006031180000000ull, 0x0000000080000000ull },</a>
+<a name="234"><span class="lineNum"> 234 </span> : : { MC_OCMB_CFG, 14, 0x0006031200000000ull, 0x0000000080000000ull },</a>
+<a name="235"><span class="lineNum"> 235 </span> : : { MC_OCMB_CFG, 15, 0x0006031280000000ull, 0x0000000080000000ull },</a>
+<a name="236"><span class="lineNum"> 236 </span> : : { MC_OCMB_MMIO, 14, 0x0006031300000000ull, 0x0000000080000000ull },</a>
+<a name="237"><span class="lineNum"> 237 </span> : : { MC_OCMB_MMIO, 15, 0x0006031380000000ull, 0x0000000080000000ull },</a>
+<a name="238"><span class="lineNum"> 238 </span> : : { RESV, 5, 0x0006031400000000ull, 0x000000d800000000ull },</a>
+<a name="239"><span class="lineNum"> 239 </span> : : { NPU_REGS, 0, 0x000603ec00000000ull, 0x0000000001000000ull },</a>
+<a name="240"><span class="lineNum"> 240 </span> : : { NPU_REGS, 1, 0x000603ec01000000ull, 0x0000000001000000ull },</a>
+<a name="241"><span class="lineNum"> 241 </span> : : { NPU_REGS, 2, 0x000603ec02000000ull, 0x0000000001000000ull },</a>
+<a name="242"><span class="lineNum"> 242 </span> : : { NPU_NTL, 0, 0x000603ec03000000ull, 0x0000000000020000ull },</a>
+<a name="243"><span class="lineNum"> 243 </span> : : { NPU_NTL, 1, 0x000603ec03020000ull, 0x0000000000020000ull },</a>
+<a name="244"><span class="lineNum"> 244 </span> : : { NPU_NTL, 2, 0x000603ec03040000ull, 0x0000000000020000ull },</a>
+<a name="245"><span class="lineNum"> 245 </span> : : { NPU_NTL, 3, 0x000603ec03060000ull, 0x0000000000020000ull },</a>
+<a name="246"><span class="lineNum"> 246 </span> : : { NPU_GENID, 0, 0x000603ec03080000ull, 0x0000000000080000ull },</a>
+<a name="247"><span class="lineNum"> 247 </span> : : { NPU_NTL, 4, 0x000603ec03100000ull, 0x0000000000020000ull },</a>
+<a name="248"><span class="lineNum"> 248 </span> : : { NPU_NTL, 5, 0x000603ec03120000ull, 0x0000000000020000ull },</a>
+<a name="249"><span class="lineNum"> 249 </span> : : { NPU_NTL, 6, 0x000603ec03140000ull, 0x0000000000020000ull },</a>
+<a name="250"><span class="lineNum"> 250 </span> : : { NPU_NTL, 7, 0x000603ec03160000ull, 0x0000000000020000ull },</a>
+<a name="251"><span class="lineNum"> 251 </span> : : { NPU_GENID, 1, 0x000603ec03180000ull, 0x0000000000080000ull },</a>
+<a name="252"><span class="lineNum"> 252 </span> : : { NPU_NTL, 8, 0x000603ec03200000ull, 0x0000000000020000ull },</a>
+<a name="253"><span class="lineNum"> 253 </span> : : { NPU_NTL, 9, 0x000603ec03220000ull, 0x0000000000020000ull },</a>
+<a name="254"><span class="lineNum"> 254 </span> : : { NPU_NTL, 10, 0x000603ec03240000ull, 0x0000000000020000ull },</a>
+<a name="255"><span class="lineNum"> 255 </span> : : { NPU_NTL, 11, 0x000603ec03260000ull, 0x0000000000020000ull },</a>
+<a name="256"><span class="lineNum"> 256 </span> : : { NPU_GENID, 2, 0x000603ec03280000ull, 0x0000000000080000ull },</a>
+<a name="257"><span class="lineNum"> 257 </span> : : { RESV, 6, 0x000603ec03300000ull, 0x0000000ffcd00000ull },</a>
+<a name="258"><span class="lineNum"> 258 </span> : : { XSCOM, 0, 0x000603fc00000000ull, 0x0000000400000000ull },</a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> : : /* NULL entry at end */</a>
+<a name="261"><span class="lineNum"> 261 </span> : : { NULL_MAP, 0, 0, 0 },</a>
+<a name="262"><span class="lineNum"> 262 </span> : : };</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : static const struct phys_map_info phys_map_axone = {</a>
+<a name="265"><span class="lineNum"> 265 </span> : : .chip_select_shift = 42,</a>
+<a name="266"><span class="lineNum"> 266 </span> : : .table = phys_map_table_axone,</a>
+<a name="267"><span class="lineNum"> 267 </span> : : };</a>
+<a name="268"><span class="lineNum"> 268 </span> : : </a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 9392 : static inline bool phys_map_entry_null(const struct phys_map_entry *e)</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : {</a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 9392 : if (e-&gt;type == NULL_MAP)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 6 : return true;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 9386 : return false;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* This crashes skiboot on error as any bad calls here are almost</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * certainly a developer error</a>
+<a name="279"><span class="lineNum"> 279 </span> : : */</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 185 : void phys_map_get(uint64_t gcid, enum phys_map_type type,</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : int index, uint64_t *addr, uint64_t *size) {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : const struct phys_map_entry *e;</a>
+<a name="283"><span class="lineNum"> 283 </span> : : uint64_t a;</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 185 : if (!phys_map)</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : </a>
+<a name="288"><span class="lineNum"> 288 </span> : : /* Find entry in table */</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 8831 : for (e = phys_map-&gt;table; ; e++) {</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> : : /* End of table */</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 8831 : if (phys_map_entry_null(e))</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> : : /* Is this our entry? */</a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 8831 : if (e-&gt;type != type)</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 8081 : continue;</span></a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 750 : if (e-&gt;index != index)</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 565 : continue;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : </a>
+<a name="301"><span class="lineNum"> 301 </span> : : /* Found entry! */</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 185 : break;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 185 : a = e-&gt;addr;</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 185 : a += gcid &lt;&lt; phys_map-&gt;chip_select_shift;</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 185 : if (addr)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 185 : *addr = a;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 185 : if (size)</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 185 : *size = e-&gt;size;</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 185 : prlog(PR_TRACE, &quot;Assigning BAR [%&quot;PRIx64&quot;] type:%02i index:%x &quot;</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : &quot;0x%016&quot;PRIx64&quot; for 0x%016&quot;PRIx64&quot;\n&quot;,</a>
+<a name="314"><span class="lineNum"> 314 </span> : : gcid, type, index, a, e-&gt;size);</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 185 : return;</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineNoCov"> 0 : error:</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : /* Something has gone really wrong */</a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;ERROR: Failed to lookup BAR type:%i index:%i\n&quot;,</span></a>
+<a name="321"><span class="lineNum"> 321 </span> : : type, index);</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="323"><span class="lineNum"> 323 </span> : : }</a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 4 : void phys_map_init(unsigned long pvr)</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 4 : const char *name = &quot;unused&quot;;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : </a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 4 : phys_map = NULL;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 4 : if (proc_gen == proc_gen_p9) {</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 2 : switch(PVR_TYPE(pvr)) {</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 1 : case PVR_TYPE_P9P:</span></a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 1 : name = &quot;axone&quot;;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 1 : phys_map = &amp;phys_map_axone;</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 1 : default:</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 1 : name = &quot;nimbus&quot;;</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 1 : phys_map = &amp;phys_map_nimbus;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : </a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 4 : prlog(PR_DEBUG, &quot;Assigning physical memory map table for %s\n&quot;, name);</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/index-sort-b.html b/coverage-report/hw/test/index-sort-b.html
new file mode 100644
index 0000000..a452b57
--- /dev/null
+++ b/coverage-report/hw/test/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">117</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntryMed">76.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map-test.c.gcov.html">phys-map-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=61 height=10 alt="61.3%"><img src="../../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">57 / 93</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-port80h.c.gcov.html">run-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">60 / 60</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/index-sort-f.html b/coverage-report/hw/test/index-sort-f.html
new file mode 100644
index 0000000..88e8e1d
--- /dev/null
+++ b/coverage-report/hw/test/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">117</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntryMed">76.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map-test.c.gcov.html">phys-map-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=61 height=10 alt="61.3%"><img src="../../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">57 / 93</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-port80h.c.gcov.html">run-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">60 / 60</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/index-sort-l.html b/coverage-report/hw/test/index-sort-l.html
new file mode 100644
index 0000000..553bdaa
--- /dev/null
+++ b/coverage-report/hw/test/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">117</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntryMed">76.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map-test.c.gcov.html">phys-map-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=61 height=10 alt="61.3%"><img src="../../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">57 / 93</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-port80h.c.gcov.html">run-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">60 / 60</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/index.html b/coverage-report/hw/test/index.html
new file mode 100644
index 0000000..a211c2b
--- /dev/null
+++ b/coverage-report/hw/test/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - hw/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">117</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntryMed">76.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryMed">85.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="phys-map-test.c.gcov.html">phys-map-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=61 height=10 alt="61.3%"><img src="../../snow.png" width=39 height=10 alt="61.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.3&nbsp;%</td>
+ <td class="coverNumLo">57 / 93</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-port80h.c.gcov.html">run-port80h.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">60 / 60</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/phys-map-test.c.func-sort-c.html b/coverage-report/hw/test/phys-map-test.c.func-sort-c.html
new file mode 100644
index 0000000..1deddf6
--- /dev/null
+++ b/coverage-report/hw/test/phys-map-test.c.func-sort-c.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test/phys-map-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/test</a> - phys-map-test.c<span style="font-size: 80%;"> (<a href="phys-map-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">57</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">61.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="phys-map-test.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#11">print_entry</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#170">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#80">check_map_call</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#18">check_table_directly</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#65">map_call_entry_null</a></td>
+ <td class="coverFnHi">9016</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/phys-map-test.c.func.html b/coverage-report/hw/test/phys-map-test.c.func.html
new file mode 100644
index 0000000..fb75bce
--- /dev/null
+++ b/coverage-report/hw/test/phys-map-test.c.func.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test/phys-map-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/test</a> - phys-map-test.c<span style="font-size: 80%;"> (<a href="phys-map-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">57</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">61.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="phys-map-test.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#80">check_map_call</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#18">check_table_directly</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#170">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#65">map_call_entry_null</a></td>
+ <td class="coverFnHi">9016</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="phys-map-test.c.gcov.html#11">print_entry</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/phys-map-test.c.gcov.html b/coverage-report/hw/test/phys-map-test.c.gcov.html
new file mode 100644
index 0000000..eba9148
--- /dev/null
+++ b/coverage-report/hw/test/phys-map-test.c.gcov.html
@@ -0,0 +1,271 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test/phys-map-test.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/test</a> - phys-map-test.c<span style="font-size: 80%;"> (source / <a href="phys-map-test.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">57</td>
+ <td class="headerCovTableEntry">93</td>
+ <td class="headerCovTableEntryLo">61.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Physical memory map test</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2017 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &quot;../../core/test/stubs.c&quot;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;../phys-map.c&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : enum proc_gen proc_gen;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineNoCov"> 0 : static inline void print_entry(const struct phys_map_entry *e)</span></a>
+<a name="14"><span class="lineNum"> 14 </span> : : {</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineNoCov"> 0 : printf(&quot;type:%i index:%i addr:%016lx size:%016lx&quot;,</span></a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineNoCov"> 0 : e-&gt;type, e-&gt;index, e-&gt;addr, e-&gt;size);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : /* Check table directly for overlaps */</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 2 : static void check_table_directly(void)</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : {</a>
+<a name="22"><span class="lineNum"> 22 </span> : : const struct phys_map_entry *e, *prev;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : uint64_t start, end, pstart, pend;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : bool passed;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : /* Loop over table entries ... */</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 187 : for (e = phys_map-&gt;table; !phys_map_entry_null(e); e++) {</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 185 : start = e-&gt;addr;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 185 : end = e-&gt;addr + e-&gt;size;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* ... see if they overlap with previous entries */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 8831 : for (prev = phys_map-&gt;table; prev != e; prev++) {</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 8646 : passed = true;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* Check for overlaping regions */</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 8646 : pstart = prev-&gt;addr;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 8646 : pend = prev-&gt;addr + prev-&gt;size;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 8646 : if ((start &gt; pstart) &amp;&amp; (start &lt; pend))</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : passed = false;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 8646 : if ((end &gt; pstart) &amp;&amp; (end &lt; pend))</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : passed = false;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /* Check for duplicate entries */</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 8646 : if ((e-&gt;type == prev-&gt;type) &amp;&amp;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 565 : (e-&gt;index == prev-&gt;index))</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : passed = false;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 8646 : if (passed)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 8646 : continue;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : printf(&quot;Phys map direct test FAILED: Entry overlaps\n&quot;);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : printf(&quot;First: &quot;);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : print_entry(prev);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : printf(&quot;\n&quot;);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : printf(&quot;Second: &quot;);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : print_entry(e);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : printf(&quot;\n&quot;);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : }</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> : : struct map_call_entry {</a>
+<a name="63"><span class="lineNum"> 63 </span> : : uint64_t start;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : uint64_t end;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : };</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 9016 : static inline bool map_call_entry_null(const struct map_call_entry *t)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : {</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 9016 : if ((t-&gt;start == 0) &amp;&amp;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 187 : (t-&gt;end == 0))</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 187 : return true;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 8829 : return false;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /* Check calls to map to see if they overlap.</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * Creates a new table for each of the entries it gets to check against</a>
+<a name="77"><span class="lineNum"> 77 </span> : : */</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : /* Pick a chip ID, any ID. */</a>
+<a name="80"><span class="lineNum"> 80 </span> : : #define FAKE_CHIP_ID 8</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 2 : static void check_map_call(void)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : uint64_t start, size, end;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : const struct phys_map_entry *e;</a>
+<a name="86"><span class="lineNum"> 86 </span> : : struct map_call_entry *tbl, *t, *tnext;</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 2 : int tbl_size = 0;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : bool passed;</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 187 : for (e = phys_map-&gt;table; !phys_map_entry_null(e); e++)</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 185 : tbl_size++;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 2 : tbl_size++; /* allow for null entry at end */</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 2 : tbl_size *= sizeof(struct map_call_entry);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 2 : tbl = malloc(tbl_size);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 2 : assert(tbl != NULL);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 2 : memset(tbl, 0, tbl_size);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /* Loop over table entries ... */</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 187 : for (e = phys_map-&gt;table; !phys_map_entry_null(e); e++) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 185 : phys_map_get(FAKE_CHIP_ID, e-&gt;type, e-&gt;index, &amp;start, &amp;size);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : /* Check for alignment */</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 185 : if ((e-&gt;type != SYSTEM_MEM) &amp;&amp; (e-&gt;type != RESV)) {</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : /* Size is power of 2? */</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 169 : assert(__builtin_popcountl(size) == 1);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* Start is aligned to size? */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 169 : assert((start % size) == 0);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 185 : end = start + size;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 8831 : for (t = tbl; !map_call_entry_null(t); t++) {</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 8646 : passed = true;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> : : /* Check for overlaping regions */</a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 8646 : if ((start &gt; t-&gt;start) &amp;&amp; (start &lt; t-&gt;end))</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : passed = false;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 8646 : if ((end &gt; t-&gt;start) &amp;&amp; (end &lt; t-&gt;end))</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineNoCov"> 0 : passed = false;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 8646 : if (passed)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 8646 : continue;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : printf(&quot;Phys map call test FAILED: Entry overlaps\n&quot;);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : printf(&quot;First: addr:%016lx size:%016lx\n&quot;,</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : t-&gt;start, t-&gt;end - t-&gt;start);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : printf(&quot;Second: addr:%016lx size:%016lx\n &quot;,</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : start, size);</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : print_entry(e);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : printf(&quot;\n&quot;);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : /* Insert entry at end of table */</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 185 : t-&gt;start = start;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 185 : t-&gt;end = end;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 185 : for (t = tbl; !map_call_entry_null(t + 1); t++) {</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 183 : tnext = t + 1;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : /* Make sure the table is sorted */</a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 183 : if (t-&gt;start &gt; tnext-&gt;start) {</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : printf(&quot;Phys map test FAILED: Entry not sorted\n&quot;);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : printf(&quot;First: addr:%016lx size:%016lx\n&quot;,</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : t-&gt;start, t-&gt;end - t-&gt;start);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : printf(&quot;Second: addr:%016lx size:%016lx\n&quot;,</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : tnext-&gt;start, tnext-&gt;end - tnext-&gt;start);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> : : /* Look for holes in the table in MMIO region */</a>
+<a name="151"><span class="lineNum"> 151 </span> : : /* We assume over 1PB is MMIO. */</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 183 : if ((t-&gt;end != tnext-&gt;start) &amp;&amp;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 6 : (t-&gt;start &gt; 0x0004000000000000)) {</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : printf(&quot;Phys map test FAILED: Hole in map\n&quot;);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : printf(&quot;First: addr:%016lx size:%016lx\n&quot;,</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : t-&gt;start, t-&gt;end - t-&gt;start);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : printf(&quot;Second: addr:%016lx size:%016lx\n&quot;,</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : tnext-&gt;start, tnext-&gt;end - tnext-&gt;start);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : assert(0);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 2 : free(tbl);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> : : /* Fake PVR definitions. See include/processor.h */</a>
+<a name="167"><span class="lineNum"> 167 </span> : : unsigned long fake_pvr[] = {</a>
+<a name="168"><span class="lineNum"> 168 </span> : : 0x004e0200, /* PVR_P9 */</a>
+<a name="169"><span class="lineNum"> 169 </span> : : 0x004f0100, /* PVR_P9P */</a>
+<a name="170"><span class="lineNum"> 170 </span> : : };</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : {</a>
+<a name="174"><span class="lineNum"> 174 </span> : : /* Fake we are POWER9 */</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 1 : proc_gen = proc_gen_p9;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : </a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 3 : for (int i = 0; i &lt; ARRAY_SIZE(fake_pvr); i++) {</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 2 : phys_map_init(fake_pvr[i]);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> : : /* Run tests */</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 2 : check_table_directly();</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 2 : check_map_call();</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 1 : return(0);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/run-port80h.c.func-sort-c.html b/coverage-report/hw/test/run-port80h.c.func-sort-c.html
new file mode 100644
index 0000000..299a2a4
--- /dev/null
+++ b/coverage-report/hw/test/run-port80h.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test/run-port80h.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/test</a> - run-port80h.c<span style="font-size: 80%;"> (<a href="run-port80h.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-port80h.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-port80h.c.gcov.html#41">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-port80h.c.gcov.html#18">lpc_probe_write</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/run-port80h.c.func.html b/coverage-report/hw/test/run-port80h.c.func.html
new file mode 100644
index 0000000..f3db94e
--- /dev/null
+++ b/coverage-report/hw/test/run-port80h.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test/run-port80h.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/test</a> - run-port80h.c<span style="font-size: 80%;"> (<a href="run-port80h.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-port80h.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-port80h.c.gcov.html#18">lpc_probe_write</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-port80h.c.gcov.html#41">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/hw/test/run-port80h.c.gcov.html b/coverage-report/hw/test/run-port80h.c.gcov.html
new file mode 100644
index 0000000..6f68f5a
--- /dev/null
+++ b/coverage-report/hw/test/run-port80h.c.gcov.html
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - hw/test/run-port80h.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">hw/test</a> - run-port80h.c<span style="font-size: 80%;"> (source / <a href="run-port80h.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntry">60</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Test result of our LPC port 80h boot progress code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2018-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;assert.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define __unused __attribute__((unused))</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define __LPC_H</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : uint8_t port80;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : uint16_t port8x;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 48 : static int64_t lpc_probe_write(int addr_type __unused, uint32_t addr,</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint32_t data, uint32_t sz)</a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 48 : assert((addr - 0x80) &lt;= 2);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 48 : assert(sz == 1);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 48 : if (addr == 0x80)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 16 : port80 = data;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 48 : if (addr == 0x81)</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 16 : port8x = data &lt;&lt; 8 | (port8x &amp; 0xff);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 48 : if (addr == 0x82)</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 16 : port8x = (port8x &amp; 0xff00) | data;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 48 : return 0;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #include &quot;op-panel.h&quot;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : void op_display_lpc(enum op_severity s, enum op_module m, uint16_t c);</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> : : #include &quot;../lpc-port80h.c&quot;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #include &quot;../../core/test/stubs.c&quot;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_LOG, OP_MOD_INIT, 0x00);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : assert(port80 == 0x80);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : assert(port8x == 0x8000);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_WARN, OP_MOD_INIT, 0x00);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : assert(port80 == 0x82);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : assert(port8x == 0x8002);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_ERROR, OP_MOD_INIT, 0x00);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : assert(port80 == 0x81);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : assert(port8x == 0x8001);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_FATAL, OP_MOD_INIT, 0x00);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : assert(port80 == 0x83);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : assert(port8x == 0x8003);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_FATAL, OP_MOD_INIT, 0x0f);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : assert(port80 == 0xBF);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : assert(port8x == 0x803F);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_LOG, OP_MOD_INIT, 0x0f);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : assert(port80 == 0xBC);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : assert(port8x == 0x803C);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_FATAL, OP_MOD_CORE, 0x6666);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : assert(port80 == 0xBF);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : assert(port8x == 0x803F);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_LOG, OP_MOD_INIT, 0x01);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : assert(port80 == 0x84);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 1 : assert(port8x == 0x8004);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_LOG, OP_MOD_CPU, 0x05);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : assert(port80 == 0xC4);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : assert(port8x == 0xC014);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_LOG, OP_MOD_LOCK, 0x07);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : assert(port80 == 0xDC);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : assert(port8x == 0xD01C);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_FATAL, OP_MOD_LOCK, 0x07);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : assert(port80 == 0xDF);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : assert(port8x == 0xD01F);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_FATAL, OP_MOD_MEM, 0x07);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : assert(port80 == 0xEF);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : assert(port8x == 0xE01F);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_WARN, OP_MOD_MEM, 0x02);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : assert(port80 == 0xEA);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : assert(port8x == 0xE00A);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_WARN, OP_MOD_CHIPTOD, 0x02);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : assert(port80 == 0xFA);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : assert(port8x == 0xF00A);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /*</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * We can't assert that OP_MOD_FSP is invalid as we'd end up</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * trying to set port80 in the assert parth</a>
+<a name="91"><span class="lineNum"> 91 </span> : : */</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_LOG, OP_MOD_FSP, 0x00);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : assert(port80 == 0x80);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : assert(port8x == 0x8000);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : op_display_lpc(OP_LOG, OP_MOD_FSPCON, 0x00);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : assert(port80 == 0x80);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : assert(port8x == 0x8000);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/bitmap.h.func-sort-c.html b/coverage-report/include/bitmap.h.func-sort-c.html
new file mode 100644
index 0000000..737deeb
--- /dev/null
+++ b/coverage-report/include/bitmap.h.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/bitmap.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - bitmap.h<span style="font-size: 80%;"> (<a href="bitmap.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="bitmap.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.h.gcov.html#29">bitmap_clr_bit</a></td>
+ <td class="coverFnHi">29</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.h.gcov.html#24">bitmap_set_bit</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.h.gcov.html#34">bitmap_tst_bit</a></td>
+ <td class="coverFnHi">2186</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/bitmap.h.func.html b/coverage-report/include/bitmap.h.func.html
new file mode 100644
index 0000000..e507248
--- /dev/null
+++ b/coverage-report/include/bitmap.h.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/bitmap.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - bitmap.h<span style="font-size: 80%;"> (<a href="bitmap.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="bitmap.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.h.gcov.html#29">bitmap_clr_bit</a></td>
+ <td class="coverFnHi">29</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.h.gcov.html#24">bitmap_set_bit</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="bitmap.h.gcov.html#34">bitmap_tst_bit</a></td>
+ <td class="coverFnHi">2186</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/bitmap.h.gcov.html b/coverage-report/include/bitmap.h.gcov.html
new file mode 100644
index 0000000..42d6e06
--- /dev/null
+++ b/coverage-report/include/bitmap.h.gcov.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/bitmap.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - bitmap.h<span style="font-size: 80%;"> (source / <a href="bitmap.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2016-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __BITMAP_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __BITMAP_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : typedef unsigned long bitmap_elem_t;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : typedef bitmap_elem_t bitmap_t[];</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define BITMAP_ELSZ (sizeof(bitmap_elem_t) &lt;&lt; 3)</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : /* Number of elements for _n bits (rounded up) */</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define BITMAP_ELEMS(_n) (((_n) + (BITMAP_ELSZ - 1)) / BITMAP_ELSZ)</a>
+<a name="17"><span class="lineNum"> 17 </span> : : /* Number of bytes for _n bits (rounded up) */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define BITMAP_BYTES(_n) (BITMAP_ELEMS(_n) * sizeof(bitmap_elem_t))</a>
+<a name="19"><span class="lineNum"> 19 </span> : : /* Bit number within an elemnt for bit _n */</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define BITMAP_BIT(_n) ((_n) &amp; (BITMAP_ELSZ - 1))</a>
+<a name="21"><span class="lineNum"> 21 </span> : : /* Corresponding mask */</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define BITMAP_MASK(_n) (1ul &lt;&lt; BITMAP_BIT(_n))</a>
+<a name="23"><span class="lineNum"> 23 </span> : : /* Element number for bit _n */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define BITMAP_ELEM(_n) ((_n) / BITMAP_ELSZ)</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 35 : static inline void bitmap_set_bit(bitmap_t map, unsigned int bit)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 35 : map[BITMAP_ELEM(bit)] |= BITMAP_MASK(bit);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 35 : }</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 29 : static inline void bitmap_clr_bit(bitmap_t map, unsigned int bit)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : {</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 29 : map[BITMAP_ELEM(bit)] &amp;= ~BITMAP_MASK(bit);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 29 : }</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 2186 : static inline bool bitmap_tst_bit(bitmap_t map, unsigned int bit)</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : {</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 2186 : return map[BITMAP_ELEM(bit)] &amp; BITMAP_MASK(bit);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : }</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : extern int bitmap_find_zero_bit(bitmap_t map, unsigned int start,</a>
+<a name="42"><span class="lineNum"> 42 </span> : : unsigned int count);</a>
+<a name="43"><span class="lineNum"> 43 </span> : : extern int bitmap_find_one_bit(bitmap_t map, unsigned int start,</a>
+<a name="44"><span class="lineNum"> 44 </span> : : unsigned int count);</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define bitmap_for_each_zero(map, size, bit) \</a>
+<a name="47"><span class="lineNum"> 47 </span> : : for (bit = bitmap_find_zero_bit(map, 0, size); \</a>
+<a name="48"><span class="lineNum"> 48 </span> : : bit &gt;= 0; \</a>
+<a name="49"><span class="lineNum"> 49 </span> : : bit = bitmap_find_zero_bit(map, (bit) + 1, (size) - (bit) - 1))</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> : : #define bitmap_for_each_one(map, size, bit) \</a>
+<a name="52"><span class="lineNum"> 52 </span> : : for (bit = bitmap_find_one_bit(map, 0, size); \</a>
+<a name="53"><span class="lineNum"> 53 </span> : : bit &gt;= 0; \</a>
+<a name="54"><span class="lineNum"> 54 </span> : : bit = bitmap_find_one_bit(map, (bit) + 1, (size) - (bit) - 1))</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : #endif /* __BITMAP_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/chip.h.func-sort-c.html b/coverage-report/include/chip.h.func-sort-c.html
new file mode 100644
index 0000000..63f091e
--- /dev/null
+++ b/coverage-report/include/chip.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/chip.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - chip.h<span style="font-size: 80%;"> (<a href="chip.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="chip.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.h.gcov.html#142">chip_quirk</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/chip.h.func.html b/coverage-report/include/chip.h.func.html
new file mode 100644
index 0000000..d0a23d2
--- /dev/null
+++ b/coverage-report/include/chip.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/chip.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - chip.h<span style="font-size: 80%;"> (<a href="chip.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="chip.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="chip.h.gcov.html#142">chip_quirk</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/chip.h.gcov.html b/coverage-report/include/chip.h.gcov.html
new file mode 100644
index 0000000..9992e72
--- /dev/null
+++ b/coverage-report/include/chip.h.gcov.html
@@ -0,0 +1,365 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/chip.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - chip.h<span style="font-size: 80%;"> (source / <a href="chip.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __CHIP_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __CHIP_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;lock.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : /*</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * Note on chip IDs:</a>
+<a name="14"><span class="lineNum"> 14 </span> : : *</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * We carry a &quot;chip_id&quot; around, in the cpu_thread, but also as</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * ibm,chip-id properties.</a>
+<a name="17"><span class="lineNum"> 17 </span> : : *</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * This ID is the HW fabric ID of a chip based on the XSCOM numbering,</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * also known as &quot;GCID&quot; (Global Chip ID).</a>
+<a name="20"><span class="lineNum"> 20 </span> : : *</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * The format of this number is different between chip generations and care must</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * be taken when trying to convert between this chip ID and some other</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * representation such as PIR values, interrupt-server numbers etc... :</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : */</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /*</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * P8 GCID</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * -------</a>
+<a name="30"><span class="lineNum"> 30 </span> : : *</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * Global chip ID is a 6 bit number:</a>
+<a name="32"><span class="lineNum"> 32 </span> : : *</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * NodeID ChipID</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * | | |</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * |___|___|___|___|___|___|</a>
+<a name="36"><span class="lineNum"> 36 </span> : : *</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * The the ChipID is 3 bits long, the GCID is the same as the high bits of PIR</a>
+<a name="38"><span class="lineNum"> 38 </span> : : */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define P8_PIR2GCID(pir) (((pir) &gt;&gt; 7) &amp; 0x3f)</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define P8_PIR2COREID(pir) (((pir) &gt;&gt; 3) &amp; 0xf)</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : #define P8_PIR2THREADID(pir) ((pir) &amp; 0x7)</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : /*</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * P9 GCID</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * -------</a>
+<a name="48"><span class="lineNum"> 48 </span> : : *</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * Global chip ID is a 7 bit number:</a>
+<a name="50"><span class="lineNum"> 50 </span> : : *</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * NodeID ChipID</a>
+<a name="52"><span class="lineNum"> 52 </span> : : * | | |</a>
+<a name="53"><span class="lineNum"> 53 </span> : : * |___|___|___|___|___|___|___|</a>
+<a name="54"><span class="lineNum"> 54 </span> : : *</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * Bit 56 is unused according to the manual by we add it to the coreid here,</a>
+<a name="56"><span class="lineNum"> 56 </span> : : * thus we have a 6-bit core number.</a>
+<a name="57"><span class="lineNum"> 57 </span> : : *</a>
+<a name="58"><span class="lineNum"> 58 </span> : : * Note: XIVE Only supports 4-bit chip numbers ...</a>
+<a name="59"><span class="lineNum"> 59 </span> : : *</a>
+<a name="60"><span class="lineNum"> 60 </span> : : * Upper PIR Bits</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * --------------</a>
+<a name="62"><span class="lineNum"> 62 </span> : : *</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * Normal-Core Mode:</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * 57:61 CoreID</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * 62:63 ThreadID</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * Fused-Core Mode:</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * 57:59 FusedQuadID</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * 60 FusedCoreID</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * 61:63 FusedThreadID</a>
+<a name="71"><span class="lineNum"> 71 </span> : : *</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * FusedCoreID 0 contains normal-core chiplet 0 and 1</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * FusedCoreID 1 contains normal-core chiplet 2 and 3</a>
+<a name="74"><span class="lineNum"> 74 </span> : : *</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * Fused cores have interleaved threads:</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * core chiplet 0/2 = t0, t2, t4, t6</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * core chiplet 1/3 = t1, t3, t5, t7</a>
+<a name="78"><span class="lineNum"> 78 </span> : : *</a>
+<a name="79"><span class="lineNum"> 79 </span> : : */</a>
+<a name="80"><span class="lineNum"> 80 </span> : : #define P9_PIR2GCID(pir) (((pir) &gt;&gt; 8) &amp; 0x7f)</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : #define P9_PIR2COREID(pir) (((pir) &gt;&gt; 2) &amp; 0x3f)</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : #define P9_PIR2THREADID(pir) ((pir) &amp; 0x3)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : #define P9_GCID2NODEID(gcid) (((gcid) &gt;&gt; 3) &amp; 0xf)</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : #define P9_GCID2CHIPID(gcid) ((gcid) &amp; 0x7)</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : #define P9_PIR2FUSEDQUADID(pir) (((pir) &gt;&gt; 4) &amp; 0x7)</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : #define P9_PIR2FUSEDCOREID(pir) (((pir) &gt;&gt; 3) &amp; 0x1)</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : #define P9_PIR2FUSEDTHREADID(pir) ((pir) &amp; 0x7)</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : #define P9_PIRFUSED2NORMALCOREID(pir) \</a>
+<a name="97"><span class="lineNum"> 97 </span> : : (P9_PIR2FUSEDQUADID(pir) &lt;&lt; 2) | \</a>
+<a name="98"><span class="lineNum"> 98 </span> : : (P9_PIR2FUSEDCOREID(pir) &lt;&lt; 1) | \</a>
+<a name="99"><span class="lineNum"> 99 </span> : : (P9_PIR2FUSEDTHREADID(pir) &amp; 1)</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : #define P9_PIRFUSED2NORMALTHREADID(pir) (((pir) &gt;&gt; 1) &amp; 0x3)</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : /* P9 specific ones mostly used by XIVE */</a>
+<a name="104"><span class="lineNum"> 104 </span> : : #define P9_PIR2LOCALCPU(pir) ((pir) &amp; 0xff)</a>
+<a name="105"><span class="lineNum"> 105 </span> : : #define P9_PIRFROMLOCALCPU(chip, cpu) (((chip) &lt;&lt; 8) | (cpu))</a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> : : struct dt_node;</a>
+<a name="109"><span class="lineNum"> 109 </span> : : struct centaur_chip;</a>
+<a name="110"><span class="lineNum"> 110 </span> : : struct mfsi;</a>
+<a name="111"><span class="lineNum"> 111 </span> : : struct xive;</a>
+<a name="112"><span class="lineNum"> 112 </span> : : struct lpcm;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : struct vas;</a>
+<a name="114"><span class="lineNum"> 114 </span> : : struct p9_sbe;</a>
+<a name="115"><span class="lineNum"> 115 </span> : : struct p9_dio;</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : /* Chip type */</a>
+<a name="118"><span class="lineNum"> 118 </span> : : enum proc_chip_type {</a>
+<a name="119"><span class="lineNum"> 119 </span> : : PROC_CHIP_UNKNOWN,</a>
+<a name="120"><span class="lineNum"> 120 </span> : : PROC_CHIP_P8_MURANO,</a>
+<a name="121"><span class="lineNum"> 121 </span> : : PROC_CHIP_P8_VENICE,</a>
+<a name="122"><span class="lineNum"> 122 </span> : : PROC_CHIP_P8_NAPLES,</a>
+<a name="123"><span class="lineNum"> 123 </span> : : PROC_CHIP_P9_NIMBUS,</a>
+<a name="124"><span class="lineNum"> 124 </span> : : PROC_CHIP_P9_CUMULUS,</a>
+<a name="125"><span class="lineNum"> 125 </span> : : PROC_CHIP_P9P,</a>
+<a name="126"><span class="lineNum"> 126 </span> : : };</a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* Simulator quirks */</a>
+<a name="129"><span class="lineNum"> 129 </span> : : enum proc_chip_quirks {</a>
+<a name="130"><span class="lineNum"> 130 </span> : : QUIRK_NO_CHIPTOD = 0x00000001,</a>
+<a name="131"><span class="lineNum"> 131 </span> : : QUIRK_MAMBO_CALLOUTS = 0x00000002,</a>
+<a name="132"><span class="lineNum"> 132 </span> : : QUIRK_NO_F000F = 0x00000004,</a>
+<a name="133"><span class="lineNum"> 133 </span> : : QUIRK_NO_PBA = 0x00000008,</a>
+<a name="134"><span class="lineNum"> 134 </span> : : QUIRK_NO_OCC_IRQ = 0x00000010,</a>
+<a name="135"><span class="lineNum"> 135 </span> : : QUIRK_SIMICS = 0x00000020,</a>
+<a name="136"><span class="lineNum"> 136 </span> : : QUIRK_SLOW_SIM = 0x00000040,</a>
+<a name="137"><span class="lineNum"> 137 </span> : : QUIRK_NO_DIRECT_CTL = 0x00000080,</a>
+<a name="138"><span class="lineNum"> 138 </span> : : QUIRK_NO_RNG = 0x00000100,</a>
+<a name="139"><span class="lineNum"> 139 </span> : : QUIRK_QEMU = 0x00000200,</a>
+<a name="140"><span class="lineNum"> 140 </span> : : };</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> : : extern enum proc_chip_quirks proc_chip_quirks;</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 38 : static inline bool chip_quirk(unsigned int q)</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : {</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 38 : return !!(proc_chip_quirks &amp; q);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : }</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> : : #define MAX_CHIPS (1 &lt;&lt; 6) /* 6-bit chip ID */</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /*</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * For each chip in the system, we maintain this structure</a>
+<a name="153"><span class="lineNum"> 153 </span> : : *</a>
+<a name="154"><span class="lineNum"> 154 </span> : : * This contains fields used by different modules including</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * modules in hw/ but is handy to keep per-chip data</a>
+<a name="156"><span class="lineNum"> 156 </span> : : */</a>
+<a name="157"><span class="lineNum"> 157 </span> : : struct proc_chip {</a>
+<a name="158"><span class="lineNum"> 158 </span> : : uint32_t id; /* HW Chip ID (GCID) */</a>
+<a name="159"><span class="lineNum"> 159 </span> : : struct dt_node *devnode; /* &quot;xscom&quot; chip node */</a>
+<a name="160"><span class="lineNum"> 160 </span> : : </a>
+<a name="161"><span class="lineNum"> 161 </span> : : /* These are only initialized after xcom_init */</a>
+<a name="162"><span class="lineNum"> 162 </span> : : enum proc_chip_type type;</a>
+<a name="163"><span class="lineNum"> 163 </span> : : uint32_t ec_level; /* 0xMm (DD1.0 = 0x10) */</a>
+<a name="164"><span class="lineNum"> 164 </span> : : uint8_t ec_rev; /* sub-revision */</a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> : : /* Those two values are only populated on machines with an FSP</a>
+<a name="167"><span class="lineNum"> 167 </span> : : * dbob_id = Drawer/Block/Octant/Blade (DBOBID)</a>
+<a name="168"><span class="lineNum"> 168 </span> : : * pcid = HDAT processor_chip_id</a>
+<a name="169"><span class="lineNum"> 169 </span> : : */</a>
+<a name="170"><span class="lineNum"> 170 </span> : : uint32_t dbob_id;</a>
+<a name="171"><span class="lineNum"> 171 </span> : : uint32_t pcid;</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> : : /* If we expect to have an OCC (i.e. P8) and it is functional,</a>
+<a name="174"><span class="lineNum"> 174 </span> : : * set TRUE. If something has told us it is not, set FALSE and</a>
+<a name="175"><span class="lineNum"> 175 </span> : : * we can not wait for OCCs to init. This is only going to be</a>
+<a name="176"><span class="lineNum"> 176 </span> : : * FALSE in a simulator that doesn't simulate OCCs. */</a>
+<a name="177"><span class="lineNum"> 177 </span> : : bool occ_functional;</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> : : /* Used by hw/xscom.c */</a>
+<a name="180"><span class="lineNum"> 180 </span> : : uint64_t xscom_base;</a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> : : /* Used by hw/lpc.c */</a>
+<a name="183"><span class="lineNum"> 183 </span> : : struct lpcm *lpc;</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> : : /* Used by hw/slw.c */</a>
+<a name="186"><span class="lineNum"> 186 </span> : : uint64_t slw_base;</a>
+<a name="187"><span class="lineNum"> 187 </span> : : uint64_t slw_bar_size;</a>
+<a name="188"><span class="lineNum"> 188 </span> : : uint64_t slw_image_size;</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> : : /* Used by hw/homer.c */</a>
+<a name="191"><span class="lineNum"> 191 </span> : : uint64_t homer_base;</a>
+<a name="192"><span class="lineNum"> 192 </span> : : uint64_t homer_size;</a>
+<a name="193"><span class="lineNum"> 193 </span> : : uint64_t occ_common_base;</a>
+<a name="194"><span class="lineNum"> 194 </span> : : uint64_t occ_common_size;</a>
+<a name="195"><span class="lineNum"> 195 </span> : : uint8_t throttle;</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> : : /* Must hold capi_lock to change */</a>
+<a name="198"><span class="lineNum"> 198 </span> : : uint8_t capp_phb3_attached_mask;</a>
+<a name="199"><span class="lineNum"> 199 </span> : : uint8_t capp_ucode_loaded;</a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* Used by hw/centaur.c */</a>
+<a name="202"><span class="lineNum"> 202 </span> : : struct centaur_chip *centaurs;</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> : : /* Used by hw/p8-i2c.c */</a>
+<a name="205"><span class="lineNum"> 205 </span> : : struct list_head i2cms;</a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> : : /* Used by hw/psi.c */</a>
+<a name="208"><span class="lineNum"> 208 </span> : : struct psi *psi;</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> : : /* Used by hw/fsi-master.c */</a>
+<a name="211"><span class="lineNum"> 211 </span> : : struct mfsi *fsi_masters;</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /* Used by hw/xive.c */</a>
+<a name="214"><span class="lineNum"> 214 </span> : : struct xive *xive;</a>
+<a name="215"><span class="lineNum"> 215 </span> : : </a>
+<a name="216"><span class="lineNum"> 216 </span> : : struct vas *vas;</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* Used by hw/nx-compress.c */</a>
+<a name="219"><span class="lineNum"> 219 </span> : : uint64_t nx_base;</a>
+<a name="220"><span class="lineNum"> 220 </span> : : /* location code of this chip */</a>
+<a name="221"><span class="lineNum"> 221 </span> : : const uint8_t *loc_code;</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> : : /* Used by hw/sbe-p9.c */</a>
+<a name="224"><span class="lineNum"> 224 </span> : : struct p9_sbe *sbe;</a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> : : /* Used by hw/dio-p9.c */</a>
+<a name="227"><span class="lineNum"> 227 </span> : : struct p9_dio *dio;</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /* Used during OCC init */</a>
+<a name="230"><span class="lineNum"> 230 </span> : : bool ex_present;</a>
+<a name="231"><span class="lineNum"> 231 </span> : : };</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> : : extern uint32_t pir_to_chip_id(uint32_t pir);</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> : : /*</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * Note: In P9 fused-core mode, these will return the &quot;normal&quot;</a>
+<a name="237"><span class="lineNum"> 237 </span> : : * core ID and thread ID (ie, thread ID 0..3)</a>
+<a name="238"><span class="lineNum"> 238 </span> : : */</a>
+<a name="239"><span class="lineNum"> 239 </span> : : extern uint32_t pir_to_core_id(uint32_t pir);</a>
+<a name="240"><span class="lineNum"> 240 </span> : : extern uint32_t pir_to_thread_id(uint32_t pir);</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* In P9 fused core mode, this is the &quot;fused&quot; core ID, in</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * normal core mode or P8, this is the same as pir_to_core_id</a>
+<a name="244"><span class="lineNum"> 244 </span> : : */</a>
+<a name="245"><span class="lineNum"> 245 </span> : : extern uint32_t pir_to_fused_core_id(uint32_t pir);</a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> : : extern struct proc_chip *next_chip(struct proc_chip *chip);</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> : : #define for_each_chip(__c) for (__c=next_chip(NULL); __c; __c=next_chip(__c))</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> : : extern struct proc_chip *get_chip(uint32_t chip_id);</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> : : extern void init_chips(void);</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /* helper to get number of chips in the system */</a>
+<a name="256"><span class="lineNum"> 256 </span> : : static inline int nr_chips(void)</a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> : : struct proc_chip *chip;</a>
+<a name="259"><span class="lineNum"> 259 </span> : : int nr_chips = 0;</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> : : for_each_chip(chip)</a>
+<a name="262"><span class="lineNum"> 262 </span> : : nr_chips++;</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : return nr_chips;</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : /* helper to get location code of a chip */</a>
+<a name="268"><span class="lineNum"> 268 </span> : : static inline const char *chip_loc_code(uint32_t chip_id)</a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> : : struct proc_chip *chip;</a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> : : chip = get_chip(chip_id);</a>
+<a name="273"><span class="lineNum"> 273 </span> : : if (!chip)</a>
+<a name="274"><span class="lineNum"> 274 </span> : : return NULL;</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : return chip-&gt;loc_code;</a>
+<a name="277"><span class="lineNum"> 277 </span> : : }</a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> : : #endif /* __CHIP_H */</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/compiler.h.func-sort-c.html b/coverage-report/include/compiler.h.func-sort-c.html
new file mode 100644
index 0000000..247c9e8
--- /dev/null
+++ b/coverage-report/include/compiler.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/compiler.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - compiler.h<span style="font-size: 80%;"> (<a href="compiler.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="compiler.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="compiler.h.gcov.html#28">barrier</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/compiler.h.func.html b/coverage-report/include/compiler.h.func.html
new file mode 100644
index 0000000..73d2711
--- /dev/null
+++ b/coverage-report/include/compiler.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/compiler.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - compiler.h<span style="font-size: 80%;"> (<a href="compiler.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="compiler.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="compiler.h.gcov.html#28">barrier</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/compiler.h.gcov.html b/coverage-report/include/compiler.h.gcov.html
new file mode 100644
index 0000000..461935a
--- /dev/null
+++ b/coverage-report/include/compiler.h.gcov.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/compiler.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - compiler.h<span style="font-size: 80%;"> (source / <a href="compiler.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __COMPILER_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __COMPILER_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #ifndef __ASSEMBLY__</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : /* Macros for various compiler bits and pieces */</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define __packed __attribute__((packed))</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define __align(x) __attribute__((__aligned__(x)))</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define __unused __attribute__((unused))</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define __used __attribute__((used))</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define __section(x) __attribute__((__section__(x)))</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define __noreturn __attribute__((noreturn))</a>
+<a name="18"><span class="lineNum"> 18 </span> : : /* not __const as this has a different meaning (const) */</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define __attrconst __attribute__((const))</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define __warn_unused_result __attribute__((warn_unused_result))</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define __noinline __attribute__((noinline))</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : #if 0 /* Provided by gcc stddef.h */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define offsetof(type,m) __builtin_offsetof(type,m)</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #endif</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define __nomcount __attribute__((no_instrument_function))</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Compiler barrier */</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : static inline void barrier(void)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : {</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : asm volatile(&quot;&quot; : : : &quot;memory&quot;);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : #endif /* __ASSEMBLY__ */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : /* Stringification macro */</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define __tostr(x) #x</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define tostr(x) __tostr(x)</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : #endif /* __COMPILER_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/device.h.func-sort-c.html b/coverage-report/include/device.h.func-sort-c.html
new file mode 100644
index 0000000..3ecce1c
--- /dev/null
+++ b/coverage-report/include/device.h.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/device.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - device.h<span style="font-size: 80%;"> (<a href="device.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="device.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#50">get_last_phandle</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#55">set_last_phandle</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#116">dt_add_property_u64</a></td>
+ <td class="coverFnHi">47</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#60">new_phandle</a></td>
+ <td class="coverFnHi">892</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/device.h.func.html b/coverage-report/include/device.h.func.html
new file mode 100644
index 0000000..942148a
--- /dev/null
+++ b/coverage-report/include/device.h.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/device.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - device.h<span style="font-size: 80%;"> (<a href="device.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="device.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#116">dt_add_property_u64</a></td>
+ <td class="coverFnHi">47</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#50">get_last_phandle</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#60">new_phandle</a></td>
+ <td class="coverFnHi">892</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="device.h.gcov.html#55">set_last_phandle</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/device.h.gcov.html b/coverage-report/include/device.h.gcov.html
new file mode 100644
index 0000000..f79adcc
--- /dev/null
+++ b/coverage-report/include/device.h.gcov.html
@@ -0,0 +1,353 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/device.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - device.h<span style="font-size: 80%;"> (source / <a href="device.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __DEVICE_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __DEVICE_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;ccan/short_types/short_types.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : /* Any property or node with this prefix will not be passed to the kernel. */</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define DT_PRIVATE &quot;skiboot,&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : /*</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * An in-memory representation of a node in the device tree.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : *</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * This is trivially flattened into an fdt.</a>
+<a name="17"><span class="lineNum"> 17 </span> : : *</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * Note that the add_* routines will make a copy of the name if it's not</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * a read-only string (ie. usually a string literal).</a>
+<a name="20"><span class="lineNum"> 20 </span> : : */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : struct dt_property {</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct list_node list;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : const char *name;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : size_t len;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : char prop[/* len */];</a>
+<a name="26"><span class="lineNum"> 26 </span> : : };</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : struct dt_node {</a>
+<a name="29"><span class="lineNum"> 29 </span> : : const char *name;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : struct list_node list;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : struct list_head properties;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : struct list_head children;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : struct dt_node *parent;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : u32 phandle;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : };</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : /* This is shared with device_tree.c .. make it static when</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * the latter is gone (hopefully soon)</a>
+<a name="39"><span class="lineNum"> 39 </span> : : */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : extern u32 last_phandle;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : extern struct dt_node *dt_root;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : extern struct dt_node *dt_chosen;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : /* Create a root node: ie. a parentless one. */</a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct dt_node *dt_new_root(const char *name);</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : /* Graft a root node into this tree. */</a>
+<a name="49"><span class="lineNum"> 49 </span> : : bool dt_attach_root(struct dt_node *parent, struct dt_node *root);</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> : : /* Wrappers for last_phandle operations */</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 2 : static inline u32 get_last_phandle(void)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 2 : return last_phandle;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 7 : static inline void set_last_phandle(u32 phandle)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 7 : last_phandle = phandle;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 7 : }</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 892 : static inline u32 new_phandle(void)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : {</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 892 : return ++last_phandle;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : /* Add a child node. */</a>
+<a name="68"><span class="lineNum"> 68 </span> : : struct dt_node *dt_new(struct dt_node *parent, const char *name);</a>
+<a name="69"><span class="lineNum"> 69 </span> : : struct dt_node *dt_new_addr(struct dt_node *parent, const char *name,</a>
+<a name="70"><span class="lineNum"> 70 </span> : : uint64_t unit_addr);</a>
+<a name="71"><span class="lineNum"> 71 </span> : : struct dt_node *dt_new_2addr(struct dt_node *parent, const char *name,</a>
+<a name="72"><span class="lineNum"> 72 </span> : : uint64_t unit_addr0, uint64_t unit_addr1);</a>
+<a name="73"><span class="lineNum"> 73 </span> : : struct dt_node *dt_new_check(struct dt_node *parent, const char *name);</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /* Copy node to new parent, including properties and subnodes */</a>
+<a name="76"><span class="lineNum"> 76 </span> : : struct dt_node *dt_copy(struct dt_node *node, struct dt_node *parent);</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* Add a property node, various forms. */</a>
+<a name="79"><span class="lineNum"> 79 </span> : : struct dt_property *dt_add_property(struct dt_node *node,</a>
+<a name="80"><span class="lineNum"> 80 </span> : : const char *name,</a>
+<a name="81"><span class="lineNum"> 81 </span> : : const void *val, size_t size);</a>
+<a name="82"><span class="lineNum"> 82 </span> : : struct dt_property *dt_add_property_string(struct dt_node *node,</a>
+<a name="83"><span class="lineNum"> 83 </span> : : const char *name,</a>
+<a name="84"><span class="lineNum"> 84 </span> : : const char *value);</a>
+<a name="85"><span class="lineNum"> 85 </span> : : struct dt_property *dt_add_property_nstr(struct dt_node *node,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : const char *name,</a>
+<a name="87"><span class="lineNum"> 87 </span> : : const char *value, unsigned int vlen);</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* Given out enough GCC extensions, we will achieve enlightenment! */</a>
+<a name="90"><span class="lineNum"> 90 </span> : : #define dt_add_property_strings(node, name, ...) \</a>
+<a name="91"><span class="lineNum"> 91 </span> : : __dt_add_property_strings((node), ((name)), \</a>
+<a name="92"><span class="lineNum"> 92 </span> : : sizeof((const char *[]) { __VA_ARGS__ })/sizeof(const char *), \</a>
+<a name="93"><span class="lineNum"> 93 </span> : : __VA_ARGS__)</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : struct dt_property *__dt_add_property_strings(struct dt_node *node,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : const char *name,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : int count, ...);</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /* Given out enough GCC extensions, we will achieve enlightenment! */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : #define dt_add_property_cells(node, name, ...) \</a>
+<a name="101"><span class="lineNum"> 101 </span> : : __dt_add_property_cells((node), ((name)), \</a>
+<a name="102"><span class="lineNum"> 102 </span> : : sizeof((u32[]) { __VA_ARGS__ })/sizeof(u32), \</a>
+<a name="103"><span class="lineNum"> 103 </span> : : __VA_ARGS__)</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> : : struct dt_property *__dt_add_property_cells(struct dt_node *node,</a>
+<a name="106"><span class="lineNum"> 106 </span> : : const char *name,</a>
+<a name="107"><span class="lineNum"> 107 </span> : : int count, ...);</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> : : #define dt_add_property_u64s(node, name, ...) \</a>
+<a name="110"><span class="lineNum"> 110 </span> : : __dt_add_property_u64s((node), ((name)), \</a>
+<a name="111"><span class="lineNum"> 111 </span> : : sizeof((u64[]) { __VA_ARGS__ })/sizeof(u64), \</a>
+<a name="112"><span class="lineNum"> 112 </span> : : __VA_ARGS__)</a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : struct dt_property *__dt_add_property_u64s(struct dt_node *node,</a>
+<a name="115"><span class="lineNum"> 115 </span> : : const char *name,</a>
+<a name="116"><span class="lineNum"> 116 </span> : : int count, ...);</a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 47 : static inline struct dt_property *dt_add_property_u64(struct dt_node *node,</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : const char *name, u64 val)</a>
+<a name="120"><span class="lineNum"> 120 </span> : : {</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 47 : return dt_add_property_cells(node, name, (u32)(val &gt;&gt; 32),</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : (u32)(val &amp; 0xffffffffUL));</a>
+<a name="123"><span class="lineNum"> 123 </span> : : }</a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> : : void dt_del_property(struct dt_node *node, struct dt_property *prop);</a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> : : void dt_check_del_prop(struct dt_node *node, const char *name);</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> : : /* Warning: moves *prop! */</a>
+<a name="130"><span class="lineNum"> 130 </span> : : void dt_resize_property(struct dt_property **prop, size_t len);</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : void dt_property_set_cell(struct dt_property *prop, u32 index, u32 val);</a>
+<a name="133"><span class="lineNum"> 133 </span> : : u32 dt_property_get_cell(const struct dt_property *prop, u32 index);</a>
+<a name="134"><span class="lineNum"> 134 </span> : : u64 dt_property_get_u64(const struct dt_property *prop, u32 index);</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /* First child of this node. */</a>
+<a name="137"><span class="lineNum"> 137 </span> : : struct dt_node *dt_first(const struct dt_node *root);</a>
+<a name="138"><span class="lineNum"> 138 </span> : : </a>
+<a name="139"><span class="lineNum"> 139 </span> : : /* Return next node, or NULL. */</a>
+<a name="140"><span class="lineNum"> 140 </span> : : struct dt_node *dt_next(const struct dt_node *root, const struct dt_node *prev);</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> : : /* Iterate nodes */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #define dt_for_each_node(root, node) \</a>
+<a name="144"><span class="lineNum"> 144 </span> : : for (node = dt_first(root); node; node = dt_next(root, node))</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> : : #define dt_for_each_child(parent, node) \</a>
+<a name="147"><span class="lineNum"> 147 </span> : : list_for_each(&amp;parent-&gt;children, node, list)</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> : : /* Find a string in a string list */</a>
+<a name="150"><span class="lineNum"> 150 </span> : : bool dt_prop_find_string(const struct dt_property *p, const char *s);</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> : : /* Check a compatible property */</a>
+<a name="153"><span class="lineNum"> 153 </span> : : bool dt_node_is_compatible(const struct dt_node *node, const char *compat);</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> : : /* Find a node based on compatible property */</a>
+<a name="156"><span class="lineNum"> 156 </span> : : struct dt_node *dt_find_compatible_node(struct dt_node *root,</a>
+<a name="157"><span class="lineNum"> 157 </span> : : struct dt_node *prev,</a>
+<a name="158"><span class="lineNum"> 158 </span> : : const char *compat);</a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : #define dt_for_each_compatible(root, node, compat) \</a>
+<a name="161"><span class="lineNum"> 161 </span> : : for (node = NULL; \</a>
+<a name="162"><span class="lineNum"> 162 </span> : : (node = dt_find_compatible_node(root, node, compat)) != NULL;)</a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> : : struct dt_node *dt_find_compatible_node_on_chip(struct dt_node *root,</a>
+<a name="165"><span class="lineNum"> 165 </span> : : struct dt_node *prev,</a>
+<a name="166"><span class="lineNum"> 166 </span> : : const char *compat,</a>
+<a name="167"><span class="lineNum"> 167 </span> : : uint32_t chip_id);</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : #define dt_for_each_compatible_on_chip(root, node, compat, chip_id) \</a>
+<a name="170"><span class="lineNum"> 170 </span> : : for (node = NULL; \</a>
+<a name="171"><span class="lineNum"> 171 </span> : : (node = dt_find_compatible_node_on_chip(root, node,\</a>
+<a name="172"><span class="lineNum"> 172 </span> : : compat, chip_id)) != NULL;)</a>
+<a name="173"><span class="lineNum"> 173 </span> : : /* Check status property */</a>
+<a name="174"><span class="lineNum"> 174 </span> : : bool dt_node_is_enabled(struct dt_node *node);</a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> : : /* Build the full path for a node. Return a new block of memory, caller</a>
+<a name="177"><span class="lineNum"> 177 </span> : : * shall free() it</a>
+<a name="178"><span class="lineNum"> 178 </span> : : */</a>
+<a name="179"><span class="lineNum"> 179 </span> : : char *dt_get_path(const struct dt_node *node);</a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> : : /* Find a node by path */</a>
+<a name="182"><span class="lineNum"> 182 </span> : : struct dt_node *dt_find_by_path(struct dt_node *root, const char *path);</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : /* Find a child node by name */</a>
+<a name="185"><span class="lineNum"> 185 </span> : : struct dt_node *dt_find_by_name(struct dt_node *root, const char *name);</a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> : : /* Find a node by phandle */</a>
+<a name="188"><span class="lineNum"> 188 </span> : : struct dt_node *dt_find_by_phandle(struct dt_node *root, u32 phandle);</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> : : /* Find a property by name. */</a>
+<a name="191"><span class="lineNum"> 191 </span> : : const struct dt_property *dt_find_property(const struct dt_node *node,\</a>
+<a name="192"><span class="lineNum"> 192 </span> : : const char *name);</a>
+<a name="193"><span class="lineNum"> 193 </span> : : const struct dt_property *dt_require_property(const struct dt_node *node,</a>
+<a name="194"><span class="lineNum"> 194 </span> : : const char *name, int wanted_len);</a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> : : /* non-const variant */</a>
+<a name="197"><span class="lineNum"> 197 </span> : : struct dt_property *__dt_find_property(struct dt_node *node, const char *name);</a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> : : /* Find a property by name, check if it's the same as val. */</a>
+<a name="200"><span class="lineNum"> 200 </span> : : bool dt_has_node_property(const struct dt_node *node,</a>
+<a name="201"><span class="lineNum"> 201 </span> : : const char *name, const char *val);</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : /* Free a node (and any children). */</a>
+<a name="204"><span class="lineNum"> 204 </span> : : void dt_free(struct dt_node *node);</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> : : /* Parse an initial fdt */</a>
+<a name="207"><span class="lineNum"> 207 </span> : : void dt_expand(const void *fdt);</a>
+<a name="208"><span class="lineNum"> 208 </span> : : int dt_expand_node(struct dt_node *node, const void *fdt, int fdt_node) __warn_unused_result;</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> : : /* Simplified accessors */</a>
+<a name="211"><span class="lineNum"> 211 </span> : : u64 dt_prop_get_u64(const struct dt_node *node, const char *prop);</a>
+<a name="212"><span class="lineNum"> 212 </span> : : u64 dt_prop_get_u64_def(const struct dt_node *node, const char *prop, u64 def);</a>
+<a name="213"><span class="lineNum"> 213 </span> : : u32 dt_prop_get_u32(const struct dt_node *node, const char *prop);</a>
+<a name="214"><span class="lineNum"> 214 </span> : : u32 dt_prop_get_u32_def(const struct dt_node *node, const char *prop, u32 def);</a>
+<a name="215"><span class="lineNum"> 215 </span> : : const void *dt_prop_get(const struct dt_node *node, const char *prop);</a>
+<a name="216"><span class="lineNum"> 216 </span> : : const void *dt_prop_get_def(const struct dt_node *node, const char *prop,</a>
+<a name="217"><span class="lineNum"> 217 </span> : : void *def);</a>
+<a name="218"><span class="lineNum"> 218 </span> : : const void *dt_prop_get_def_size(const struct dt_node *node, const char *prop,</a>
+<a name="219"><span class="lineNum"> 219 </span> : : void *def, size_t *len);</a>
+<a name="220"><span class="lineNum"> 220 </span> : : u32 dt_prop_get_cell(const struct dt_node *node, const char *prop, u32 cell);</a>
+<a name="221"><span class="lineNum"> 221 </span> : : u32 dt_prop_get_cell_def(const struct dt_node *node, const char *prop, u32 cell, u32 def);</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> : : /* Parsing helpers */</a>
+<a name="224"><span class="lineNum"> 224 </span> : : u32 dt_n_address_cells(const struct dt_node *node);</a>
+<a name="225"><span class="lineNum"> 225 </span> : : u32 dt_n_size_cells(const struct dt_node *node);</a>
+<a name="226"><span class="lineNum"> 226 </span> : : u64 dt_get_number(const void *pdata, unsigned int cells);</a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> : : /* Find an ibm,chip-id property in this node; if not found, walk up the parent</a>
+<a name="229"><span class="lineNum"> 229 </span> : : * nodes. */</a>
+<a name="230"><span class="lineNum"> 230 </span> : : u32 dt_get_chip_id(const struct dt_node *node);</a>
+<a name="231"><span class="lineNum"> 231 </span> : : </a>
+<a name="232"><span class="lineNum"> 232 </span> : : /* Same as dt_get_chip_id except Returns -1 if no chip-id property exists. */</a>
+<a name="233"><span class="lineNum"> 233 </span> : : u32 __dt_get_chip_id(const struct dt_node *node);</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> : : /* Address accessors (&quot;reg&quot; properties parsing). No translation,</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * only support &quot;simple&quot; address forms (1 or 2 cells). Asserts</a>
+<a name="237"><span class="lineNum"> 237 </span> : : * if address doesn't exist</a>
+<a name="238"><span class="lineNum"> 238 </span> : : */</a>
+<a name="239"><span class="lineNum"> 239 </span> : : u64 dt_get_address(const struct dt_node *node, unsigned int index,</a>
+<a name="240"><span class="lineNum"> 240 </span> : : u64 *out_size);</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* Count &quot;reg&quot; property entries */</a>
+<a name="243"><span class="lineNum"> 243 </span> : : unsigned int dt_count_addresses(const struct dt_node *node);</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /* Address translation</a>
+<a name="246"><span class="lineNum"> 246 </span> : : *</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * WARNING: Current implementation is simplified and will not</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * handle complex address formats with address space indicators</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * nor will it handle &quot;ranges&quot; translations yet... (XX TODO)</a>
+<a name="250"><span class="lineNum"> 250 </span> : : */</a>
+<a name="251"><span class="lineNum"> 251 </span> : : u64 dt_translate_address(const struct dt_node *node, unsigned int index,</a>
+<a name="252"><span class="lineNum"> 252 </span> : : u64 *out_size);</a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> : : /* compare function used to sort child nodes by name when added to the</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * tree. This is mainly here for testing.</a>
+<a name="256"><span class="lineNum"> 256 </span> : : */</a>
+<a name="257"><span class="lineNum"> 257 </span> : : int dt_cmp_subnodes(const struct dt_node *a, const struct dt_node *b);</a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> : : struct dt_node *__dt_find_by_name_addr(struct dt_node *parent, const char *name,</a>
+<a name="260"><span class="lineNum"> 260 </span> : : const char *addr);</a>
+<a name="261"><span class="lineNum"> 261 </span> : : struct dt_node *dt_find_by_name_addr(struct dt_node *parent, const char *name,</a>
+<a name="262"><span class="lineNum"> 262 </span> : : uint64_t addr);</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : /* phandle fixup helper */</a>
+<a name="265"><span class="lineNum"> 265 </span> : : void dt_adjust_subtree_phandle(struct dt_node *subtree,</a>
+<a name="266"><span class="lineNum"> 266 </span> : : const char** (get_properties_to_fix)(struct dt_node *n));</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> : : #endif /* __DEVICE_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/index-sort-b.html b/coverage-report/include/index-sort-b.html
new file mode 100644
index 0000000..cc1ed66
--- /dev/null
+++ b/coverage-report/include/index-sort-b.html
@@ -0,0 +1,227 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - include</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">63</td>
+ <td class="headerCovTableEntry">76</td>
+ <td class="headerCovTableEntryMed">82.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryMed">88.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="compiler.h.gcov.html">compiler.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.h.gcov.html">time-utils.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lock.h.gcov.html">lock.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-internal.h.gcov.html">opal-internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="skiboot.h.gcov.html">skiboot.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.h.gcov.html">chip.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.h.gcov.html">device.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.h.gcov.html">bitmap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="processor.h.gcov.html">processor.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=33 height=10 alt="33.3%"><img src="../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci.h.gcov.html">pci.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timebase.h.gcov.html">timebase.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/index-sort-f.html b/coverage-report/include/index-sort-f.html
new file mode 100644
index 0000000..19a72ef
--- /dev/null
+++ b/coverage-report/include/index-sort-f.html
@@ -0,0 +1,227 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - include</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">63</td>
+ <td class="headerCovTableEntry">76</td>
+ <td class="headerCovTableEntryMed">82.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryMed">88.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="compiler.h.gcov.html">compiler.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci.h.gcov.html">pci.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="processor.h.gcov.html">processor.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=33 height=10 alt="33.3%"><img src="../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lock.h.gcov.html">lock.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-internal.h.gcov.html">opal-internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.h.gcov.html">chip.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="skiboot.h.gcov.html">skiboot.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.h.gcov.html">time-utils.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.h.gcov.html">bitmap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.h.gcov.html">device.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timebase.h.gcov.html">timebase.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/index-sort-l.html b/coverage-report/include/index-sort-l.html
new file mode 100644
index 0000000..410292a
--- /dev/null
+++ b/coverage-report/include/index-sort-l.html
@@ -0,0 +1,227 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - include</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">63</td>
+ <td class="headerCovTableEntry">76</td>
+ <td class="headerCovTableEntryMed">82.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryMed">88.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci.h.gcov.html">pci.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="compiler.h.gcov.html">compiler.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="processor.h.gcov.html">processor.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=33 height=10 alt="33.3%"><img src="../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.h.gcov.html">chip.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lock.h.gcov.html">lock.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="skiboot.h.gcov.html">skiboot.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.h.gcov.html">time-utils.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-internal.h.gcov.html">opal-internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.h.gcov.html">bitmap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.h.gcov.html">device.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timebase.h.gcov.html">timebase.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/index.html b/coverage-report/include/index.html
new file mode 100644
index 0000000..ae64a83
--- /dev/null
+++ b/coverage-report/include/index.html
@@ -0,0 +1,227 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - include</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">63</td>
+ <td class="headerCovTableEntry">76</td>
+ <td class="headerCovTableEntryMed">82.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryMed">88.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="bitmap.h.gcov.html">bitmap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="chip.h.gcov.html">chip.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="compiler.h.gcov.html">compiler.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="device.h.gcov.html">device.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="lock.h.gcov.html">lock.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="opal-internal.h.gcov.html">opal-internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pci.h.gcov.html">pci.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="processor.h.gcov.html">processor.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=33 height=10 alt="33.3%"><img src="../snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="skiboot.h.gcov.html">skiboot.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time-utils.h.gcov.html">time-utils.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="timebase.h.gcov.html">timebase.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/lock.h.func-sort-c.html b/coverage-report/include/lock.h.func-sort-c.html
new file mode 100644
index 0000000..051cd27
--- /dev/null
+++ b/coverage-report/include/lock.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/lock.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - lock.h<span style="font-size: 80%;"> (<a href="lock.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="lock.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lock.h.gcov.html#70">init_lock</a></td>
+ <td class="coverFnHi">159</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/lock.h.func.html b/coverage-report/include/lock.h.func.html
new file mode 100644
index 0000000..4488f15
--- /dev/null
+++ b/coverage-report/include/lock.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/lock.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - lock.h<span style="font-size: 80%;"> (<a href="lock.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="lock.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="lock.h.gcov.html#70">init_lock</a></td>
+ <td class="coverFnHi">159</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/lock.h.gcov.html b/coverage-report/include/lock.h.gcov.html
new file mode 100644
index 0000000..14af695
--- /dev/null
+++ b/coverage-report/include/lock.h.gcov.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/lock.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - lock.h<span style="font-size: 80%;"> (source / <a href="lock.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __LOCK_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __LOCK_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;processor.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;cmpxchg.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #ifdef DEBUG_LOCKS_BACKTRACE</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;stack.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define LOCKS_BACKTRACE_MAX_ENTS 60</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #endif</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct lock {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* Lock value has bit 63 as lock bit and the PIR of the owner</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * in the top 32-bit</a>
+<a name="22"><span class="lineNum"> 22 </span> : : */</a>
+<a name="23"><span class="lineNum"> 23 </span> : : uint64_t lock_val;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : /*</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * Set to true if lock is involved in the console flush path</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * in which case taking it will suspend console flushing</a>
+<a name="28"><span class="lineNum"> 28 </span> : : */</a>
+<a name="29"><span class="lineNum"> 29 </span> : : bool in_con_path;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* file/line of lock owner */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : const char *owner;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #ifdef DEBUG_LOCKS_BACKTRACE</a>
+<a name="35"><span class="lineNum"> 35 </span> : : struct bt_entry bt_buf[LOCKS_BACKTRACE_MAX_ENTS];</a>
+<a name="36"><span class="lineNum"> 36 </span> : : struct bt_metadata bt_metadata;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #endif</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : /* linkage in per-cpu list of owned locks */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : struct list_node list;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : };</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : /* Initializer... not ideal but works for now. If we need different</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * values for the fields and/or start getting warnings we'll have to</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * play macro tricks</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : #define LOCK_UNLOCKED { 0 }</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : /* Note vs. libc and locking:</a>
+<a name="50"><span class="lineNum"> 50 </span> : : *</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * The printf() family of</a>
+<a name="52"><span class="lineNum"> 52 </span> : : * functions use stack based t buffers and call into skiboot</a>
+<a name="53"><span class="lineNum"> 53 </span> : : * underlying read() and write() which use a console lock.</a>
+<a name="54"><span class="lineNum"> 54 </span> : : *</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * The underlying FSP console code will thus operate within that</a>
+<a name="56"><span class="lineNum"> 56 </span> : : * console lock.</a>
+<a name="57"><span class="lineNum"> 57 </span> : : *</a>
+<a name="58"><span class="lineNum"> 58 </span> : : * The libc does *NOT* lock stream buffer operations, so don't</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * try to scanf() from the same FILE from two different processors.</a>
+<a name="60"><span class="lineNum"> 60 </span> : : *</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * FSP operations are locked using an FSP lock, so all processors</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * can safely call the FSP API</a>
+<a name="63"><span class="lineNum"> 63 </span> : : *</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * Note about ordering:</a>
+<a name="65"><span class="lineNum"> 65 </span> : : *</a>
+<a name="66"><span class="lineNum"> 66 </span> : : * lock() is a full memory barrier. unlock() is a lwsync</a>
+<a name="67"><span class="lineNum"> 67 </span> : : *</a>
+<a name="68"><span class="lineNum"> 68 </span> : : */</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : extern bool bust_locks;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 159 : static inline void init_lock(struct lock *l)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : {</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 159 : *l = (struct lock)LOCK_UNLOCKED;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 159 : }</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : #define LOCK_CALLER __FILE__ &quot;:&quot; stringify(__LINE__)</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : #define try_lock(l) try_lock_caller(l, LOCK_CALLER)</a>
+<a name="80"><span class="lineNum"> 80 </span> : : #define lock(l) lock_caller(l, LOCK_CALLER)</a>
+<a name="81"><span class="lineNum"> 81 </span> : : #define lock_recursive(l) lock_recursive_caller(l, LOCK_CALLER)</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : extern bool try_lock_caller(struct lock *l, const char *caller);</a>
+<a name="84"><span class="lineNum"> 84 </span> : : extern void lock_caller(struct lock *l, const char *caller);</a>
+<a name="85"><span class="lineNum"> 85 </span> : : extern void unlock(struct lock *l);</a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> : : extern bool lock_held_by_me(struct lock *l);</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* The debug output can happen while the FSP lock, so we need some kind</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * of recursive lock support here. I don't want all locks to be recursive</a>
+<a name="91"><span class="lineNum"> 91 </span> : : * though, thus the caller need to explicitly call lock_recursive which</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * returns false if the lock was already held by this cpu. If it returns</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * true, then the caller shall release it when done.</a>
+<a name="94"><span class="lineNum"> 94 </span> : : */</a>
+<a name="95"><span class="lineNum"> 95 </span> : : extern bool lock_recursive_caller(struct lock *l, const char *caller);</a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> : : /* Called after per-cpu data structures are available */</a>
+<a name="98"><span class="lineNum"> 98 </span> : : extern void init_locks(void);</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> : : /* Dump the list of locks held by this CPU */</a>
+<a name="101"><span class="lineNum"> 101 </span> : : extern void dump_locks_list(void);</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : /* Clean all locks held by CPU (and warn if any) */</a>
+<a name="104"><span class="lineNum"> 104 </span> : : extern void drop_my_locks(bool warn);</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : #endif /* __LOCK_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/opal-internal.h.func-sort-c.html b/coverage-report/include/opal-internal.h.func-sort-c.html
new file mode 100644
index 0000000..2ea83e9
--- /dev/null
+++ b/coverage-report/include/opal-internal.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/opal-internal.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - opal-internal.h<span style="font-size: 80%;"> (<a href="opal-internal.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="opal-internal.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-internal.h.gcov.html#93">opal_addr_valid</a></td>
+ <td class="coverFnHi">45</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/opal-internal.h.func.html b/coverage-report/include/opal-internal.h.func.html
new file mode 100644
index 0000000..25d9b27
--- /dev/null
+++ b/coverage-report/include/opal-internal.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/opal-internal.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - opal-internal.h<span style="font-size: 80%;"> (<a href="opal-internal.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="opal-internal.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="opal-internal.h.gcov.html#93">opal_addr_valid</a></td>
+ <td class="coverFnHi">45</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/opal-internal.h.gcov.html b/coverage-report/include/opal-internal.h.gcov.html
new file mode 100644
index 0000000..cb1354e
--- /dev/null
+++ b/coverage-report/include/opal-internal.h.gcov.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/opal-internal.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - opal-internal.h<span style="font-size: 80%;"> (source / <a href="opal-internal.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Internal header for OPAL API related things in skiboot</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #ifndef __OPAL_INTERNAL_H</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #define __OPAL_INTERNAL_H</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : /* An opal table entry */</a>
+<a name="15"><span class="lineNum"> 15 </span> : : struct opal_table_entry {</a>
+<a name="16"><span class="lineNum"> 16 </span> : : void *func;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : u32 token;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : u32 nargs;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : };</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #ifdef __CHECKER__</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define __opal_func_test_arg(__func, __nargs) 0</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #else</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define __opal_func_test_arg(__func, __nargs) \</a>
+<a name="25"><span class="lineNum"> 25 </span> : : sizeof(__func( __test_args##__nargs ))</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #endif</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : #define opal_call(__tok, __func, __nargs) \</a>
+<a name="29"><span class="lineNum"> 29 </span> : : static struct opal_table_entry __e_##__func __used __section(&quot;.opal_table&quot;) = \</a>
+<a name="30"><span class="lineNum"> 30 </span> : : { .func = __func, .token = __tok, \</a>
+<a name="31"><span class="lineNum"> 31 </span> : : .nargs = __nargs + 0 * __opal_func_test_arg(__func, __nargs) }</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* Make sure function takes args they claim. Look away now... */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define __test_args0</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #define __test_args1 0</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #define __test_args2 0,0</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define __test_args3 0,0,0</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define __test_args4 0,0,0,0</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define __test_args5 0,0,0,0,0</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #define __test_args6 0,0,0,0,0,0</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define __test_args7 0,0,0,0,0,0,0</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : extern struct opal_table_entry __opal_table_start[];</a>
+<a name="44"><span class="lineNum"> 44 </span> : : extern struct opal_table_entry __opal_table_end[];</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : extern uint64_t opal_pending_events;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : extern struct dt_node *opal_node;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : extern void opal_table_init(void);</a>
+<a name="51"><span class="lineNum"> 51 </span> : : extern void opal_update_pending_evt(uint64_t evt_mask, uint64_t evt_values);</a>
+<a name="52"><span class="lineNum"> 52 </span> : : uint64_t opal_dynamic_event_alloc(void);</a>
+<a name="53"><span class="lineNum"> 53 </span> : : void opal_dynamic_event_free(uint64_t event);</a>
+<a name="54"><span class="lineNum"> 54 </span> : : extern void add_opal_node(void);</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : #define opal_register(token, func, nargs) \</a>
+<a name="57"><span class="lineNum"> 57 </span> : : __opal_register((token) + 0*__opal_func_test_arg(func, nargs), \</a>
+<a name="58"><span class="lineNum"> 58 </span> : : (func), (nargs))</a>
+<a name="59"><span class="lineNum"> 59 </span> : : extern void __opal_register(uint64_t token, void *func, unsigned num_args);</a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : int64_t opal_quiesce(uint32_t shutdown_type, int32_t cpu);</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : /* Warning: no locking at the moment, do at init time only</a>
+<a name="64"><span class="lineNum"> 64 </span> : : *</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * XXX TODO: Add the big RCU-ish &quot;opal API lock&quot; to protect us here</a>
+<a name="66"><span class="lineNum"> 66 </span> : : * which will also be used for other things such as runtime updates</a>
+<a name="67"><span class="lineNum"> 67 </span> : : */</a>
+<a name="68"><span class="lineNum"> 68 </span> : : extern void opal_add_poller(void (*poller)(void *data), void *data);</a>
+<a name="69"><span class="lineNum"> 69 </span> : : extern void opal_del_poller(void (*poller)(void *data));</a>
+<a name="70"><span class="lineNum"> 70 </span> : : extern void opal_run_pollers(void);</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : /*</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * Warning: no locking, only call that from the init processor</a>
+<a name="74"><span class="lineNum"> 74 </span> : : */</a>
+<a name="75"><span class="lineNum"> 75 </span> : : extern void opal_add_host_sync_notifier(bool (*notify)(void *data), void *data);</a>
+<a name="76"><span class="lineNum"> 76 </span> : : extern void opal_del_host_sync_notifier(bool (*notify)(void *data), void *data);</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : /*</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * Opal internal function prototype</a>
+<a name="80"><span class="lineNum"> 80 </span> : : */</a>
+<a name="81"><span class="lineNum"> 81 </span> : : struct OpalHMIEvent;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : extern int occ_msg_queue_occ_reset(void);</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : extern unsigned long top_of_ram;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /*</a>
+<a name="87"><span class="lineNum"> 87 </span> : : * Returns true if the address is valid, false otherwise</a>
+<a name="88"><span class="lineNum"> 88 </span> : : *</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * Checks if the passed address belongs to real address space</a>
+<a name="90"><span class="lineNum"> 90 </span> : : * or 0xc000... kernel address space. It also checks that</a>
+<a name="91"><span class="lineNum"> 91 </span> : : * addr &lt;= total physical memory. The magic value 60 comes</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * from 60 bit real address mentioned in section 5.7 of the</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * Power ISA (Book 3S).</a>
+<a name="94"><span class="lineNum"> 94 </span> : : */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 45 : static inline bool opal_addr_valid(const void *addr)</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 45 : unsigned long val = (unsigned long)addr;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 45 : if ((val &gt;&gt; 60) != 0xc &amp;&amp; (val &gt;&gt; 60) != 0x0)</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 2 : return false;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 43 : val &amp;= ~0xf000000000000000UL;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 43 : if (val &gt; top_of_ram)</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : return false;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 42 : return true;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : }</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : #endif /* __OPAL_INTERNAL_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/pci.h.func-sort-c.html b/coverage-report/include/pci.h.func-sort-c.html
new file mode 100644
index 0000000..e4cf179
--- /dev/null
+++ b/coverage-report/include/pci.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/pci.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - pci.h<span style="font-size: 80%;"> (<a href="pci.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="pci.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci.h.gcov.html#403">pci_cfg_read8</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/pci.h.func.html b/coverage-report/include/pci.h.func.html
new file mode 100644
index 0000000..313891f
--- /dev/null
+++ b/coverage-report/include/pci.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/pci.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - pci.h<span style="font-size: 80%;"> (<a href="pci.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="pci.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pci.h.gcov.html#403">pci_cfg_read8</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/pci.h.gcov.html b/coverage-report/include/pci.h.gcov.html
new file mode 100644
index 0000000..e372c42
--- /dev/null
+++ b/coverage-report/include/pci.h.gcov.html
@@ -0,0 +1,591 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/pci.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - pci.h<span style="font-size: 80%;"> (source / <a href="pci.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __PCI_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __PCI_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;opal.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;device.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;lock.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;bitmap.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define PCITRACE(_p, _bdfn, fmt, a...) \</a>
+<a name="14"><span class="lineNum"> 14 </span> : : prlog(PR_TRACE, &quot;PHB#%04x:%02x:%02x.%x &quot; fmt, \</a>
+<a name="15"><span class="lineNum"> 15 </span> : : (_p)-&gt;opal_id, \</a>
+<a name="16"><span class="lineNum"> 16 </span> : : PCI_BUS_NUM(_bdfn), \</a>
+<a name="17"><span class="lineNum"> 17 </span> : : PCI_DEV(_bdfn), PCI_FUNC(_bdfn), ## a)</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define PCIDBG(_p, _bdfn, fmt, a...) \</a>
+<a name="19"><span class="lineNum"> 19 </span> : : prlog(PR_DEBUG, &quot;PHB#%04x:%02x:%02x.%x &quot; fmt, \</a>
+<a name="20"><span class="lineNum"> 20 </span> : : (_p)-&gt;opal_id, \</a>
+<a name="21"><span class="lineNum"> 21 </span> : : PCI_BUS_NUM(_bdfn), \</a>
+<a name="22"><span class="lineNum"> 22 </span> : : PCI_DEV(_bdfn), PCI_FUNC(_bdfn), ## a)</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #define PCINOTICE(_p, _bdfn, fmt, a...) \</a>
+<a name="24"><span class="lineNum"> 24 </span> : : prlog(PR_NOTICE, &quot;PHB#%04x:%02x:%02x.%x &quot; fmt, \</a>
+<a name="25"><span class="lineNum"> 25 </span> : : (_p)-&gt;opal_id, \</a>
+<a name="26"><span class="lineNum"> 26 </span> : : PCI_BUS_NUM(_bdfn), \</a>
+<a name="27"><span class="lineNum"> 27 </span> : : PCI_DEV(_bdfn), PCI_FUNC(_bdfn), ## a)</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #define PCIERR(_p, _bdfn, fmt, a...) \</a>
+<a name="29"><span class="lineNum"> 29 </span> : : prlog(PR_ERR, &quot;PHB#%04x:%02x:%02x.%x &quot; fmt, \</a>
+<a name="30"><span class="lineNum"> 30 </span> : : (_p)-&gt;opal_id, \</a>
+<a name="31"><span class="lineNum"> 31 </span> : : PCI_BUS_NUM(_bdfn), \</a>
+<a name="32"><span class="lineNum"> 32 </span> : : PCI_DEV(_bdfn), PCI_FUNC(_bdfn), ## a)</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : struct pci_device;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : struct pci_cfg_reg_filter;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : typedef int64_t (*pci_cfg_reg_func)(void *dev,</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct pci_cfg_reg_filter *pcrf,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : uint32_t offset, uint32_t len,</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t *data, bool write);</a>
+<a name="41"><span class="lineNum"> 41 </span> : : typedef void (*pci_cap_free_data_func)(void *data);</a>
+<a name="42"><span class="lineNum"> 42 </span> : : struct pci_cfg_reg_filter {</a>
+<a name="43"><span class="lineNum"> 43 </span> : : uint32_t flags;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : #define PCI_REG_FLAG_READ 0x1</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #define PCI_REG_FLAG_WRITE 0x2</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define PCI_REG_FLAG_MASK 0x3</a>
+<a name="47"><span class="lineNum"> 47 </span> : : uint32_t start;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : uint32_t len;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : uint8_t *data;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : pci_cfg_reg_func func;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : struct list_node link;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : };</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : /*</a>
+<a name="55"><span class="lineNum"> 55 </span> : : * While this might not be necessary in the long run, the existing</a>
+<a name="56"><span class="lineNum"> 56 </span> : : * Linux kernels expect us to provide a device-tree that contains</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * a representation of all PCI devices below the host bridge. Thus</a>
+<a name="58"><span class="lineNum"> 58 </span> : : * we need to perform a bus scan. We don't need to assign MMIO/IO</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * resources, but we do need to assign bus numbers in a way that</a>
+<a name="60"><span class="lineNum"> 60 </span> : : * is going to be compatible with the HW constraints for PE filtering</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * that is naturally aligned power of twos for ranges below a bridge.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : *</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * Thus the structure pci_device is used for the tracking of the</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * detected devices and the later generation of the device-tree.</a>
+<a name="65"><span class="lineNum"> 65 </span> : : *</a>
+<a name="66"><span class="lineNum"> 66 </span> : : * We do not keep a separate structure for a bus, however a device</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * can have children in which case a device is a bridge.</a>
+<a name="68"><span class="lineNum"> 68 </span> : : *</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * Because this is likely to change, we avoid putting too much</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * information in that structure nor relying on it for anything</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * else but the construction of the flat device-tree.</a>
+<a name="72"><span class="lineNum"> 72 </span> : : */</a>
+<a name="73"><span class="lineNum"> 73 </span> : : struct pci_device {</a>
+<a name="74"><span class="lineNum"> 74 </span> : : uint16_t bdfn;</a>
+<a name="75"><span class="lineNum"> 75 </span> : : bool is_bridge;</a>
+<a name="76"><span class="lineNum"> 76 </span> : : bool is_multifunction;</a>
+<a name="77"><span class="lineNum"> 77 </span> : : bool is_vf;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : uint8_t dev_type; /* PCIE */</a>
+<a name="79"><span class="lineNum"> 79 </span> : : uint8_t primary_bus;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : uint8_t secondary_bus;</a>
+<a name="81"><span class="lineNum"> 81 </span> : : uint8_t subordinate_bus;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : uint32_t scan_map;</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : uint32_t vdid;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : uint32_t sub_vdid;</a>
+<a name="86"><span class="lineNum"> 86 </span> : : #define PCI_VENDOR_ID(x) ((x) &amp; 0xFFFF)</a>
+<a name="87"><span class="lineNum"> 87 </span> : : #define PCI_DEVICE_ID(x) ((x) &gt;&gt; 16)</a>
+<a name="88"><span class="lineNum"> 88 </span> : : uint32_t class;</a>
+<a name="89"><span class="lineNum"> 89 </span> : : uint64_t cap_list;</a>
+<a name="90"><span class="lineNum"> 90 </span> : : struct {</a>
+<a name="91"><span class="lineNum"> 91 </span> : : uint32_t pos;</a>
+<a name="92"><span class="lineNum"> 92 </span> : : void *data;</a>
+<a name="93"><span class="lineNum"> 93 </span> : : pci_cap_free_data_func free_func;</a>
+<a name="94"><span class="lineNum"> 94 </span> : : } cap[64];</a>
+<a name="95"><span class="lineNum"> 95 </span> : : uint32_t mps; /* Max payload size capability */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> : : uint32_t pcrf_start;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : uint32_t pcrf_end;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : struct list_head pcrf;</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : /*</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * Relaxed ordering is a feature which allows PCIe devices accessing GPU</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * memory to bypass the normal PCIe ordering rules to increase</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * performance. It is enabled on a per-PEC basis so every device on a</a>
+<a name="105"><span class="lineNum"> 105 </span> : : * PEC must support it before we can enable it.</a>
+<a name="106"><span class="lineNum"> 106 </span> : : */</a>
+<a name="107"><span class="lineNum"> 107 </span> : : bool allow_relaxed_ordering;</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> : : struct dt_node *dn;</a>
+<a name="110"><span class="lineNum"> 110 </span> : : struct pci_slot *slot;</a>
+<a name="111"><span class="lineNum"> 111 </span> : : struct pci_device *parent;</a>
+<a name="112"><span class="lineNum"> 112 </span> : : struct phb *phb;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : struct list_head children;</a>
+<a name="114"><span class="lineNum"> 114 </span> : : struct list_node link;</a>
+<a name="115"><span class="lineNum"> 115 </span> : : };</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : static inline void pci_set_cap(struct pci_device *pd, int id, int pos,</a>
+<a name="118"><span class="lineNum"> 118 </span> : : void *data, pci_cap_free_data_func free_func,</a>
+<a name="119"><span class="lineNum"> 119 </span> : : bool ext)</a>
+<a name="120"><span class="lineNum"> 120 </span> : : {</a>
+<a name="121"><span class="lineNum"> 121 </span> : : if (!ext) {</a>
+<a name="122"><span class="lineNum"> 122 </span> : : pd-&gt;cap_list |= (0x1ul &lt;&lt; id);</a>
+<a name="123"><span class="lineNum"> 123 </span> : : pd-&gt;cap[id].pos = pos;</a>
+<a name="124"><span class="lineNum"> 124 </span> : : pd-&gt;cap[id].data = data;</a>
+<a name="125"><span class="lineNum"> 125 </span> : : pd-&gt;cap[id].free_func = free_func;</a>
+<a name="126"><span class="lineNum"> 126 </span> : : } else {</a>
+<a name="127"><span class="lineNum"> 127 </span> : : pd-&gt;cap_list |= (0x1ul &lt;&lt; (id + 32));</a>
+<a name="128"><span class="lineNum"> 128 </span> : : pd-&gt;cap[id + 32].pos = pos;</a>
+<a name="129"><span class="lineNum"> 129 </span> : : pd-&gt;cap[id + 32].data = data;</a>
+<a name="130"><span class="lineNum"> 130 </span> : : pd-&gt;cap[id + 32].free_func = free_func;</a>
+<a name="131"><span class="lineNum"> 131 </span> : : }</a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : static inline bool pci_has_cap(struct pci_device *pd,</a>
+<a name="135"><span class="lineNum"> 135 </span> : : int id, bool ext)</a>
+<a name="136"><span class="lineNum"> 136 </span> : : {</a>
+<a name="137"><span class="lineNum"> 137 </span> : : if (!ext)</a>
+<a name="138"><span class="lineNum"> 138 </span> : : return !!(pd-&gt;cap_list &amp; (0x1ul &lt;&lt; id));</a>
+<a name="139"><span class="lineNum"> 139 </span> : : else</a>
+<a name="140"><span class="lineNum"> 140 </span> : : return !!(pd-&gt;cap_list &amp; (0x1ul &lt;&lt; (id + 32)));</a>
+<a name="141"><span class="lineNum"> 141 </span> : : }</a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : static inline int pci_cap(struct pci_device *pd,</a>
+<a name="144"><span class="lineNum"> 144 </span> : : int id, bool ext)</a>
+<a name="145"><span class="lineNum"> 145 </span> : : {</a>
+<a name="146"><span class="lineNum"> 146 </span> : : if (!ext)</a>
+<a name="147"><span class="lineNum"> 147 </span> : : return pd-&gt;cap[id].pos;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : else</a>
+<a name="149"><span class="lineNum"> 149 </span> : : return pd-&gt;cap[id + 32].pos;</a>
+<a name="150"><span class="lineNum"> 150 </span> : : }</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> : : static inline void *pci_cap_data(struct pci_device *pd, int id, bool ext)</a>
+<a name="153"><span class="lineNum"> 153 </span> : : {</a>
+<a name="154"><span class="lineNum"> 154 </span> : : if (!ext)</a>
+<a name="155"><span class="lineNum"> 155 </span> : : return pd-&gt;cap[id].data;</a>
+<a name="156"><span class="lineNum"> 156 </span> : : else</a>
+<a name="157"><span class="lineNum"> 157 </span> : : return pd-&gt;cap[id + 32].data;</a>
+<a name="158"><span class="lineNum"> 158 </span> : : }</a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : /*</a>
+<a name="161"><span class="lineNum"> 161 </span> : : * When generating the device-tree, we need to keep track of</a>
+<a name="162"><span class="lineNum"> 162 </span> : : * the LSI mapping &amp; swizzle it. This state structure is</a>
+<a name="163"><span class="lineNum"> 163 </span> : : * passed by the PHB to pci_add_nodes() and will be used</a>
+<a name="164"><span class="lineNum"> 164 </span> : : * internally.</a>
+<a name="165"><span class="lineNum"> 165 </span> : : *</a>
+<a name="166"><span class="lineNum"> 166 </span> : : * We assume that the interrupt parent (PIC) #address-cells</a>
+<a name="167"><span class="lineNum"> 167 </span> : : * is 0 and #interrupt-cells has a max value of 2.</a>
+<a name="168"><span class="lineNum"> 168 </span> : : */</a>
+<a name="169"><span class="lineNum"> 169 </span> : : struct pci_lsi_state {</a>
+<a name="170"><span class="lineNum"> 170 </span> : : #define MAX_INT_SIZE 2</a>
+<a name="171"><span class="lineNum"> 171 </span> : : uint32_t int_size; /* #cells */</a>
+<a name="172"><span class="lineNum"> 172 </span> : : uint32_t int_val[4][MAX_INT_SIZE]; /* INTA...INTD */</a>
+<a name="173"><span class="lineNum"> 173 </span> : : uint32_t int_parent[4];</a>
+<a name="174"><span class="lineNum"> 174 </span> : : };</a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> : : /*</a>
+<a name="177"><span class="lineNum"> 177 </span> : : * NOTE: All PCI functions return negative OPAL error codes</a>
+<a name="178"><span class="lineNum"> 178 </span> : : *</a>
+<a name="179"><span class="lineNum"> 179 </span> : : * In addition, some functions may return a positive timeout</a>
+<a name="180"><span class="lineNum"> 180 </span> : : * value or some other state information, see the description</a>
+<a name="181"><span class="lineNum"> 181 </span> : : * of individual functions. If nothing is specified, it's</a>
+<a name="182"><span class="lineNum"> 182 </span> : : * just an error code or 0 (success).</a>
+<a name="183"><span class="lineNum"> 183 </span> : : *</a>
+<a name="184"><span class="lineNum"> 184 </span> : : * Functions that operate asynchronously will return a positive</a>
+<a name="185"><span class="lineNum"> 185 </span> : : * delay value and will require the -&gt;poll() op to be called after</a>
+<a name="186"><span class="lineNum"> 186 </span> : : * that delay. -&gt;poll() will then return success, a negative error</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * code, or another delay.</a>
+<a name="188"><span class="lineNum"> 188 </span> : : *</a>
+<a name="189"><span class="lineNum"> 189 </span> : : * Note: If an asynchronous function returns 0, it has completed</a>
+<a name="190"><span class="lineNum"> 190 </span> : : * successfully and does not require a call to -&gt;poll(). Similarly</a>
+<a name="191"><span class="lineNum"> 191 </span> : : * if -&gt;poll() is called while no operation is in progress, it will</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * simply return 0 (success)</a>
+<a name="193"><span class="lineNum"> 193 </span> : : *</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * Note that all functions except -&gt;lock() itself assume that the</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * caller is holding the PHB lock.</a>
+<a name="196"><span class="lineNum"> 196 </span> : : *</a>
+<a name="197"><span class="lineNum"> 197 </span> : : * TODO: Add more interfaces to control things like link width</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * reduction for power savings etc...</a>
+<a name="199"><span class="lineNum"> 199 </span> : : */</a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> : : struct phb;</a>
+<a name="202"><span class="lineNum"> 202 </span> : : extern int last_phb_id;</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> : : struct phb_ops {</a>
+<a name="205"><span class="lineNum"> 205 </span> : : /*</a>
+<a name="206"><span class="lineNum"> 206 </span> : : * Config space ops</a>
+<a name="207"><span class="lineNum"> 207 </span> : : */</a>
+<a name="208"><span class="lineNum"> 208 </span> : : int64_t (*cfg_read8)(struct phb *phb, uint32_t bdfn,</a>
+<a name="209"><span class="lineNum"> 209 </span> : : uint32_t offset, uint8_t *data);</a>
+<a name="210"><span class="lineNum"> 210 </span> : : int64_t (*cfg_read16)(struct phb *phb, uint32_t bdfn,</a>
+<a name="211"><span class="lineNum"> 211 </span> : : uint32_t offset, uint16_t *data);</a>
+<a name="212"><span class="lineNum"> 212 </span> : : int64_t (*cfg_read32)(struct phb *phb, uint32_t bdfn,</a>
+<a name="213"><span class="lineNum"> 213 </span> : : uint32_t offset, uint32_t *data);</a>
+<a name="214"><span class="lineNum"> 214 </span> : : int64_t (*cfg_write8)(struct phb *phb, uint32_t bdfn,</a>
+<a name="215"><span class="lineNum"> 215 </span> : : uint32_t offset, uint8_t data);</a>
+<a name="216"><span class="lineNum"> 216 </span> : : int64_t (*cfg_write16)(struct phb *phb, uint32_t bdfn,</a>
+<a name="217"><span class="lineNum"> 217 </span> : : uint32_t offset, uint16_t data);</a>
+<a name="218"><span class="lineNum"> 218 </span> : : int64_t (*cfg_write32)(struct phb *phb, uint32_t bdfn,</a>
+<a name="219"><span class="lineNum"> 219 </span> : : uint32_t offset, uint32_t data);</a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> : : int64_t (*get_reserved_pe_number)(struct phb *phb);</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> : : /*</a>
+<a name="224"><span class="lineNum"> 224 </span> : : * Device init method is called after a device has been detected</a>
+<a name="225"><span class="lineNum"> 225 </span> : : * and before probing further. It can alter things like scan_map</a>
+<a name="226"><span class="lineNum"> 226 </span> : : * for bridge ports etc...</a>
+<a name="227"><span class="lineNum"> 227 </span> : : */</a>
+<a name="228"><span class="lineNum"> 228 </span> : : int (*device_init)(struct phb *phb, struct pci_device *device,</a>
+<a name="229"><span class="lineNum"> 229 </span> : : void *data);</a>
+<a name="230"><span class="lineNum"> 230 </span> : : void (*device_remove)(struct phb *phb, struct pci_device *pd);</a>
+<a name="231"><span class="lineNum"> 231 </span> : : </a>
+<a name="232"><span class="lineNum"> 232 </span> : : /* PHB final fixup is called after PCI probing is completed */</a>
+<a name="233"><span class="lineNum"> 233 </span> : : void (*phb_final_fixup)(struct phb *phb);</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> : : /*</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * EEH methods</a>
+<a name="237"><span class="lineNum"> 237 </span> : : *</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * The various arguments are identical to the corresponding</a>
+<a name="239"><span class="lineNum"> 239 </span> : : * OPAL functions</a>
+<a name="240"><span class="lineNum"> 240 </span> : : */</a>
+<a name="241"><span class="lineNum"> 241 </span> : : int64_t (*eeh_freeze_status)(struct phb *phb, uint64_t pe_number,</a>
+<a name="242"><span class="lineNum"> 242 </span> : : uint8_t *freeze_state,</a>
+<a name="243"><span class="lineNum"> 243 </span> : : uint16_t *pci_error_type,</a>
+<a name="244"><span class="lineNum"> 244 </span> : : uint16_t *severity);</a>
+<a name="245"><span class="lineNum"> 245 </span> : : int64_t (*eeh_freeze_clear)(struct phb *phb, uint64_t pe_number,</a>
+<a name="246"><span class="lineNum"> 246 </span> : : uint64_t eeh_action_token);</a>
+<a name="247"><span class="lineNum"> 247 </span> : : int64_t (*eeh_freeze_set)(struct phb *phb, uint64_t pe_number,</a>
+<a name="248"><span class="lineNum"> 248 </span> : : uint64_t eeh_action_token);</a>
+<a name="249"><span class="lineNum"> 249 </span> : : int64_t (*err_inject)(struct phb *phb, uint64_t pe_number,</a>
+<a name="250"><span class="lineNum"> 250 </span> : : uint32_t type, uint32_t func, uint64_t addr,</a>
+<a name="251"><span class="lineNum"> 251 </span> : : uint64_t mask);</a>
+<a name="252"><span class="lineNum"> 252 </span> : : int64_t (*get_diag_data2)(struct phb *phb, void *diag_buffer,</a>
+<a name="253"><span class="lineNum"> 253 </span> : : uint64_t diag_buffer_len);</a>
+<a name="254"><span class="lineNum"> 254 </span> : : int64_t (*next_error)(struct phb *phb, uint64_t *first_frozen_pe,</a>
+<a name="255"><span class="lineNum"> 255 </span> : : uint16_t *pci_error_type, uint16_t *severity);</a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> : : /*</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * Other IODA methods</a>
+<a name="259"><span class="lineNum"> 259 </span> : : *</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * The various arguments are identical to the corresponding</a>
+<a name="261"><span class="lineNum"> 261 </span> : : * OPAL functions</a>
+<a name="262"><span class="lineNum"> 262 </span> : : */</a>
+<a name="263"><span class="lineNum"> 263 </span> : : int64_t (*pci_reinit)(struct phb *phb, uint64_t scope, uint64_t data);</a>
+<a name="264"><span class="lineNum"> 264 </span> : : int64_t (*phb_mmio_enable)(struct phb *phb, uint16_t window_type,</a>
+<a name="265"><span class="lineNum"> 265 </span> : : uint16_t window_num, uint16_t enable);</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> : : int64_t (*set_phb_mem_window)(struct phb *phb, uint16_t window_type,</a>
+<a name="268"><span class="lineNum"> 268 </span> : : uint16_t window_num, uint64_t addr,</a>
+<a name="269"><span class="lineNum"> 269 </span> : : uint64_t pci_addr, uint64_t size);</a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : int64_t (*map_pe_mmio_window)(struct phb *phb, uint64_t pe_number,</a>
+<a name="272"><span class="lineNum"> 272 </span> : : uint16_t window_type, uint16_t window_num,</a>
+<a name="273"><span class="lineNum"> 273 </span> : : uint16_t segment_num);</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : int64_t (*set_pe)(struct phb *phb, uint64_t pe_number,</a>
+<a name="276"><span class="lineNum"> 276 </span> : : uint64_t bus_dev_func, uint8_t bus_compare,</a>
+<a name="277"><span class="lineNum"> 277 </span> : : uint8_t dev_compare, uint8_t func_compare,</a>
+<a name="278"><span class="lineNum"> 278 </span> : : uint8_t pe_action);</a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> : : int64_t (*set_peltv)(struct phb *phb, uint32_t parent_pe,</a>
+<a name="281"><span class="lineNum"> 281 </span> : : uint32_t child_pe, uint8_t state);</a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> : : int64_t (*map_pe_dma_window)(struct phb *phb, uint64_t pe_number,</a>
+<a name="284"><span class="lineNum"> 284 </span> : : uint16_t window_id, uint16_t tce_levels,</a>
+<a name="285"><span class="lineNum"> 285 </span> : : uint64_t tce_table_addr,</a>
+<a name="286"><span class="lineNum"> 286 </span> : : uint64_t tce_table_size,</a>
+<a name="287"><span class="lineNum"> 287 </span> : : uint64_t tce_page_size);</a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> : : int64_t (*map_pe_dma_window_real)(struct phb *phb, uint64_t pe_number,</a>
+<a name="290"><span class="lineNum"> 290 </span> : : uint16_t dma_window_number,</a>
+<a name="291"><span class="lineNum"> 291 </span> : : uint64_t pci_start_addr,</a>
+<a name="292"><span class="lineNum"> 292 </span> : : uint64_t pci_mem_size);</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : int64_t (*set_option)(struct phb *phb, enum OpalPhbOption opt,</a>
+<a name="295"><span class="lineNum"> 295 </span> : : uint64_t setting);</a>
+<a name="296"><span class="lineNum"> 296 </span> : : int64_t (*get_option)(struct phb *phb, enum OpalPhbOption opt,</a>
+<a name="297"><span class="lineNum"> 297 </span> : : __be64 *setting);</a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> : : int64_t (*set_mve)(struct phb *phb, uint32_t mve_number,</a>
+<a name="300"><span class="lineNum"> 300 </span> : : uint64_t pe_number);</a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> : : int64_t (*set_mve_enable)(struct phb *phb, uint32_t mve_number,</a>
+<a name="303"><span class="lineNum"> 303 </span> : : uint32_t state);</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : int64_t (*set_xive_pe)(struct phb *phb, uint64_t pe_number,</a>
+<a name="306"><span class="lineNum"> 306 </span> : : uint32_t xive_num);</a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> : : int64_t (*get_msi_32)(struct phb *phb, uint64_t mve_number,</a>
+<a name="309"><span class="lineNum"> 309 </span> : : uint32_t xive_num, uint8_t msi_range,</a>
+<a name="310"><span class="lineNum"> 310 </span> : : uint32_t *msi_address, uint32_t *message_data);</a>
+<a name="311"><span class="lineNum"> 311 </span> : : </a>
+<a name="312"><span class="lineNum"> 312 </span> : : int64_t (*get_msi_64)(struct phb *phb, uint64_t mve_number,</a>
+<a name="313"><span class="lineNum"> 313 </span> : : uint32_t xive_num, uint8_t msi_range,</a>
+<a name="314"><span class="lineNum"> 314 </span> : : uint64_t *msi_address, uint32_t *message_data);</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> : : int64_t (*ioda_reset)(struct phb *phb, bool purge);</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> : : int64_t (*papr_errinjct_reset)(struct phb *phb);</a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> : : /*</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * IODA2 PCI interfaces</a>
+<a name="322"><span class="lineNum"> 322 </span> : : */</a>
+<a name="323"><span class="lineNum"> 323 </span> : : int64_t (*pci_msi_eoi)(struct phb *phb, uint32_t hwirq);</a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> : : /* TCE Kill abstraction */</a>
+<a name="326"><span class="lineNum"> 326 </span> : : int64_t (*tce_kill)(struct phb *phb, uint32_t kill_type,</a>
+<a name="327"><span class="lineNum"> 327 </span> : : uint64_t pe_number, uint32_t tce_size,</a>
+<a name="328"><span class="lineNum"> 328 </span> : : uint64_t dma_addr, uint32_t npages);</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> : : /* Put phb in capi mode or pcie mode */</a>
+<a name="331"><span class="lineNum"> 331 </span> : : int64_t (*set_capi_mode)(struct phb *phb, uint64_t mode,</a>
+<a name="332"><span class="lineNum"> 332 </span> : : uint64_t pe_number);</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> : : int64_t (*set_capp_recovery)(struct phb *phb);</a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> : : /* PCI peer-to-peer setup */</a>
+<a name="337"><span class="lineNum"> 337 </span> : : void (*set_p2p)(struct phb *phb, uint64_t mode, uint64_t flags,</a>
+<a name="338"><span class="lineNum"> 338 </span> : : uint16_t pe_number);</a>
+<a name="339"><span class="lineNum"> 339 </span> : : </a>
+<a name="340"><span class="lineNum"> 340 </span> : : /* Get/set PBCQ Tunnel BAR register */</a>
+<a name="341"><span class="lineNum"> 341 </span> : : void (*get_tunnel_bar)(struct phb *phb, uint64_t *addr);</a>
+<a name="342"><span class="lineNum"> 342 </span> : : int64_t (*set_tunnel_bar)(struct phb *phb, uint64_t addr);</a>
+<a name="343"><span class="lineNum"> 343 </span> : : };</a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> : : enum phb_type {</a>
+<a name="346"><span class="lineNum"> 346 </span> : : phb_type_pci,</a>
+<a name="347"><span class="lineNum"> 347 </span> : : phb_type_pcix_v1,</a>
+<a name="348"><span class="lineNum"> 348 </span> : : phb_type_pcix_v2,</a>
+<a name="349"><span class="lineNum"> 349 </span> : : phb_type_pcie_v1,</a>
+<a name="350"><span class="lineNum"> 350 </span> : : phb_type_pcie_v2,</a>
+<a name="351"><span class="lineNum"> 351 </span> : : phb_type_pcie_v3,</a>
+<a name="352"><span class="lineNum"> 352 </span> : : phb_type_pcie_v4,</a>
+<a name="353"><span class="lineNum"> 353 </span> : : phb_type_npu_v2,</a>
+<a name="354"><span class="lineNum"> 354 </span> : : phb_type_npu_v2_opencapi,</a>
+<a name="355"><span class="lineNum"> 355 </span> : : phb_type_npu_v3,</a>
+<a name="356"><span class="lineNum"> 356 </span> : : };</a>
+<a name="357"><span class="lineNum"> 357 </span> : : </a>
+<a name="358"><span class="lineNum"> 358 </span> : : /* Generic PCI NVRAM flags */</a>
+<a name="359"><span class="lineNum"> 359 </span> : : extern bool verbose_eeh;</a>
+<a name="360"><span class="lineNum"> 360 </span> : : extern bool pci_tracing;</a>
+<a name="361"><span class="lineNum"> 361 </span> : : </a>
+<a name="362"><span class="lineNum"> 362 </span> : : void pci_nvram_init(void);</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> : : struct phb {</a>
+<a name="365"><span class="lineNum"> 365 </span> : : struct dt_node *dt_node;</a>
+<a name="366"><span class="lineNum"> 366 </span> : : int opal_id;</a>
+<a name="367"><span class="lineNum"> 367 </span> : : uint32_t scan_map;</a>
+<a name="368"><span class="lineNum"> 368 </span> : : enum phb_type phb_type;</a>
+<a name="369"><span class="lineNum"> 369 </span> : : struct lock lock;</a>
+<a name="370"><span class="lineNum"> 370 </span> : : struct list_head devices;</a>
+<a name="371"><span class="lineNum"> 371 </span> : : struct list_head virt_devices;</a>
+<a name="372"><span class="lineNum"> 372 </span> : : const struct phb_ops *ops;</a>
+<a name="373"><span class="lineNum"> 373 </span> : : struct pci_lsi_state lstate;</a>
+<a name="374"><span class="lineNum"> 374 </span> : : uint32_t mps;</a>
+<a name="375"><span class="lineNum"> 375 </span> : : bitmap_t *filter_map;</a>
+<a name="376"><span class="lineNum"> 376 </span> : : </a>
+<a name="377"><span class="lineNum"> 377 </span> : : /* PCI-X only slot info, for PCI-E this is in the RC bridge */</a>
+<a name="378"><span class="lineNum"> 378 </span> : : struct pci_slot *slot;</a>
+<a name="379"><span class="lineNum"> 379 </span> : : </a>
+<a name="380"><span class="lineNum"> 380 </span> : : /* Base location code used to generate the children one */</a>
+<a name="381"><span class="lineNum"> 381 </span> : : const char *base_loc_code;</a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> : : /* Additional data the platform might need to attach */</a>
+<a name="384"><span class="lineNum"> 384 </span> : : void *platform_data;</a>
+<a name="385"><span class="lineNum"> 385 </span> : : };</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> : : static inline void phb_lock(struct phb *phb)</a>
+<a name="388"><span class="lineNum"> 388 </span> : : {</a>
+<a name="389"><span class="lineNum"> 389 </span> : : lock(&amp;phb-&gt;lock);</a>
+<a name="390"><span class="lineNum"> 390 </span> : : }</a>
+<a name="391"><span class="lineNum"> 391 </span> : : </a>
+<a name="392"><span class="lineNum"> 392 </span> : : static inline bool phb_try_lock(struct phb *phb)</a>
+<a name="393"><span class="lineNum"> 393 </span> : : {</a>
+<a name="394"><span class="lineNum"> 394 </span> : : return try_lock(&amp;phb-&gt;lock);</a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> : : static inline void phb_unlock(struct phb *phb)</a>
+<a name="398"><span class="lineNum"> 398 </span> : : {</a>
+<a name="399"><span class="lineNum"> 399 </span> : : unlock(&amp;phb-&gt;lock);</a>
+<a name="400"><span class="lineNum"> 400 </span> : : }</a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> : : bool pci_check_clear_freeze(struct phb *phb);</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> : : /* Config space ops wrappers */</a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : static inline int64_t pci_cfg_read8(struct phb *phb, uint32_t bdfn,</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : uint32_t offset, uint8_t *data)</a>
+<a name="407"><span class="lineNum"> 407 </span> : : {</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : return phb-&gt;ops-&gt;cfg_read8(phb, bdfn, offset, data);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : }</a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : static inline int64_t pci_cfg_read16(struct phb *phb, uint32_t bdfn,</a>
+<a name="412"><span class="lineNum"> 412 </span> : : uint32_t offset, uint16_t *data)</a>
+<a name="413"><span class="lineNum"> 413 </span> : : {</a>
+<a name="414"><span class="lineNum"> 414 </span> : : return phb-&gt;ops-&gt;cfg_read16(phb, bdfn, offset, data);</a>
+<a name="415"><span class="lineNum"> 415 </span> : : }</a>
+<a name="416"><span class="lineNum"> 416 </span> : : </a>
+<a name="417"><span class="lineNum"> 417 </span> : : static inline int64_t pci_cfg_read32(struct phb *phb, uint32_t bdfn,</a>
+<a name="418"><span class="lineNum"> 418 </span> : : uint32_t offset, uint32_t *data)</a>
+<a name="419"><span class="lineNum"> 419 </span> : : {</a>
+<a name="420"><span class="lineNum"> 420 </span> : : return phb-&gt;ops-&gt;cfg_read32(phb, bdfn, offset, data);</a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> : : static inline int64_t pci_cfg_write8(struct phb *phb, uint32_t bdfn,</a>
+<a name="424"><span class="lineNum"> 424 </span> : : uint32_t offset, uint8_t data)</a>
+<a name="425"><span class="lineNum"> 425 </span> : : {</a>
+<a name="426"><span class="lineNum"> 426 </span> : : return phb-&gt;ops-&gt;cfg_write8(phb, bdfn, offset, data);</a>
+<a name="427"><span class="lineNum"> 427 </span> : : }</a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : static inline int64_t pci_cfg_write16(struct phb *phb, uint32_t bdfn,</a>
+<a name="430"><span class="lineNum"> 430 </span> : : uint32_t offset, uint16_t data)</a>
+<a name="431"><span class="lineNum"> 431 </span> : : {</a>
+<a name="432"><span class="lineNum"> 432 </span> : : return phb-&gt;ops-&gt;cfg_write16(phb, bdfn, offset, data);</a>
+<a name="433"><span class="lineNum"> 433 </span> : : }</a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : static inline int64_t pci_cfg_write32(struct phb *phb, uint32_t bdfn,</a>
+<a name="436"><span class="lineNum"> 436 </span> : : uint32_t offset, uint32_t data)</a>
+<a name="437"><span class="lineNum"> 437 </span> : : {</a>
+<a name="438"><span class="lineNum"> 438 </span> : : return phb-&gt;ops-&gt;cfg_write32(phb, bdfn, offset, data);</a>
+<a name="439"><span class="lineNum"> 439 </span> : : }</a>
+<a name="440"><span class="lineNum"> 440 </span> : : </a>
+<a name="441"><span class="lineNum"> 441 </span> : : /* Utilities */</a>
+<a name="442"><span class="lineNum"> 442 </span> : : extern void pci_remove_bus(struct phb *phb, struct list_head *list);</a>
+<a name="443"><span class="lineNum"> 443 </span> : : extern uint8_t pci_scan_bus(struct phb *phb, uint8_t bus, uint8_t max_bus,</a>
+<a name="444"><span class="lineNum"> 444 </span> : : struct list_head *list, struct pci_device *parent,</a>
+<a name="445"><span class="lineNum"> 445 </span> : : bool scan_downstream);</a>
+<a name="446"><span class="lineNum"> 446 </span> : : extern void pci_add_device_nodes(struct phb *phb,</a>
+<a name="447"><span class="lineNum"> 447 </span> : : struct list_head *list,</a>
+<a name="448"><span class="lineNum"> 448 </span> : : struct dt_node *parent_node,</a>
+<a name="449"><span class="lineNum"> 449 </span> : : struct pci_lsi_state *lstate,</a>
+<a name="450"><span class="lineNum"> 450 </span> : : uint8_t swizzle);</a>
+<a name="451"><span class="lineNum"> 451 </span> : : extern int64_t pci_find_cap(struct phb *phb, uint16_t bdfn, uint8_t cap);</a>
+<a name="452"><span class="lineNum"> 452 </span> : : extern int64_t pci_find_ecap(struct phb *phb, uint16_t bdfn, uint16_t cap,</a>
+<a name="453"><span class="lineNum"> 453 </span> : : uint8_t *version);</a>
+<a name="454"><span class="lineNum"> 454 </span> : : extern void pci_init_capabilities(struct phb *phb, struct pci_device *pd);</a>
+<a name="455"><span class="lineNum"> 455 </span> : : extern bool pci_wait_crs(struct phb *phb, uint16_t bdfn, uint32_t *out_vdid);</a>
+<a name="456"><span class="lineNum"> 456 </span> : : extern void pci_restore_slot_bus_configs(struct pci_slot *slot);</a>
+<a name="457"><span class="lineNum"> 457 </span> : : extern void pci_device_init(struct phb *phb, struct pci_device *pd);</a>
+<a name="458"><span class="lineNum"> 458 </span> : : extern struct pci_device *pci_walk_dev(struct phb *phb,</a>
+<a name="459"><span class="lineNum"> 459 </span> : : struct pci_device *pd,</a>
+<a name="460"><span class="lineNum"> 460 </span> : : int (*cb)(struct phb *,</a>
+<a name="461"><span class="lineNum"> 461 </span> : : struct pci_device *,</a>
+<a name="462"><span class="lineNum"> 462 </span> : : void *),</a>
+<a name="463"><span class="lineNum"> 463 </span> : : void *userdata);</a>
+<a name="464"><span class="lineNum"> 464 </span> : : extern struct pci_device *pci_find_dev(struct phb *phb, uint16_t bdfn);</a>
+<a name="465"><span class="lineNum"> 465 </span> : : extern void pci_restore_bridge_buses(struct phb *phb, struct pci_device *pd);</a>
+<a name="466"><span class="lineNum"> 466 </span> : : extern struct pci_cfg_reg_filter *pci_find_cfg_reg_filter(struct pci_device *pd,</a>
+<a name="467"><span class="lineNum"> 467 </span> : : uint32_t start, uint32_t len);</a>
+<a name="468"><span class="lineNum"> 468 </span> : : extern int64_t pci_handle_cfg_filters(struct phb *phb, uint32_t bdfn,</a>
+<a name="469"><span class="lineNum"> 469 </span> : : uint32_t offset, uint32_t len,</a>
+<a name="470"><span class="lineNum"> 470 </span> : : uint32_t *data, bool write);</a>
+<a name="471"><span class="lineNum"> 471 </span> : : extern struct pci_cfg_reg_filter *pci_add_cfg_reg_filter(struct pci_device *pd,</a>
+<a name="472"><span class="lineNum"> 472 </span> : : uint32_t start, uint32_t len,</a>
+<a name="473"><span class="lineNum"> 473 </span> : : uint32_t flags, pci_cfg_reg_func func);</a>
+<a name="474"><span class="lineNum"> 474 </span> : : </a>
+<a name="475"><span class="lineNum"> 475 </span> : : /* Manage PHBs */</a>
+<a name="476"><span class="lineNum"> 476 </span> : : #define OPAL_DYNAMIC_PHB_ID (~0)</a>
+<a name="477"><span class="lineNum"> 477 </span> : : extern int64_t pci_register_phb(struct phb *phb, int opal_id);</a>
+<a name="478"><span class="lineNum"> 478 </span> : : extern int64_t pci_unregister_phb(struct phb *phb);</a>
+<a name="479"><span class="lineNum"> 479 </span> : : extern struct phb *pci_get_phb(uint64_t phb_id);</a>
+<a name="480"><span class="lineNum"> 480 </span> : : </a>
+<a name="481"><span class="lineNum"> 481 </span> : : static inline struct phb *__pci_next_phb_idx(uint64_t *phb_id) {</a>
+<a name="482"><span class="lineNum"> 482 </span> : : struct phb *phb = NULL;</a>
+<a name="483"><span class="lineNum"> 483 </span> : : while (phb == NULL &amp;&amp; *phb_id &lt;= last_phb_id) {</a>
+<a name="484"><span class="lineNum"> 484 </span> : : phb = pci_get_phb((*phb_id)++);</a>
+<a name="485"><span class="lineNum"> 485 </span> : : }</a>
+<a name="486"><span class="lineNum"> 486 </span> : : return phb;</a>
+<a name="487"><span class="lineNum"> 487 </span> : : }</a>
+<a name="488"><span class="lineNum"> 488 </span> : : </a>
+<a name="489"><span class="lineNum"> 489 </span> : : #define for_each_phb(phb) \</a>
+<a name="490"><span class="lineNum"> 490 </span> : : for (uint64_t __phb_idx = 0; \</a>
+<a name="491"><span class="lineNum"> 491 </span> : : (phb = __pci_next_phb_idx(&amp;__phb_idx)) ; )</a>
+<a name="492"><span class="lineNum"> 492 </span> : : </a>
+<a name="493"><span class="lineNum"> 493 </span> : : /* Device tree */</a>
+<a name="494"><span class="lineNum"> 494 </span> : : extern void pci_std_swizzle_irq_map(struct dt_node *dt_node,</a>
+<a name="495"><span class="lineNum"> 495 </span> : : struct pci_device *pd,</a>
+<a name="496"><span class="lineNum"> 496 </span> : : struct pci_lsi_state *lstate,</a>
+<a name="497"><span class="lineNum"> 497 </span> : : uint8_t swizzle);</a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> : : /* Initialize all PCI slots */</a>
+<a name="500"><span class="lineNum"> 500 </span> : : extern void pci_init_slots(void);</a>
+<a name="501"><span class="lineNum"> 501 </span> : : extern int64_t pci_reset(void);</a>
+<a name="502"><span class="lineNum"> 502 </span> : : </a>
+<a name="503"><span class="lineNum"> 503 </span> : : extern void opal_pci_eeh_set_evt(uint64_t phb_id);</a>
+<a name="504"><span class="lineNum"> 504 </span> : : extern void opal_pci_eeh_clear_evt(uint64_t phb_id);</a>
+<a name="505"><span class="lineNum"> 505 </span> : : </a>
+<a name="506"><span class="lineNum"> 506 </span> : : #endif /* __PCI_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/processor.h.func-sort-c.html b/coverage-report/include/processor.h.func-sort-c.html
new file mode 100644
index 0000000..2630253
--- /dev/null
+++ b/coverage-report/include/processor.h.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/processor.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - processor.h<span style="font-size: 80%;"> (<a href="processor.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="processor.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="processor.h.gcov.html#249">is_power9c</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="processor.h.gcov.html#221">is_power9n</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/processor.h.func.html b/coverage-report/include/processor.h.func.html
new file mode 100644
index 0000000..e2fbb2c
--- /dev/null
+++ b/coverage-report/include/processor.h.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/processor.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - processor.h<span style="font-size: 80%;"> (<a href="processor.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="processor.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="processor.h.gcov.html#249">is_power9c</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="processor.h.gcov.html#221">is_power9n</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/processor.h.gcov.html b/coverage-report/include/processor.h.gcov.html
new file mode 100644
index 0000000..dabae75
--- /dev/null
+++ b/coverage-report/include/processor.h.gcov.html
@@ -0,0 +1,504 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/processor.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - processor.h<span style="font-size: 80%;"> (source / <a href="processor.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryLo">33.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __PROCESSOR_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __PROCESSOR_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;bitutils.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : /* MSR bits */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #define MSR_SF PPC_BIT(0) /* 64-bit mode */</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define MSR_HV PPC_BIT(3) /* Hypervisor mode */</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define MSR_VEC PPC_BIT(38) /* VMX enable */</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define MSR_VSX PPC_BIT(40) /* VSX enable */</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define MSR_S PPC_BIT(41) /* Secure mode */</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define MSR_EE PPC_BIT(48) /* External Int. Enable */</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define MSR_PR PPC_BIT(49) /* Problem state */</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define MSR_FP PPC_BIT(50) /* Floating Point Enable */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define MSR_ME PPC_BIT(51) /* Machine Check Enable */</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define MSR_FE0 PPC_BIT(52) /* FP Exception 0 */</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define MSR_SE PPC_BIT(53) /* Step enable */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define MSR_BE PPC_BIT(54) /* Branch trace enable */</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define MSR_FE1 PPC_BIT(55) /* FP Exception 1 */</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #define MSR_IR PPC_BIT(58) /* Instructions reloc */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define MSR_DR PPC_BIT(59) /* Data reloc */</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #define MSR_PMM PPC_BIT(61) /* Perf Monitor */</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #define MSR_RI PPC_BIT(62) /* Recoverable Interrupt */</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define MSR_LE PPC_BIT(63) /* Little Endian */</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* PIR */</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #define SPR_PIR_P9_MASK 0x7fff /* Mask of implemented bits */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #define SPR_PIR_P8_MASK 0x1fff /* Mask of implemented bits */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* SPR register definitions */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define SPR_DSCR 0x011 /* RW: Data stream control reg */</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #define SPR_DSISR 0x012 /* RW: Data storage interrupt status reg */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #define SPR_DAR 0x013 /* RW: Data address reg */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define SPR_DEC 0x016 /* RW: Decrement Register */</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define SPR_SDR1 0x019</a>
+<a name="39"><span class="lineNum"> 39 </span> : : #define SPR_SRR0 0x01a /* RW: Exception save/restore reg 0 */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #define SPR_SRR1 0x01b /* RW: Exception save/restore reg 1 */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #define SPR_CFAR 0x01c /* RW: Come From Address Register */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #define SPR_AMR 0x01d /* RW: Authority Mask Register */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : #define SPR_IAMR 0x03d /* RW: Instruction Authority Mask Register */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : #define SPR_RPR 0x0ba /* RW: Relative Priority Register */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #define SPR_TBRL 0x10c /* RO: Timebase low */</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define SPR_TBRU 0x10d /* RO: Timebase high */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : #define SPR_SPRC 0x114 /* RW: Access to uArch SPRs (ex SCOMC) */</a>
+<a name="48"><span class="lineNum"> 48 </span> : : #define SPR_SPRD 0x115 /* RW: Access to uArch SPRs (ex SCOMD) */</a>
+<a name="49"><span class="lineNum"> 49 </span> : : #define SPR_SCOMC 0x114 /* RW: SCOM Control - old name of SPRC */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #define SPR_SCOMD 0x115 /* RW: SCOM Data - old name of SPRD */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : #define SPR_TBWL 0x11c /* RW: Timebase low */</a>
+<a name="52"><span class="lineNum"> 52 </span> : : #define SPR_TBWU 0x11d /* RW: Timebase high */</a>
+<a name="53"><span class="lineNum"> 53 </span> : : #define SPR_TBU40 0x11e /* RW: Timebase Upper 40 bit */</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #define SPR_PVR 0x11f /* RO: Processor version register */</a>
+<a name="55"><span class="lineNum"> 55 </span> : : #define SPR_HSPRG0 0x130 /* RW: Hypervisor scratch 0 */</a>
+<a name="56"><span class="lineNum"> 56 </span> : : #define SPR_HSPRG1 0x131 /* RW: Hypervisor scratch 1 */</a>
+<a name="57"><span class="lineNum"> 57 </span> : : #define SPR_SPURR 0x134 /* RW: Scaled Processor Utilization Resource */</a>
+<a name="58"><span class="lineNum"> 58 </span> : : #define SPR_PURR 0x135 /* RW: Processor Utilization Resource reg */</a>
+<a name="59"><span class="lineNum"> 59 </span> : : #define SPR_HDEC 0x136 /* RW: Hypervisor Decrementer */</a>
+<a name="60"><span class="lineNum"> 60 </span> : : #define SPR_HRMOR 0x139 /* RW: Hypervisor Real Mode Offset reg */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define SPR_HSRR0 0x13a /* RW: HV Exception save/restore reg 0 */</a>
+<a name="62"><span class="lineNum"> 62 </span> : : #define SPR_HSRR1 0x13b /* RW: HV Exception save/restore reg 1 */</a>
+<a name="63"><span class="lineNum"> 63 </span> : : #define SPR_TFMR 0x13d</a>
+<a name="64"><span class="lineNum"> 64 </span> : : #define SPR_LPCR 0x13e</a>
+<a name="65"><span class="lineNum"> 65 </span> : : #define SPR_HMER 0x150 /* Hypervisor Maintenance Exception */</a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define SPR_HMEER 0x151 /* HMER interrupt enable mask */</a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define SPR_PCR 0x152</a>
+<a name="68"><span class="lineNum"> 68 </span> : : #define SPR_AMOR 0x15d</a>
+<a name="69"><span class="lineNum"> 69 </span> : : #define SPR_USRR0 0x1fa /* RW: Ultravisor Save/Restore Register 0 */</a>
+<a name="70"><span class="lineNum"> 70 </span> : : #define SPR_USRR1 0x1fb /* RW: Ultravisor Save/Restore Register 1 */</a>
+<a name="71"><span class="lineNum"> 71 </span> : : #define SPR_SMFCTRL 0x1ff /* RW: Secure Memory Facility Control */</a>
+<a name="72"><span class="lineNum"> 72 </span> : : #define SPR_PSSCR 0x357 /* RW: Stop status and control (ISA 3) */</a>
+<a name="73"><span class="lineNum"> 73 </span> : : #define SPR_TSCR 0x399</a>
+<a name="74"><span class="lineNum"> 74 </span> : : #define SPR_HID0 0x3f0</a>
+<a name="75"><span class="lineNum"> 75 </span> : : #define SPR_HID1 0x3f1</a>
+<a name="76"><span class="lineNum"> 76 </span> : : #define SPR_HID2 0x3f8</a>
+<a name="77"><span class="lineNum"> 77 </span> : : #define SPR_HID4 0x3f4</a>
+<a name="78"><span class="lineNum"> 78 </span> : : #define SPR_HID5 0x3f6</a>
+<a name="79"><span class="lineNum"> 79 </span> : : #define SPR_PIR 0x3ff /* RO: Processor Identification */</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : /* Bits in SRR1 */</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : #define SPR_SRR1_PM_WAKE_MASK 0x3c0000 /* PM wake reason for P8/9 */</a>
+<a name="84"><span class="lineNum"> 84 </span> : : #define SPR_SRR1_PM_WAKE_SRESET 0x100000</a>
+<a name="85"><span class="lineNum"> 85 </span> : : #define SPR_SRR1_PM_WAKE_MCE 0x3c0000 /* Use reserved value for MCE */</a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> : : /* Bits in LPCR */</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* Powersave Exit Cause Enable is different on each generation */</a>
+<a name="90"><span class="lineNum"> 90 </span> : : #define SPR_LPCR_P8_PECE PPC_BITMASK(47,51)</a>
+<a name="91"><span class="lineNum"> 91 </span> : : #define SPR_LPCR_P8_PECE0 PPC_BIT(47) /* Wake on priv doorbell */</a>
+<a name="92"><span class="lineNum"> 92 </span> : : #define SPR_LPCR_P8_PECE1 PPC_BIT(48) /* Wake on hv doorbell */</a>
+<a name="93"><span class="lineNum"> 93 </span> : : #define SPR_LPCR_P8_PECE2 PPC_BIT(49) /* Wake on external interrupts */</a>
+<a name="94"><span class="lineNum"> 94 </span> : : #define SPR_LPCR_P8_PECE3 PPC_BIT(50) /* Wake on decrementer */</a>
+<a name="95"><span class="lineNum"> 95 </span> : : #define SPR_LPCR_P8_PECE4 PPC_BIT(51) /* Wake on MCs, HMIs, etc... */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> : : #define SPR_LPCR_P9_PECE (PPC_BITMASK(47,51) | PPC_BITMASK(17,17))</a>
+<a name="98"><span class="lineNum"> 98 </span> : : #define SPR_LPCR_P9_PECEU0 PPC_BIT(17) /* Wake on HVI */</a>
+<a name="99"><span class="lineNum"> 99 </span> : : #define SPR_LPCR_P9_PECEL0 PPC_BIT(47) /* Wake on priv doorbell */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : #define SPR_LPCR_P9_PECEL1 PPC_BIT(48) /* Wake on hv doorbell */</a>
+<a name="101"><span class="lineNum"> 101 </span> : : #define SPR_LPCR_P9_PECEL2 PPC_BIT(49) /* Wake on external interrupts */</a>
+<a name="102"><span class="lineNum"> 102 </span> : : #define SPR_LPCR_P9_PECEL3 PPC_BIT(50) /* Wake on decrementer */</a>
+<a name="103"><span class="lineNum"> 103 </span> : : #define SPR_LPCR_P9_PECEL4 PPC_BIT(51) /* Wake on MCs, HMIs, etc... */</a>
+<a name="104"><span class="lineNum"> 104 </span> : : #define SPR_LPCR_P9_LD PPC_BIT(46) /* Large decrementer mode bit */</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> : : /* Bits in TFMR - control bits */</a>
+<a name="108"><span class="lineNum"> 108 </span> : : #define SPR_TFMR_MAX_CYC_BET_STEPS PPC_BITMASK(0,7)</a>
+<a name="109"><span class="lineNum"> 109 </span> : : #define SPR_TFMR_N_CLKS_PER_STEP PPC_BITMASK(8,9)</a>
+<a name="110"><span class="lineNum"> 110 </span> : : #define SPR_TFMR_MASK_HMI PPC_BIT(10)</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #define SPR_TFMR_SYNC_BIT_SEL PPC_BITMASK(11,13)</a>
+<a name="112"><span class="lineNum"> 112 </span> : : #define SPR_TFMR_TB_ECLIPZ PPC_BIT(14)</a>
+<a name="113"><span class="lineNum"> 113 </span> : : #define SPR_TFMR_LOAD_TOD_MOD PPC_BIT(16)</a>
+<a name="114"><span class="lineNum"> 114 </span> : : #define SPR_TFMR_MOVE_CHIP_TOD_TO_TB PPC_BIT(18)</a>
+<a name="115"><span class="lineNum"> 115 </span> : : #define SPR_TFMR_CLEAR_TB_ERRORS PPC_BIT(24)</a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* Bits in TFMR - thread indep. status bits */</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #define SPR_TFMR_HDEC_PARITY_ERROR PPC_BIT(26)</a>
+<a name="118"><span class="lineNum"> 118 </span> : : #define SPR_TFMR_TBST_CORRUPT PPC_BIT(27)</a>
+<a name="119"><span class="lineNum"> 119 </span> : : #define SPR_TFMR_TBST_ENCODED PPC_BITMASK(28,31)</a>
+<a name="120"><span class="lineNum"> 120 </span> : : #define SPR_TFMR_TBST_LAST PPC_BITMASK(32,35)</a>
+<a name="121"><span class="lineNum"> 121 </span> : : #define SPR_TFMR_TB_ENABLED PPC_BIT(40)</a>
+<a name="122"><span class="lineNum"> 122 </span> : : #define SPR_TFMR_TB_VALID PPC_BIT(41)</a>
+<a name="123"><span class="lineNum"> 123 </span> : : #define SPR_TFMR_TB_SYNC_OCCURED PPC_BIT(42)</a>
+<a name="124"><span class="lineNum"> 124 </span> : : #define SPR_TFMR_TB_MISSING_SYNC PPC_BIT(43)</a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define SPR_TFMR_TB_MISSING_STEP PPC_BIT(44)</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #define SPR_TFMR_TB_RESIDUE_ERR PPC_BIT(45)</a>
+<a name="127"><span class="lineNum"> 127 </span> : : #define SPR_TFMR_FW_CONTROL_ERR PPC_BIT(46)</a>
+<a name="128"><span class="lineNum"> 128 </span> : : #define SPR_TFMR_CHIP_TOD_STATUS PPC_BITMASK(47,50)</a>
+<a name="129"><span class="lineNum"> 129 </span> : : #define SPR_TFMR_CHIP_TOD_INTERRUPT PPC_BIT(51)</a>
+<a name="130"><span class="lineNum"> 130 </span> : : #define SPR_TFMR_CHIP_TOD_TIMEOUT PPC_BIT(54)</a>
+<a name="131"><span class="lineNum"> 131 </span> : : #define SPR_TFMR_CHIP_TOD_PARITY_ERR PPC_BIT(56)</a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* Bits in TFMR - thread specific. status bits */</a>
+<a name="133"><span class="lineNum"> 133 </span> : : #define SPR_TFMR_PURR_PARITY_ERR PPC_BIT(57)</a>
+<a name="134"><span class="lineNum"> 134 </span> : : #define SPR_TFMR_SPURR_PARITY_ERR PPC_BIT(58)</a>
+<a name="135"><span class="lineNum"> 135 </span> : : #define SPR_TFMR_DEC_PARITY_ERR PPC_BIT(59)</a>
+<a name="136"><span class="lineNum"> 136 </span> : : #define SPR_TFMR_TFMR_CORRUPT PPC_BIT(60)</a>
+<a name="137"><span class="lineNum"> 137 </span> : : #define SPR_TFMR_PURR_OVERFLOW PPC_BIT(61)</a>
+<a name="138"><span class="lineNum"> 138 </span> : : #define SPR_TFMR_SPURR_OVERFLOW PPC_BIT(62)</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> : : /* Bits in HMER/HMEER */</a>
+<a name="141"><span class="lineNum"> 141 </span> : : #define SPR_HMER_MALFUNCTION_ALERT PPC_BIT(0)</a>
+<a name="142"><span class="lineNum"> 142 </span> : : #define SPR_HMER_PROC_RECV_DONE PPC_BIT(2)</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #define SPR_HMER_PROC_RECV_ERROR_MASKED PPC_BIT(3)</a>
+<a name="144"><span class="lineNum"> 144 </span> : : #define SPR_HMER_TFAC_ERROR PPC_BIT(4)</a>
+<a name="145"><span class="lineNum"> 145 </span> : : #define SPR_HMER_TFMR_PARITY_ERROR PPC_BIT(5)</a>
+<a name="146"><span class="lineNum"> 146 </span> : : #define SPR_HMER_XSCOM_FAIL PPC_BIT(8)</a>
+<a name="147"><span class="lineNum"> 147 </span> : : #define SPR_HMER_XSCOM_DONE PPC_BIT(9)</a>
+<a name="148"><span class="lineNum"> 148 </span> : : #define SPR_HMER_PROC_RECV_AGAIN PPC_BIT(11)</a>
+<a name="149"><span class="lineNum"> 149 </span> : : #define SPR_HMER_WARN_RISE PPC_BIT(14)</a>
+<a name="150"><span class="lineNum"> 150 </span> : : #define SPR_HMER_WARN_FALL PPC_BIT(15)</a>
+<a name="151"><span class="lineNum"> 151 </span> : : #define SPR_HMER_SCOM_FIR_HMI PPC_BIT(16)</a>
+<a name="152"><span class="lineNum"> 152 </span> : : #define SPR_HMER_TRIG_FIR_HMI PPC_BIT(17)</a>
+<a name="153"><span class="lineNum"> 153 </span> : : #define SPR_HMER_HYP_RESOURCE_ERR PPC_BIT(20)</a>
+<a name="154"><span class="lineNum"> 154 </span> : : #define SPR_HMER_XSCOM_STATUS PPC_BITMASK(21,23)</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> : : /*</a>
+<a name="157"><span class="lineNum"> 157 </span> : : * HMEER: initial bits for HMI interrupt enable mask.</a>
+<a name="158"><span class="lineNum"> 158 </span> : : * Per Dave Larson, never enable 8,9,21-23</a>
+<a name="159"><span class="lineNum"> 159 </span> : : */</a>
+<a name="160"><span class="lineNum"> 160 </span> : : #define SPR_HMEER_HMI_ENABLE_MASK (SPR_HMER_MALFUNCTION_ALERT |\</a>
+<a name="161"><span class="lineNum"> 161 </span> : : SPR_HMER_HYP_RESOURCE_ERR |\</a>
+<a name="162"><span class="lineNum"> 162 </span> : : SPR_HMER_PROC_RECV_DONE |\</a>
+<a name="163"><span class="lineNum"> 163 </span> : : SPR_HMER_PROC_RECV_ERROR_MASKED |\</a>
+<a name="164"><span class="lineNum"> 164 </span> : : SPR_HMER_TFAC_ERROR |\</a>
+<a name="165"><span class="lineNum"> 165 </span> : : SPR_HMER_TFMR_PARITY_ERROR |\</a>
+<a name="166"><span class="lineNum"> 166 </span> : : SPR_HMER_PROC_RECV_AGAIN)</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> : : /* Bits in HID0 */</a>
+<a name="169"><span class="lineNum"> 169 </span> : : #define SPR_HID0_POWER8_4LPARMODE PPC_BIT(2)</a>
+<a name="170"><span class="lineNum"> 170 </span> : : #define SPR_HID0_POWER8_2LPARMODE PPC_BIT(6)</a>
+<a name="171"><span class="lineNum"> 171 </span> : : #define SPR_HID0_POWER8_DYNLPARDIS PPC_BIT(15)</a>
+<a name="172"><span class="lineNum"> 172 </span> : : #define SPR_HID0_POWER8_HILE PPC_BIT(19)</a>
+<a name="173"><span class="lineNum"> 173 </span> : : #define SPR_HID0_POWER9_HILE PPC_BIT(4)</a>
+<a name="174"><span class="lineNum"> 174 </span> : : #define SPR_HID0_POWER8_ENABLE_ATTN PPC_BIT(31)</a>
+<a name="175"><span class="lineNum"> 175 </span> : : #define SPR_HID0_POWER9_ENABLE_ATTN (PPC_BIT(2) | PPC_BIT(3))</a>
+<a name="176"><span class="lineNum"> 176 </span> : : #define SPR_HID0_POWER9_RADIX PPC_BIT(8)</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> : : /* PVR bits */</a>
+<a name="179"><span class="lineNum"> 179 </span> : : #define SPR_PVR_TYPE 0xffff0000</a>
+<a name="180"><span class="lineNum"> 180 </span> : : #define SPR_PVR_CHIP_TYPE 0x0000f000</a>
+<a name="181"><span class="lineNum"> 181 </span> : : #define SPR_PVR_VERS_MAJ 0x00000f00</a>
+<a name="182"><span class="lineNum"> 182 </span> : : #define SPR_PVR_VERS_MIN 0x000000ff</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : #define PVR_TYPE(_pvr) GETFIELD(SPR_PVR_TYPE, _pvr)</a>
+<a name="185"><span class="lineNum"> 185 </span> : : #define PVR_CHIP_TYPE(_pvr) GETFIELD(SPR_PVR_CHIP_TYPE, _pvr)</a>
+<a name="186"><span class="lineNum"> 186 </span> : : #define PVR_VERS_MAJ(_pvr) GETFIELD(SPR_PVR_VERS_MAJ, _pvr)</a>
+<a name="187"><span class="lineNum"> 187 </span> : : #define PVR_VERS_MIN(_pvr) GETFIELD(SPR_PVR_VERS_MIN, _pvr)</a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> : : /* PVR definitions */</a>
+<a name="190"><span class="lineNum"> 190 </span> : : #define PVR_TYPE_P8E 0x004b /* Murano */</a>
+<a name="191"><span class="lineNum"> 191 </span> : : #define PVR_TYPE_P8 0x004d /* Venice */</a>
+<a name="192"><span class="lineNum"> 192 </span> : : #define PVR_TYPE_P8NVL 0x004c /* Naples */</a>
+<a name="193"><span class="lineNum"> 193 </span> : : #define PVR_TYPE_P9 0x004e</a>
+<a name="194"><span class="lineNum"> 194 </span> : : #define PVR_TYPE_P9P 0x004f /* Axone */</a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> : : #ifdef __ASSEMBLY__</a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> : : /* Thread priority control opcodes */</a>
+<a name="199"><span class="lineNum"> 199 </span> : : #define smt_low or 1,1,1</a>
+<a name="200"><span class="lineNum"> 200 </span> : : #define smt_medium or 2,2,2</a>
+<a name="201"><span class="lineNum"> 201 </span> : : #define smt_high or 3,3,3</a>
+<a name="202"><span class="lineNum"> 202 </span> : : #define smt_medium_high or 5,5,5</a>
+<a name="203"><span class="lineNum"> 203 </span> : : #define smt_medium_low or 6,6,6</a>
+<a name="204"><span class="lineNum"> 204 </span> : : #define smt_extra_high or 7,7,7</a>
+<a name="205"><span class="lineNum"> 205 </span> : : #define smt_very_low or 31,31,31</a>
+<a name="206"><span class="lineNum"> 206 </span> : : #define smt_lowest smt_low ; smt_very_low</a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> : : #else /* __ASSEMBLY__ */</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="211"><span class="lineNum"> 211 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="212"><span class="lineNum"> 212 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="213"><span class="lineNum"> 213 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> : : #define PPC_INST_NOP 0x60000000UL</a>
+<a name="216"><span class="lineNum"> 216 </span> : : #define PPC_INST_TRAP 0x7fe00008UL</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : #define RB(b) (((b) &amp; 0x1f) &lt;&lt; 11)</a>
+<a name="219"><span class="lineNum"> 219 </span> : : #define MSGSND(b) stringify(.long 0x7c00019c | RB(b))</a>
+<a name="220"><span class="lineNum"> 220 </span> : : #define MSGCLR(b) stringify(.long 0x7c0001dc | RB(b))</a>
+<a name="221"><span class="lineNum"> 221 </span> : : #define MSGSYNC stringify(.long 0x7c0006ec)</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 4 : static inline bool is_power9n(uint32_t version)</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : {</a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 4 : if (PVR_TYPE(version) != PVR_TYPE_P9)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : /*</a>
+<a name="228"><span class="lineNum"> 228 </span> : : * Bit 13 tells us:</a>
+<a name="229"><span class="lineNum"> 229 </span> : : * 0 = Scale out (aka Nimbus)</a>
+<a name="230"><span class="lineNum"> 230 </span> : : * 1 = Scale up (aka Cumulus)</a>
+<a name="231"><span class="lineNum"> 231 </span> : : */</a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 4 : if ((version &gt;&gt; 13) &amp; 1)</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 4 : return true;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : }</a>
+<a name="236"><span class="lineNum"> 236 </span> : : </a>
+<a name="237"><span class="lineNum"> 237 </span> : : static inline bool is_fused_core(uint32_t version)</a>
+<a name="238"><span class="lineNum"> 238 </span> : : {</a>
+<a name="239"><span class="lineNum"> 239 </span> : : if (PVR_TYPE(version) != PVR_TYPE_P9)</a>
+<a name="240"><span class="lineNum"> 240 </span> : : return false;</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : switch(PVR_CHIP_TYPE(version)) {</a>
+<a name="243"><span class="lineNum"> 243 </span> : : case 0:</a>
+<a name="244"><span class="lineNum"> 244 </span> : : case 2:</a>
+<a name="245"><span class="lineNum"> 245 </span> : : return true;</a>
+<a name="246"><span class="lineNum"> 246 </span> : : default:</a>
+<a name="247"><span class="lineNum"> 247 </span> : : return false;</a>
+<a name="248"><span class="lineNum"> 248 </span> : : }</a>
+<a name="249"><span class="lineNum"> 249 </span> : : }</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : static inline bool is_power9c(uint32_t version) </span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : {</a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineNoCov"> 0 : if (PVR_TYPE(version) != PVR_TYPE_P9)</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : /*</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * Bit 13 tells us:</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * 0 = Scale out (aka Nimbus)</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * 1 = Scale up (aka Cumulus)</a>
+<a name="260"><span class="lineNum"> 260 </span> : : */</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : if (!((version &gt;&gt; 13) &amp; 1))</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : }</a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> : : #ifndef __TEST__</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> : : /* POWER9 and above only */</a>
+<a name="269"><span class="lineNum"> 269 </span> : : static inline void flush_erat(void)</a>
+<a name="270"><span class="lineNum"> 270 </span> : : {</a>
+<a name="271"><span class="lineNum"> 271 </span> : : asm volatile(&quot;slbia 7&quot;);</a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> : : /*</a>
+<a name="275"><span class="lineNum"> 275 </span> : : * SMT priority</a>
+<a name="276"><span class="lineNum"> 276 </span> : : */</a>
+<a name="277"><span class="lineNum"> 277 </span> : : </a>
+<a name="278"><span class="lineNum"> 278 </span> : : static inline void smt_low(void) { asm volatile(&quot;or 1,1,1&quot;); }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : static inline void smt_medium(void) { asm volatile(&quot;or 2,2,2&quot;); }</a>
+<a name="280"><span class="lineNum"> 280 </span> : : static inline void smt_high(void) { asm volatile(&quot;or 3,3,3&quot;); }</a>
+<a name="281"><span class="lineNum"> 281 </span> : : static inline void smt_medium_high(void){ asm volatile(&quot;or 5,5,5&quot;); }</a>
+<a name="282"><span class="lineNum"> 282 </span> : : static inline void smt_medium_low(void) { asm volatile(&quot;or 6,6,6&quot;); }</a>
+<a name="283"><span class="lineNum"> 283 </span> : : static inline void smt_extra_high(void) { asm volatile(&quot;or 7,7,7&quot;); }</a>
+<a name="284"><span class="lineNum"> 284 </span> : : static inline void smt_very_low(void) { asm volatile(&quot;or 31,31,31&quot;); }</a>
+<a name="285"><span class="lineNum"> 285 </span> : : static inline void smt_lowest(void) { smt_low(); smt_very_low(); }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> : : /*</a>
+<a name="288"><span class="lineNum"> 288 </span> : : * SPR access functions</a>
+<a name="289"><span class="lineNum"> 289 </span> : : */</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> : : static inline unsigned long mfmsr(void)</a>
+<a name="292"><span class="lineNum"> 292 </span> : : {</a>
+<a name="293"><span class="lineNum"> 293 </span> : : unsigned long val;</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> : : asm volatile(&quot;mfmsr %0&quot; : &quot;=r&quot;(val) : : &quot;memory&quot;);</a>
+<a name="296"><span class="lineNum"> 296 </span> : : return val;</a>
+<a name="297"><span class="lineNum"> 297 </span> : : }</a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> : : static inline void mtmsr(unsigned long val)</a>
+<a name="300"><span class="lineNum"> 300 </span> : : {</a>
+<a name="301"><span class="lineNum"> 301 </span> : : asm volatile(&quot;mtmsr %0&quot; : : &quot;r&quot;(val) : &quot;memory&quot;);</a>
+<a name="302"><span class="lineNum"> 302 </span> : : }</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> : : static inline void mtmsrd(unsigned long val, int l)</a>
+<a name="305"><span class="lineNum"> 305 </span> : : {</a>
+<a name="306"><span class="lineNum"> 306 </span> : : asm volatile(&quot;mtmsrd %0,%1&quot; : : &quot;r&quot;(val), &quot;i&quot;(l) : &quot;memory&quot;);</a>
+<a name="307"><span class="lineNum"> 307 </span> : : }</a>
+<a name="308"><span class="lineNum"> 308 </span> : : </a>
+<a name="309"><span class="lineNum"> 309 </span> : : static inline __attribute__((always_inline))</a>
+<a name="310"><span class="lineNum"> 310 </span> : : unsigned long mfspr(const unsigned int spr)</a>
+<a name="311"><span class="lineNum"> 311 </span> : : {</a>
+<a name="312"><span class="lineNum"> 312 </span> : : unsigned long val;</a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> : : asm volatile(&quot;mfspr %0,%1&quot; : &quot;=r&quot;(val) : &quot;i&quot;(spr) : &quot;memory&quot;);</a>
+<a name="315"><span class="lineNum"> 315 </span> : : return val;</a>
+<a name="316"><span class="lineNum"> 316 </span> : : }</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> : : static inline __attribute__((always_inline))</a>
+<a name="319"><span class="lineNum"> 319 </span> : : void mtspr(const unsigned int spr, unsigned long val)</a>
+<a name="320"><span class="lineNum"> 320 </span> : : {</a>
+<a name="321"><span class="lineNum"> 321 </span> : : asm volatile(&quot;mtspr %0,%1&quot; : : &quot;i&quot;(spr), &quot;r&quot;(val) : &quot;memory&quot;);</a>
+<a name="322"><span class="lineNum"> 322 </span> : : }</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> : : /* Helpers for special sequences needed by some registers */</a>
+<a name="325"><span class="lineNum"> 325 </span> : : extern void set_hid0(unsigned long hid0);</a>
+<a name="326"><span class="lineNum"> 326 </span> : : extern void trigger_attn(void);</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /*</a>
+<a name="329"><span class="lineNum"> 329 </span> : : * Barriers</a>
+<a name="330"><span class="lineNum"> 330 </span> : : */</a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> : : static inline void eieio(void)</a>
+<a name="333"><span class="lineNum"> 333 </span> : : {</a>
+<a name="334"><span class="lineNum"> 334 </span> : : asm volatile(&quot;eieio&quot; : : : &quot;memory&quot;);</a>
+<a name="335"><span class="lineNum"> 335 </span> : : }</a>
+<a name="336"><span class="lineNum"> 336 </span> : : </a>
+<a name="337"><span class="lineNum"> 337 </span> : : static inline void sync(void)</a>
+<a name="338"><span class="lineNum"> 338 </span> : : {</a>
+<a name="339"><span class="lineNum"> 339 </span> : : asm volatile(&quot;sync&quot; : : : &quot;memory&quot;);</a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> : : static inline void lwsync(void)</a>
+<a name="343"><span class="lineNum"> 343 </span> : : {</a>
+<a name="344"><span class="lineNum"> 344 </span> : : asm volatile(&quot;lwsync&quot; : : : &quot;memory&quot;);</a>
+<a name="345"><span class="lineNum"> 345 </span> : : }</a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+<a name="347"><span class="lineNum"> 347 </span> : : static inline void isync(void)</a>
+<a name="348"><span class="lineNum"> 348 </span> : : {</a>
+<a name="349"><span class="lineNum"> 349 </span> : : asm volatile(&quot;isync&quot; : : : &quot;memory&quot;);</a>
+<a name="350"><span class="lineNum"> 350 </span> : : }</a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : </a>
+<a name="353"><span class="lineNum"> 353 </span> : : /*</a>
+<a name="354"><span class="lineNum"> 354 </span> : : * Cache sync</a>
+<a name="355"><span class="lineNum"> 355 </span> : : */</a>
+<a name="356"><span class="lineNum"> 356 </span> : : static inline void sync_icache(void)</a>
+<a name="357"><span class="lineNum"> 357 </span> : : {</a>
+<a name="358"><span class="lineNum"> 358 </span> : : asm volatile(&quot;sync; icbi 0,%0; sync; isync&quot; : : &quot;r&quot; (0) : &quot;memory&quot;);</a>
+<a name="359"><span class="lineNum"> 359 </span> : : }</a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /*</a>
+<a name="362"><span class="lineNum"> 362 </span> : : * Doorbells</a>
+<a name="363"><span class="lineNum"> 363 </span> : : */</a>
+<a name="364"><span class="lineNum"> 364 </span> : : static inline void msgclr(void)</a>
+<a name="365"><span class="lineNum"> 365 </span> : : {</a>
+<a name="366"><span class="lineNum"> 366 </span> : : uint64_t rb = (0x05 &lt;&lt; (63-36));</a>
+<a name="367"><span class="lineNum"> 367 </span> : : asm volatile(MSGCLR(%0) : : &quot;r&quot;(rb));</a>
+<a name="368"><span class="lineNum"> 368 </span> : : }</a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> : : static inline void p9_dbell_receive(void)</a>
+<a name="371"><span class="lineNum"> 371 </span> : : {</a>
+<a name="372"><span class="lineNum"> 372 </span> : : uint64_t rb = (0x05 &lt;&lt; (63-36));</a>
+<a name="373"><span class="lineNum"> 373 </span> : : asm volatile(MSGCLR(%0) &quot;;&quot;</a>
+<a name="374"><span class="lineNum"> 374 </span> : : MSGSYNC &quot;;&quot;</a>
+<a name="375"><span class="lineNum"> 375 </span> : : &quot;lwsync&quot;</a>
+<a name="376"><span class="lineNum"> 376 </span> : : : : &quot;r&quot;(rb));</a>
+<a name="377"><span class="lineNum"> 377 </span> : : }</a>
+<a name="378"><span class="lineNum"> 378 </span> : : </a>
+<a name="379"><span class="lineNum"> 379 </span> : : static inline void p9_dbell_send(uint32_t pir)</a>
+<a name="380"><span class="lineNum"> 380 </span> : : {</a>
+<a name="381"><span class="lineNum"> 381 </span> : : uint64_t rb = (0x05 &lt;&lt; (63-36)) | pir;</a>
+<a name="382"><span class="lineNum"> 382 </span> : : asm volatile(&quot;sync ;&quot;</a>
+<a name="383"><span class="lineNum"> 383 </span> : : MSGSND(%0)</a>
+<a name="384"><span class="lineNum"> 384 </span> : : : : &quot;r&quot;(rb));</a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> : : /*</a>
+<a name="388"><span class="lineNum"> 388 </span> : : * Byteswap load/stores</a>
+<a name="389"><span class="lineNum"> 389 </span> : : */</a>
+<a name="390"><span class="lineNum"> 390 </span> : : </a>
+<a name="391"><span class="lineNum"> 391 </span> : : static inline uint16_t ld_le16(const uint16_t *addr)</a>
+<a name="392"><span class="lineNum"> 392 </span> : : {</a>
+<a name="393"><span class="lineNum"> 393 </span> : : uint16_t val;</a>
+<a name="394"><span class="lineNum"> 394 </span> : : asm volatile(&quot;lhbrx %0,0,%1&quot; : &quot;=r&quot;(val) : &quot;r&quot;(addr), &quot;m&quot;(*addr));</a>
+<a name="395"><span class="lineNum"> 395 </span> : : return val;</a>
+<a name="396"><span class="lineNum"> 396 </span> : : }</a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> : : static inline uint32_t ld_le32(const uint32_t *addr)</a>
+<a name="399"><span class="lineNum"> 399 </span> : : {</a>
+<a name="400"><span class="lineNum"> 400 </span> : : uint32_t val;</a>
+<a name="401"><span class="lineNum"> 401 </span> : : asm volatile(&quot;lwbrx %0,0,%1&quot; : &quot;=r&quot;(val) : &quot;r&quot;(addr), &quot;m&quot;(*addr));</a>
+<a name="402"><span class="lineNum"> 402 </span> : : return val;</a>
+<a name="403"><span class="lineNum"> 403 </span> : : }</a>
+<a name="404"><span class="lineNum"> 404 </span> : : </a>
+<a name="405"><span class="lineNum"> 405 </span> : : static inline void st_le16(uint16_t *addr, uint16_t val)</a>
+<a name="406"><span class="lineNum"> 406 </span> : : {</a>
+<a name="407"><span class="lineNum"> 407 </span> : : asm volatile(&quot;sthbrx %0,0,%1&quot; : : &quot;r&quot;(val), &quot;r&quot;(addr), &quot;m&quot;(*addr));</a>
+<a name="408"><span class="lineNum"> 408 </span> : : }</a>
+<a name="409"><span class="lineNum"> 409 </span> : : </a>
+<a name="410"><span class="lineNum"> 410 </span> : : static inline void st_le32(uint32_t *addr, uint32_t val)</a>
+<a name="411"><span class="lineNum"> 411 </span> : : {</a>
+<a name="412"><span class="lineNum"> 412 </span> : : asm volatile(&quot;stwbrx %0,0,%1&quot; : : &quot;r&quot;(val), &quot;r&quot;(addr), &quot;m&quot;(*addr));</a>
+<a name="413"><span class="lineNum"> 413 </span> : : }</a>
+<a name="414"><span class="lineNum"> 414 </span> : : </a>
+<a name="415"><span class="lineNum"> 415 </span> : : #endif /* __TEST__ */</a>
+<a name="416"><span class="lineNum"> 416 </span> : : </a>
+<a name="417"><span class="lineNum"> 417 </span> : : #endif /* __ASSEMBLY__ */</a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> : : #endif /* __PROCESSOR_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/skiboot.h.func-sort-c.html b/coverage-report/include/skiboot.h.func-sort-c.html
new file mode 100644
index 0000000..9254ba3
--- /dev/null
+++ b/coverage-report/include/skiboot.h.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/skiboot.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - skiboot.h<span style="font-size: 80%;"> (<a href="skiboot.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="skiboot.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="skiboot.h.gcov.html#151">cleanup_addr</a></td>
+ <td class="coverFnHi">222</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="skiboot.h.gcov.html#48">is_rodata</a></td>
+ <td class="coverFnHi">5784</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/skiboot.h.func.html b/coverage-report/include/skiboot.h.func.html
new file mode 100644
index 0000000..8f968b2
--- /dev/null
+++ b/coverage-report/include/skiboot.h.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/skiboot.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - skiboot.h<span style="font-size: 80%;"> (<a href="skiboot.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="skiboot.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="skiboot.h.gcov.html#151">cleanup_addr</a></td>
+ <td class="coverFnHi">222</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="skiboot.h.gcov.html#48">is_rodata</a></td>
+ <td class="coverFnHi">5784</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/skiboot.h.gcov.html b/coverage-report/include/skiboot.h.gcov.html
new file mode 100644
index 0000000..75d3cf2
--- /dev/null
+++ b/coverage-report/include/skiboot.h.gcov.html
@@ -0,0 +1,433 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/skiboot.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - skiboot.h<span style="font-size: 80%;"> (source / <a href="skiboot.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __SKIBOOT_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __SKIBOOT_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;assert.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;errno.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;bitutils.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;types.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;ccan/list/list.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &lt;ccan/short_types/short_types.h&gt;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &lt;ccan/build_assert/build_assert.h&gt;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &lt;ccan/array_size/array_size.h&gt;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &lt;ccan/str/str.h&gt;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &lt;mem-map.h&gt;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &lt;op-panel.h&gt;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #include &lt;platform.h&gt;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : /* Special ELF sections */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #define __force_data __section(&quot;.force.data&quot;)</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : struct mem_region;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : extern struct mem_region *mem_region_next(struct mem_region *region);</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> : : /* Misc linker script symbols */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : extern char _start[];</a>
+<a name="40"><span class="lineNum"> 40 </span> : : extern char _head_end[];</a>
+<a name="41"><span class="lineNum"> 41 </span> : : extern char _stext[];</a>
+<a name="42"><span class="lineNum"> 42 </span> : : extern char _etext[];</a>
+<a name="43"><span class="lineNum"> 43 </span> : : extern char __sym_map_end[];</a>
+<a name="44"><span class="lineNum"> 44 </span> : : extern char _romem_end[];</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : #ifndef __TESTING__</a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* Readonly section start and end. */</a>
+<a name="48"><span class="lineNum"> 48 </span> : : extern char __rodata_start[], __rodata_end[];</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 5784 : static inline bool is_rodata(const void *p)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 5784 : return ((const char *)p &gt;= __rodata_start &amp;&amp; (const char *)p &lt; __rodata_end);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #else</a>
+<a name="55"><span class="lineNum"> 55 </span> : : static inline bool is_rodata(const void *p)</a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> : : return false;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : #endif</a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /* Console logging</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * Update console_get_level() if you add here</a>
+<a name="63"><span class="lineNum"> 63 </span> : : */</a>
+<a name="64"><span class="lineNum"> 64 </span> : : #define PR_EMERG 0</a>
+<a name="65"><span class="lineNum"> 65 </span> : : #define PR_ALERT 1</a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define PR_CRIT 2</a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define PR_ERR 3</a>
+<a name="68"><span class="lineNum"> 68 </span> : : #define PR_WARNING 4</a>
+<a name="69"><span class="lineNum"> 69 </span> : : #define PR_NOTICE 5</a>
+<a name="70"><span class="lineNum"> 70 </span> : : #define PR_PRINTF PR_NOTICE</a>
+<a name="71"><span class="lineNum"> 71 </span> : : #define PR_INFO 6</a>
+<a name="72"><span class="lineNum"> 72 </span> : : #define PR_DEBUG 7</a>
+<a name="73"><span class="lineNum"> 73 </span> : : #define PR_TRACE 8</a>
+<a name="74"><span class="lineNum"> 74 </span> : : #define PR_INSANE 9</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : #ifndef pr_fmt</a>
+<a name="77"><span class="lineNum"> 77 </span> : : #define pr_fmt(fmt) fmt</a>
+<a name="78"><span class="lineNum"> 78 </span> : : #endif</a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : void _prlog(int log_level, const char* fmt, ...) __attribute__((format (printf, 2, 3)));</a>
+<a name="81"><span class="lineNum"> 81 </span> : : #define prlog(l, f, ...) do { _prlog(l, pr_fmt(f), ##__VA_ARGS__); } while(0)</a>
+<a name="82"><span class="lineNum"> 82 </span> : : #define prerror(fmt...) do { prlog(PR_ERR, fmt); } while(0)</a>
+<a name="83"><span class="lineNum"> 83 </span> : : #define prlog_once(arg, ...) \</a>
+<a name="84"><span class="lineNum"> 84 </span> : : ({ \</a>
+<a name="85"><span class="lineNum"> 85 </span> : : static bool __prlog_once = false; \</a>
+<a name="86"><span class="lineNum"> 86 </span> : : if (!__prlog_once) { \</a>
+<a name="87"><span class="lineNum"> 87 </span> : : __prlog_once = true; \</a>
+<a name="88"><span class="lineNum"> 88 </span> : : prlog(arg, ##__VA_ARGS__); \</a>
+<a name="89"><span class="lineNum"> 89 </span> : : } \</a>
+<a name="90"><span class="lineNum"> 90 </span> : : })</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : /* Location codes -- at most 80 chars with null termination */</a>
+<a name="93"><span class="lineNum"> 93 </span> : : #define LOC_CODE_SIZE 80</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : /* Processor generation */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : enum proc_gen {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : proc_gen_unknown,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : proc_gen_p8,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : proc_gen_p9,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : };</a>
+<a name="101"><span class="lineNum"> 101 </span> : : extern enum proc_gen proc_gen;</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : extern unsigned int pcie_max_link_speed;</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> : : /* Convert a 4-bit number to a hex char */</a>
+<a name="106"><span class="lineNum"> 106 </span> : : extern char __attrconst tohex(uint8_t nibble);</a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> : : #ifndef __TEST__</a>
+<a name="109"><span class="lineNum"> 109 </span> : : /* Bit position of the most significant 1-bit (LSB=0, MSB=63) */</a>
+<a name="110"><span class="lineNum"> 110 </span> : : static inline int ilog2(unsigned long val)</a>
+<a name="111"><span class="lineNum"> 111 </span> : : {</a>
+<a name="112"><span class="lineNum"> 112 </span> : : int left_zeros;</a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : asm volatile (&quot;cntlzd %0,%1&quot; : &quot;=r&quot; (left_zeros) : &quot;r&quot; (val));</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : return 63 - left_zeros;</a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : static inline bool is_pow2(unsigned long val)</a>
+<a name="120"><span class="lineNum"> 120 </span> : : {</a>
+<a name="121"><span class="lineNum"> 121 </span> : : return val == (1ul &lt;&lt; ilog2(val));</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : #endif</a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define lo32(x) ((x) &amp; 0xffffffff)</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #define hi32(x) (((x) &gt;&gt; 32) &amp; 0xffffffff)</a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* WARNING: _a *MUST* be a power of two */</a>
+<a name="129"><span class="lineNum"> 129 </span> : : #define ALIGN_UP(_v, _a) (((_v) + (_a) - 1) &amp; ~((_a) - 1))</a>
+<a name="130"><span class="lineNum"> 130 </span> : : #define ALIGN_DOWN(_v, _a) ((_v) &amp; ~((_a) - 1))</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* TCE alignment */</a>
+<a name="133"><span class="lineNum"> 133 </span> : : #define TCE_SHIFT 12</a>
+<a name="134"><span class="lineNum"> 134 </span> : : #define TCE_PSIZE (1ul &lt;&lt; 12)</a>
+<a name="135"><span class="lineNum"> 135 </span> : : #define TCE_MASK (TCE_PSIZE - 1)</a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> : : /* Not the greatest variants but will do for now ... */</a>
+<a name="138"><span class="lineNum"> 138 </span> : : #define MIN(a, b) ((a) &lt; (b) ? (a) : (b))</a>
+<a name="139"><span class="lineNum"> 139 </span> : : #define MAX(a, b) ((a) &gt; (b) ? (a) : (b))</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : /* PCI Geographical Addressing */</a>
+<a name="142"><span class="lineNum"> 142 </span> : : #define PCI_BUS_NUM(bdfn) (((bdfn) &gt;&gt; 8) &amp; 0xff)</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #define PCI_DEV(bdfn) (((bdfn) &gt;&gt; 3) &amp; 0x1f)</a>
+<a name="144"><span class="lineNum"> 144 </span> : : #define PCI_FUNC(bdfn) ((bdfn) &amp; 0x07)</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> : : /*</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * To help the FSP to distinguish between physical address and TCE mapped address.</a>
+<a name="148"><span class="lineNum"> 148 </span> : : * Also to help hostboot to distinguish physical and relative address.</a>
+<a name="149"><span class="lineNum"> 149 </span> : : */</a>
+<a name="150"><span class="lineNum"> 150 </span> : : #define HRMOR_BIT (1ul &lt;&lt; 63)</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> : : /* Clean the stray high bit which the FSP inserts: we only have 52 bits real */</a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 222 : static inline u64 cleanup_addr(u64 addr)</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : {</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 222 : return addr &amp; ((1ULL &lt;&lt; 52) - 1);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> : : /* Start the kernel */</a>
+<a name="159"><span class="lineNum"> 159 </span> : : extern void start_kernel(uint64_t entry, void* fdt,</a>
+<a name="160"><span class="lineNum"> 160 </span> : : uint64_t mem_top) __noreturn;</a>
+<a name="161"><span class="lineNum"> 161 </span> : : extern void start_kernel32(uint64_t entry, void* fdt,</a>
+<a name="162"><span class="lineNum"> 162 </span> : : uint64_t mem_top) __noreturn;</a>
+<a name="163"><span class="lineNum"> 163 </span> : : extern void start_kernel_secondary(uint64_t entry) __noreturn;</a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* Get description of machine from HDAT and create device-tree */</a>
+<a name="166"><span class="lineNum"> 166 </span> : : extern int parse_hdat(bool is_opal);</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> : : struct dt_node;</a>
+<a name="169"><span class="lineNum"> 169 </span> : : </a>
+<a name="170"><span class="lineNum"> 170 </span> : : /* Add /cpus/features node for boot environment that passes an fdt */</a>
+<a name="171"><span class="lineNum"> 171 </span> : : extern void dt_add_cpufeatures(struct dt_node *root);</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> : : /* Root of device tree. */</a>
+<a name="174"><span class="lineNum"> 174 </span> : : extern struct dt_node *dt_root;</a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> : : /* Full skiboot version number (possibly includes gitid). */</a>
+<a name="177"><span class="lineNum"> 177 </span> : : extern const char version[];</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> : : /* Debug support */</a>
+<a name="180"><span class="lineNum"> 180 </span> : : extern char __sym_map_start[];</a>
+<a name="181"><span class="lineNum"> 181 </span> : : extern char __sym_map_end[];</a>
+<a name="182"><span class="lineNum"> 182 </span> : : extern size_t snprintf_symbol(char *buf, size_t len, uint64_t addr);</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> : : /* Direct controls */</a>
+<a name="185"><span class="lineNum"> 185 </span> : : extern void direct_controls_init(void);</a>
+<a name="186"><span class="lineNum"> 186 </span> : : extern int64_t opal_signal_system_reset(int cpu_nr);</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> : : /* Fast reboot support */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : extern void disable_fast_reboot(const char *reason);</a>
+<a name="190"><span class="lineNum"> 190 </span> : : extern void add_fast_reboot_dt_entries(void);</a>
+<a name="191"><span class="lineNum"> 191 </span> : : extern void fast_reboot(void);</a>
+<a name="192"><span class="lineNum"> 192 </span> : : extern void __noreturn __secondary_cpu_entry(void);</a>
+<a name="193"><span class="lineNum"> 193 </span> : : extern void __noreturn load_and_boot_kernel(bool is_reboot);</a>
+<a name="194"><span class="lineNum"> 194 </span> : : extern void cleanup_local_tlb(void);</a>
+<a name="195"><span class="lineNum"> 195 </span> : : extern void cleanup_global_tlb(void);</a>
+<a name="196"><span class="lineNum"> 196 </span> : : extern void init_shared_sprs(void);</a>
+<a name="197"><span class="lineNum"> 197 </span> : : extern void init_replicated_sprs(void);</a>
+<a name="198"><span class="lineNum"> 198 </span> : : extern bool start_preload_kernel(void);</a>
+<a name="199"><span class="lineNum"> 199 </span> : : extern void copy_exception_vectors(void);</a>
+<a name="200"><span class="lineNum"> 200 </span> : : extern void copy_sreset_vector(void);</a>
+<a name="201"><span class="lineNum"> 201 </span> : : extern void copy_sreset_vector_fast_reboot(void);</a>
+<a name="202"><span class="lineNum"> 202 </span> : : extern void patch_traps(bool enable);</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> : : /* Various probe routines, to replace with an initcall system */</a>
+<a name="205"><span class="lineNum"> 205 </span> : : extern void probe_phb3(void);</a>
+<a name="206"><span class="lineNum"> 206 </span> : : extern void probe_phb4(void);</a>
+<a name="207"><span class="lineNum"> 207 </span> : : extern int preload_capp_ucode(void);</a>
+<a name="208"><span class="lineNum"> 208 </span> : : extern void preload_io_vpd(void);</a>
+<a name="209"><span class="lineNum"> 209 </span> : : extern void probe_npu(void);</a>
+<a name="210"><span class="lineNum"> 210 </span> : : extern void probe_npu2(void);</a>
+<a name="211"><span class="lineNum"> 211 </span> : : extern void probe_npu3(void);</a>
+<a name="212"><span class="lineNum"> 212 </span> : : extern void uart_init(void);</a>
+<a name="213"><span class="lineNum"> 213 </span> : : extern void mbox_init(void);</a>
+<a name="214"><span class="lineNum"> 214 </span> : : extern void early_uart_init(void);</a>
+<a name="215"><span class="lineNum"> 215 </span> : : extern void homer_init(void);</a>
+<a name="216"><span class="lineNum"> 216 </span> : : extern void slw_init(void);</a>
+<a name="217"><span class="lineNum"> 217 </span> : : extern void add_cpu_idle_state_properties(void);</a>
+<a name="218"><span class="lineNum"> 218 </span> : : extern void lpc_rtc_init(void);</a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> : : /* flash support */</a>
+<a name="221"><span class="lineNum"> 221 </span> : : struct flash_chip;</a>
+<a name="222"><span class="lineNum"> 222 </span> : : extern int flash_register(struct blocklevel_device *bl);</a>
+<a name="223"><span class="lineNum"> 223 </span> : : extern int flash_start_preload_resource(enum resource_id id, uint32_t subid,</a>
+<a name="224"><span class="lineNum"> 224 </span> : : void *buf, size_t *len);</a>
+<a name="225"><span class="lineNum"> 225 </span> : : extern int flash_resource_loaded(enum resource_id id, uint32_t idx);</a>
+<a name="226"><span class="lineNum"> 226 </span> : : extern bool flash_reserve(void);</a>
+<a name="227"><span class="lineNum"> 227 </span> : : extern void flash_release(void);</a>
+<a name="228"><span class="lineNum"> 228 </span> : : extern bool flash_unregister(void);</a>
+<a name="229"><span class="lineNum"> 229 </span> : : #define FLASH_SUBPART_ALIGNMENT 0x1000</a>
+<a name="230"><span class="lineNum"> 230 </span> : : #define FLASH_SUBPART_HEADER_SIZE FLASH_SUBPART_ALIGNMENT</a>
+<a name="231"><span class="lineNum"> 231 </span> : : extern int flash_subpart_info(void *part_header, uint32_t header_len,</a>
+<a name="232"><span class="lineNum"> 232 </span> : : uint32_t part_size, uint32_t *part_actual,</a>
+<a name="233"><span class="lineNum"> 233 </span> : : uint32_t subid, uint32_t *offset,</a>
+<a name="234"><span class="lineNum"> 234 </span> : : uint32_t *size);</a>
+<a name="235"><span class="lineNum"> 235 </span> : : extern void flash_fw_version_preload(void);</a>
+<a name="236"><span class="lineNum"> 236 </span> : : extern void flash_dt_add_fw_version(void);</a>
+<a name="237"><span class="lineNum"> 237 </span> : : extern const char *flash_map_resource_name(enum resource_id id);</a>
+<a name="238"><span class="lineNum"> 238 </span> : : extern int flash_secboot_info(uint32_t *total_size);</a>
+<a name="239"><span class="lineNum"> 239 </span> : : extern int flash_secboot_read(void *dst, uint32_t src, uint32_t len);</a>
+<a name="240"><span class="lineNum"> 240 </span> : : extern int flash_secboot_write(uint32_t dst, void *src, uint32_t len);</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : /*</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * Decompression routines</a>
+<a name="244"><span class="lineNum"> 244 </span> : : *</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * The below structure members are needed for the xz library routines,</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * src: Source address (The compressed binary)</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * src_size: Source size</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * dst: Destination address (The memory area where the `src` will be</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * decompressed)</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * dst_size: Destination size</a>
+<a name="251"><span class="lineNum"> 251 </span> : : */</a>
+<a name="252"><span class="lineNum"> 252 </span> : : struct xz_decompress {</a>
+<a name="253"><span class="lineNum"> 253 </span> : : void *dst;</a>
+<a name="254"><span class="lineNum"> 254 </span> : : void *src;</a>
+<a name="255"><span class="lineNum"> 255 </span> : : size_t dst_size;</a>
+<a name="256"><span class="lineNum"> 256 </span> : : size_t src_size;</a>
+<a name="257"><span class="lineNum"> 257 </span> : : /* The status of the decompress process:</a>
+<a name="258"><span class="lineNum"> 258 </span> : : - OPAL_PARTIAL: if the job is in progress</a>
+<a name="259"><span class="lineNum"> 259 </span> : : - OPAL_SUCCESS: if the job is successful</a>
+<a name="260"><span class="lineNum"> 260 </span> : : - OPAL_NO_MEM: memory allocation failure</a>
+<a name="261"><span class="lineNum"> 261 </span> : : - OPAL_PARAMETER: If any of the above (src, dst..) are invalid or</a>
+<a name="262"><span class="lineNum"> 262 </span> : : if xz decompress fails. In which case the caller should check the</a>
+<a name="263"><span class="lineNum"> 263 </span> : : xz_error for failure reason.</a>
+<a name="264"><span class="lineNum"> 264 </span> : : */</a>
+<a name="265"><span class="lineNum"> 265 </span> : : int status;</a>
+<a name="266"><span class="lineNum"> 266 </span> : : int xz_error;</a>
+<a name="267"><span class="lineNum"> 267 </span> : : /* The decompression job, this will be freed if the caller uses</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * `wait_xz_decompression` function, in any other case its the</a>
+<a name="269"><span class="lineNum"> 269 </span> : : * responsibility of caller to free the allocation job. */</a>
+<a name="270"><span class="lineNum"> 270 </span> : : struct cpu_job *job;</a>
+<a name="271"><span class="lineNum"> 271 </span> : : };</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> : : extern void xz_start_decompress(struct xz_decompress *);</a>
+<a name="274"><span class="lineNum"> 274 </span> : : extern void wait_xz_decompress(struct xz_decompress *);</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /* NVRAM support */</a>
+<a name="277"><span class="lineNum"> 277 </span> : : extern void nvram_init(void);</a>
+<a name="278"><span class="lineNum"> 278 </span> : : extern void nvram_read_complete(bool success);</a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> : : /* UART stuff */</a>
+<a name="281"><span class="lineNum"> 281 </span> : : enum {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : UART_CONSOLE_OPAL,</a>
+<a name="283"><span class="lineNum"> 283 </span> : : UART_CONSOLE_OS</a>
+<a name="284"><span class="lineNum"> 284 </span> : : };</a>
+<a name="285"><span class="lineNum"> 285 </span> : : extern void uart_set_console_policy(int policy);</a>
+<a name="286"><span class="lineNum"> 286 </span> : : extern bool uart_enabled(void);</a>
+<a name="287"><span class="lineNum"> 287 </span> : : </a>
+<a name="288"><span class="lineNum"> 288 </span> : : /* PRD */</a>
+<a name="289"><span class="lineNum"> 289 </span> : : extern void prd_psi_interrupt(uint32_t proc);</a>
+<a name="290"><span class="lineNum"> 290 </span> : : extern void prd_tmgt_interrupt(uint32_t proc);</a>
+<a name="291"><span class="lineNum"> 291 </span> : : extern void prd_occ_reset(uint32_t proc);</a>
+<a name="292"><span class="lineNum"> 292 </span> : : extern void prd_sbe_passthrough(uint32_t proc);</a>
+<a name="293"><span class="lineNum"> 293 </span> : : extern void prd_init(void);</a>
+<a name="294"><span class="lineNum"> 294 </span> : : extern void prd_register_reserved_memory(void);</a>
+<a name="295"><span class="lineNum"> 295 </span> : : extern void prd_fsp_occ_reset(uint32_t proc);</a>
+<a name="296"><span class="lineNum"> 296 </span> : : extern void prd_fsp_occ_load_start(u32 proc);</a>
+<a name="297"><span class="lineNum"> 297 </span> : : extern void prd_fw_resp_fsp_response(int status);</a>
+<a name="298"><span class="lineNum"> 298 </span> : : extern int prd_hbrt_fsp_msg_notify(void *data, u32 dsize);</a>
+<a name="299"><span class="lineNum"> 299 </span> : : </a>
+<a name="300"><span class="lineNum"> 300 </span> : : /* Flatten device-tree */</a>
+<a name="301"><span class="lineNum"> 301 </span> : : extern void *create_dtb(const struct dt_node *root, bool exclusive);</a>
+<a name="302"><span class="lineNum"> 302 </span> : : </a>
+<a name="303"><span class="lineNum"> 303 </span> : : /* Track failure in Wakup engine */</a>
+<a name="304"><span class="lineNum"> 304 </span> : : enum wakeup_engine_states {</a>
+<a name="305"><span class="lineNum"> 305 </span> : : WAKEUP_ENGINE_NOT_PRESENT,</a>
+<a name="306"><span class="lineNum"> 306 </span> : : WAKEUP_ENGINE_PRESENT,</a>
+<a name="307"><span class="lineNum"> 307 </span> : : WAKEUP_ENGINE_FAILED</a>
+<a name="308"><span class="lineNum"> 308 </span> : : };</a>
+<a name="309"><span class="lineNum"> 309 </span> : : extern enum wakeup_engine_states wakeup_engine_state;</a>
+<a name="310"><span class="lineNum"> 310 </span> : : extern bool has_deep_states;</a>
+<a name="311"><span class="lineNum"> 311 </span> : : extern void nx_p9_rng_late_init(void);</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> : : /* SLW reinit function for switching core settings */</a>
+<a name="316"><span class="lineNum"> 316 </span> : : extern int64_t slw_reinit(uint64_t flags);</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> : : /* Patch SPR in SLW image */</a>
+<a name="319"><span class="lineNum"> 319 </span> : : extern int64_t opal_slw_set_reg(uint64_t cpu_pir, uint64_t sprn, uint64_t val);</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : extern void fast_sleep_exit(void);</a>
+<a name="322"><span class="lineNum"> 322 </span> : : </a>
+<a name="323"><span class="lineNum"> 323 </span> : : /* Fallback fake RTC */</a>
+<a name="324"><span class="lineNum"> 324 </span> : : extern void fake_rtc_init(void);</a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> : : /* Exceptions */</a>
+<a name="327"><span class="lineNum"> 327 </span> : : struct stack_frame;</a>
+<a name="328"><span class="lineNum"> 328 </span> : : extern void exception_entry(struct stack_frame *stack);</a>
+<a name="329"><span class="lineNum"> 329 </span> : : extern void exception_entry_pm_sreset(void);</a>
+<a name="330"><span class="lineNum"> 330 </span> : : extern void __noreturn exception_entry_pm_mce(void);</a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> : : /* Assembly in head.S */</a>
+<a name="333"><span class="lineNum"> 333 </span> : : extern void disable_machine_check(void);</a>
+<a name="334"><span class="lineNum"> 334 </span> : : extern void enable_machine_check(void);</a>
+<a name="335"><span class="lineNum"> 335 </span> : : extern unsigned int enter_p8_pm_state(bool winkle);</a>
+<a name="336"><span class="lineNum"> 336 </span> : : extern unsigned int enter_p9_pm_state(uint64_t psscr);</a>
+<a name="337"><span class="lineNum"> 337 </span> : : extern void enter_p9_pm_lite_state(uint64_t psscr);</a>
+<a name="338"><span class="lineNum"> 338 </span> : : extern uint32_t reset_patch_start;</a>
+<a name="339"><span class="lineNum"> 339 </span> : : extern uint32_t reset_patch_end;</a>
+<a name="340"><span class="lineNum"> 340 </span> : : extern uint32_t reset_fast_reboot_patch_start;</a>
+<a name="341"><span class="lineNum"> 341 </span> : : extern uint32_t reset_fast_reboot_patch_end;</a>
+<a name="342"><span class="lineNum"> 342 </span> : : </a>
+<a name="343"><span class="lineNum"> 343 </span> : : /* Fallback fake NVRAM */</a>
+<a name="344"><span class="lineNum"> 344 </span> : : extern int fake_nvram_info(uint32_t *total_size);</a>
+<a name="345"><span class="lineNum"> 345 </span> : : extern int fake_nvram_start_read(void *dst, uint32_t src, uint32_t len);</a>
+<a name="346"><span class="lineNum"> 346 </span> : : extern int fake_nvram_write(uint32_t offset, void *src, uint32_t size);</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : #endif /* __SKIBOOT_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/time-utils.h.func-sort-c.html b/coverage-report/include/time-utils.h.func-sort-c.html
new file mode 100644
index 0000000..3487e64
--- /dev/null
+++ b/coverage-report/include/time-utils.h.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/time-utils.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - time-utils.h<span style="font-size: 80%;"> (<a href="time-utils.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="time-utils.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.h.gcov.html#21">int_to_bcd4</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.h.gcov.html#10">bcd_byte</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.h.gcov.html#16">int_to_bcd2</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/time-utils.h.func.html b/coverage-report/include/time-utils.h.func.html
new file mode 100644
index 0000000..7e7e7df
--- /dev/null
+++ b/coverage-report/include/time-utils.h.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/time-utils.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - time-utils.h<span style="font-size: 80%;"> (<a href="time-utils.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="time-utils.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.h.gcov.html#10">bcd_byte</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.h.gcov.html#16">int_to_bcd2</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time-utils.h.gcov.html#21">int_to_bcd4</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/time-utils.h.gcov.html b/coverage-report/include/time-utils.h.gcov.html
new file mode 100644
index 0000000..37936bd
--- /dev/null
+++ b/coverage-report/include/time-utils.h.gcov.html
@@ -0,0 +1,116 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/time-utils.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - time-utils.h<span style="font-size: 80%;"> (source / <a href="time-utils.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2015 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef __TIME_UTILS_H</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define __TIME_UTILS_H</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;time.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : /* BCD conversion utilities. MSB is byte 3, LSB is byte 0 */</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 7 : static inline unsigned int bcd_byte(uint32_t bcd, int byteno)</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : {</a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 7 : bcd &gt;&gt;= byteno * 8;</span></a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 7 : return (bcd &gt;&gt; 4 &amp; 0xf) * 10 + (bcd &amp; 0xf);</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : }</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 7 : static inline uint32_t int_to_bcd2(unsigned int x)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 7 : return (((x / 10) &lt;&lt; 4) &amp; 0xf0) | (x % 10);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : }</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : static inline uint32_t int_to_bcd4(unsigned int x)</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : {</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : return int_to_bcd2(x / 100) &lt;&lt; 8 | int_to_bcd2(x % 100);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : void tm_to_datetime(struct tm *tm, uint32_t *y_m_d, uint64_t *h_m_s_m);</a>
+<a name="29"><span class="lineNum"> 29 </span> : : void datetime_to_tm(uint32_t y_m_d, uint64_t h_m_s_m, struct tm *tm);</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : #endif</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/timebase.h.func-sort-c.html b/coverage-report/include/timebase.h.func-sort-c.html
new file mode 100644
index 0000000..257af9b
--- /dev/null
+++ b/coverage-report/include/timebase.h.func-sort-c.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/timebase.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - timebase.h<span style="font-size: 80%;"> (<a href="timebase.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="timebase.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#63">tb_to_msecs</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#73">tb_to_usecs</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#43">secs_to_tb</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#32">tb_compare</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#68">usecs_to_tb</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#58">msecs_to_tb</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#53">tb_remaining_nsecs</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#48">tb_to_secs</a></td>
+ <td class="coverFnHi">1902</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/timebase.h.func.html b/coverage-report/include/timebase.h.func.html
new file mode 100644
index 0000000..1f04e24
--- /dev/null
+++ b/coverage-report/include/timebase.h.func.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/timebase.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - timebase.h<span style="font-size: 80%;"> (<a href="timebase.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="timebase.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#58">msecs_to_tb</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#43">secs_to_tb</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#32">tb_compare</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#53">tb_remaining_nsecs</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#63">tb_to_msecs</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#48">tb_to_secs</a></td>
+ <td class="coverFnHi">1902</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#73">tb_to_usecs</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="timebase.h.gcov.html#68">usecs_to_tb</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/include/timebase.h.gcov.html b/coverage-report/include/timebase.h.gcov.html
new file mode 100644
index 0000000..15d9219
--- /dev/null
+++ b/coverage-report/include/timebase.h.gcov.html
@@ -0,0 +1,181 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - include/timebase.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">include</a> - timebase.h<span style="font-size: 80%;"> (source / <a href="timebase.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Timebase helpers.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Note: Only use after the TODs are in sync !</a>
+<a name="6"><span class="lineNum"> 6 </span> : : *</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * Copyright 2013-2016 IBM Corp.</a>
+<a name="8"><span class="lineNum"> 8 </span> : : */</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #ifndef __TIME_H</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define __TIME_H</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;time.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #ifndef __TEST__</a>
+<a name="16"><span class="lineNum"> 16 </span> : : static inline unsigned long mftb(void)</a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : unsigned long tb;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* We use a memory clobber to avoid this being</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * moved in the instruction stream</a>
+<a name="22"><span class="lineNum"> 22 </span> : : */</a>
+<a name="23"><span class="lineNum"> 23 </span> : : asm volatile(&quot;mftb %0&quot; : &quot;=r&quot;(tb) : : &quot;memory&quot;);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : return tb;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #endif</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : enum tb_cmpval {</a>
+<a name="29"><span class="lineNum"> 29 </span> : : TB_ABEFOREB = -1,</a>
+<a name="30"><span class="lineNum"> 30 </span> : : TB_AEQUALB = 0,</a>
+<a name="31"><span class="lineNum"> 31 </span> : : TB_AAFTERB = 1</a>
+<a name="32"><span class="lineNum"> 32 </span> : : };</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 3 : static inline enum tb_cmpval tb_compare(unsigned long a,</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : unsigned long b)</a>
+<a name="36"><span class="lineNum"> 36 </span> : : {</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 3 : if (a == b)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : return TB_AEQUALB;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 2 : return ((long)(b - a)) &gt; 0 ? TB_ABEFOREB : TB_AAFTERB;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /* Architected timebase */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : extern unsigned long tb_hz;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 3 : static inline unsigned long secs_to_tb(unsigned long secs)</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : {</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 3 : return secs * tb_hz;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : }</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1902 : static inline unsigned long tb_to_secs(unsigned long tb)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1902 : return tb / tb_hz;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 11 : static inline unsigned long tb_remaining_nsecs(unsigned long tb)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 11 : return tb % tb_hz;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 7 : static inline unsigned long msecs_to_tb(unsigned long msecs)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 7 : return msecs * (tb_hz / 1000);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : static inline unsigned long tb_to_msecs(unsigned long tb)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : {</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : return (tb * 1000) / tb_hz;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 5 : static inline unsigned long usecs_to_tb(unsigned long usecs)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 5 : return usecs * (tb_hz / 1000000);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 2 : static inline unsigned long tb_to_usecs(unsigned long tb)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : {</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 2 : return (tb * 1000000) / tb_hz;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : extern unsigned long timespec_to_tb(const struct timespec *ts);</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* time_wait - Wait a certain number of TB ticks while polling FSP */</a>
+<a name="83"><span class="lineNum"> 83 </span> : : extern void time_wait(unsigned long duration);</a>
+<a name="84"><span class="lineNum"> 84 </span> : : extern void time_wait_nopoll(unsigned long duration);</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : /* time_wait_ms - Wait a certain number of milliseconds while polling FSP */</a>
+<a name="87"><span class="lineNum"> 87 </span> : : extern void time_wait_ms(unsigned long ms);</a>
+<a name="88"><span class="lineNum"> 88 </span> : : extern void time_wait_ms_nopoll(unsigned long ms);</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> : : /* time_wait_us - Wait a certain number of microseconds while polling FSP */</a>
+<a name="91"><span class="lineNum"> 91 </span> : : extern void time_wait_us(unsigned long us);</a>
+<a name="92"><span class="lineNum"> 92 </span> : : extern void time_wait_us_nopoll(unsigned long us);</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* nanosleep_nopoll - variant for use from hostservices */</a>
+<a name="95"><span class="lineNum"> 95 </span> : : extern int nanosleep_nopoll(const struct timespec *req, struct timespec *rem);</a>
+<a name="96"><span class="lineNum"> 96 </span> : : #endif /* __TIME_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/index-sort-b.html b/coverage-report/index-sort-b.html
new file mode 100644
index 0000000..aaef702
--- /dev/null
+++ b/coverage-report/index-sort-b.html
@@ -0,0 +1,767 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info</title>
+ <link rel="stylesheet" type="text/css" href="gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue">top level</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">14185</td>
+ <td class="headerCovTableEntry">23224</td>
+ <td class="headerCovTableEntryLo">61.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1157</td>
+ <td class="headerCovTableEntry">1572</td>
+ <td class="headerCovTableEntryLo">73.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Directory <span class="tableHeadSort"><a href="index.html"><img src="updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/test/index.html">libflash/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=74 height=10 alt="73.9%"><img src="snow.png" width=26 height=10 alt="73.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.9&nbsp;%</td>
+ <td class="coverNumLo">1368 / 1851</td>
+ <td class="coverPerHi">95.2&nbsp;%</td>
+ <td class="coverNumHi">119 / 125</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/index.html">external/pflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=60 height=10 alt="60.1%"><img src="snow.png" width=40 height=10 alt="60.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">60.1&nbsp;%</td>
+ <td class="coverNumLo">485 / 807</td>
+ <td class="coverPerMed">78.9&nbsp;%</td>
+ <td class="coverNumMed">15 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/test/index.html">libstb/secvar/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="99.5%"><img src="snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">580 / 583</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">22 / 22</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/index.html">external/gard</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=70 height=10 alt="69.7%"><img src="snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/test/index.html">ccan/endian/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/index.html">ccan/str</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/index.html">ccan/heap</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.3%"><img src="snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/ccan/endian/index.html">external/ffspart/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=50 height=10 alt="50.0%"><img src="snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/storage/index.html">libstb/secvar/storage</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=47 height=10 alt="47.2%"><img src="snow.png" width=53 height=10 alt="47.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">47.2&nbsp;%</td>
+ <td class="coverNumLo">201 / 426</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">18 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/index.html">libc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/short_types/test/index.html">ccan/short_types/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="include/index.html">include</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=83 height=10 alt="82.9%"><img src="snow.png" width=17 height=10 alt="82.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.9&nbsp;%</td>
+ <td class="coverNumMed">63 / 76</td>
+ <td class="coverPerMed">88.9&nbsp;%</td>
+ <td class="coverNumMed">24 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/container_of/test/index.html">ccan/container_of/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/list/index.html">external/pflash/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdlib/index.html">libc/stdlib</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="94.8%"><img src="snow.png" width=5 height=10 alt="94.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.8&nbsp;%</td>
+ <td class="coverNumHi">73 / 77</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/index.html">libstb</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=15 height=10 alt="14.9%"><img src="snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/index.html">hw/ipmi</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=65 height=10 alt="64.6%"><img src="snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/test/index.html">ccan/heap/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="75.7%"><img src="snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/endian/index.html">external/pflash/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.7%"><img src="snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/test/index.html">hw/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="76.5%"><img src="snow.png" width=24 height=10 alt="76.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.5&nbsp;%</td>
+ <td class="coverNumMed">117 / 153</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/crypto/pkcs7/index.html">libstb/crypto/pkcs7</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=73 height=10 alt="73.4%"><img src="snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/endian/index.html">external/gard/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=33 height=10 alt="33.3%"><img src="snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/index.html">ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/index.html">core</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=75 height=10 alt="74.6%"><img src="snow.png" width=25 height=10 alt="74.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.6&nbsp;%</td>
+ <td class="coverNumLo">2002 / 2683</td>
+ <td class="coverPerMed">81.9&nbsp;%</td>
+ <td class="coverNumMed">186 / 227</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/backend/index.html">libstb/secvar/backend</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=82 height=10 alt="82.0%"><img src="snow.png" width=18 height=10 alt="82.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.0&nbsp;%</td>
+ <td class="coverNumMed">423 / 516</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/bits/index.html">/usr/include/bits</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/test/index.html">libc/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.4%"><img src="snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">377 / 383</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">31 / 31</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/index.html">libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.6%"><img src="snow.png" width=33 height=10 alt="66.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.6&nbsp;%</td>
+ <td class="coverNumLo">1733 / 2603</td>
+ <td class="coverPerMed">84.8&nbsp;%</td>
+ <td class="coverNumMed">145 / 171</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt/index.html">libfdt</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=31 height=10 alt="31.0%"><img src="snow.png" width=69 height=10 alt="31.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.0&nbsp;%</td>
+ <td class="coverNumLo">262 / 845</td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">46 / 95</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/libflash/index.html">external/gard/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=20 height=10 alt="19.9%"><img src="snow.png" width=80 height=10 alt="19.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">19.9&nbsp;%</td>
+ <td class="coverNumLo">305 / 1530</td>
+ <td class="coverPerLo">30.6&nbsp;%</td>
+ <td class="coverNumLo">26 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/test/index.html">libstb/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/libflash/index.html">external/pflash/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=27 height=10 alt="26.7%"><img src="snow.png" width=73 height=10 alt="26.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">26.7&nbsp;%</td>
+ <td class="coverNumLo">409 / 1530</td>
+ <td class="coverPerLo">43.5&nbsp;%</td>
+ <td class="coverNumLo">37 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/common/index.html">external/pflash/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/index.html">external/ffspart</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=45 height=10 alt="45.3%"><img src="snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/test/index.html">ccan/list/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.1%"><img src="snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">310 / 316</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/test/index.html">ccan/str/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">84 / 84</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/index.html">hdata</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">1237 / 2675</td>
+ <td class="coverPerLo">68.0&nbsp;%</td>
+ <td class="coverNumLo">100 / 147</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/check_type/test/index.html">ccan/check_type/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/common/index.html">external/gard/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/libflash/index.html">external/ffspart/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=25 height=10 alt="25.2%"><img src="snow.png" width=75 height=10 alt="25.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.2&nbsp;%</td>
+ <td class="coverNumLo">385 / 1530</td>
+ <td class="coverPerLo">35.3&nbsp;%</td>
+ <td class="coverNumLo">30 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdio/index.html">libc/stdio</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="97.5%"><img src="snow.png" width=2 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">159 / 163</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/test/index.html">hdata/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=64 height=10 alt="63.8%"><img src="snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/ctype/index.html">libc/ctype</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/build_assert/test/index.html">ccan/build_assert/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/test/index.html">core/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=97 height=10 alt="97.1%"><img src="snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">1844 / 1899</td>
+ <td class="coverPerMed">89.0&nbsp;%</td>
+ <td class="coverNumMed">137 / 154</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/index.html">hw</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.0%"><img src="snow.png" width=5 height=10 alt="95.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.0&nbsp;%</td>
+ <td class="coverNumHi">113 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/common/index.html">external/ffspart/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/test/index.html">hw/ipmi/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/list/index.html">external/gard/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/array_size/test/index.html">ccan/array_size/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/index.html">ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="98.9%"><img src="snow.png" width=1 height=10 alt="98.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.9&nbsp;%</td>
+ <td class="coverNumHi">90 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/string/index.html">libc/string</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">120 / 168</td>
+ <td class="coverPerMed">77.8&nbsp;%</td>
+ <td class="coverNumMed">14 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/index.html">libstb/secvar</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=89 height=10 alt="89.5%"><img src="snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">153 / 171</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test/index.html">test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/sys/index.html">/usr/include/sys</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/trace/index.html">external/trace</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/index-sort-f.html b/coverage-report/index-sort-f.html
new file mode 100644
index 0000000..4286497
--- /dev/null
+++ b/coverage-report/index-sort-f.html
@@ -0,0 +1,767 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info</title>
+ <link rel="stylesheet" type="text/css" href="gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue">top level</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">14185</td>
+ <td class="headerCovTableEntry">23224</td>
+ <td class="headerCovTableEntryLo">61.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1157</td>
+ <td class="headerCovTableEntry">1572</td>
+ <td class="headerCovTableEntryLo">73.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Directory <span class="tableHeadSort"><a href="index.html"><img src="updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/endian/index.html">external/pflash/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.7%"><img src="snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/list/index.html">external/pflash/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/list/index.html">external/gard/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/index.html">libstb</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=15 height=10 alt="14.9%"><img src="snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/test/index.html">hw/ipmi/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/libflash/index.html">external/gard/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=20 height=10 alt="19.9%"><img src="snow.png" width=80 height=10 alt="19.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">19.9&nbsp;%</td>
+ <td class="coverNumLo">305 / 1530</td>
+ <td class="coverPerLo">30.6&nbsp;%</td>
+ <td class="coverNumLo">26 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/common/index.html">external/pflash/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/common/index.html">external/gard/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/common/index.html">external/ffspart/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/libflash/index.html">external/ffspart/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=25 height=10 alt="25.2%"><img src="snow.png" width=75 height=10 alt="25.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.2&nbsp;%</td>
+ <td class="coverNumLo">385 / 1530</td>
+ <td class="coverPerLo">35.3&nbsp;%</td>
+ <td class="coverNumLo">30 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/libflash/index.html">external/pflash/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=27 height=10 alt="26.7%"><img src="snow.png" width=73 height=10 alt="26.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">26.7&nbsp;%</td>
+ <td class="coverNumLo">409 / 1530</td>
+ <td class="coverPerLo">43.5&nbsp;%</td>
+ <td class="coverNumLo">37 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt/index.html">libfdt</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=31 height=10 alt="31.0%"><img src="snow.png" width=69 height=10 alt="31.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.0&nbsp;%</td>
+ <td class="coverNumLo">262 / 845</td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">46 / 95</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/ccan/endian/index.html">external/ffspart/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=50 height=10 alt="50.0%"><img src="snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/index.html">hw/ipmi</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=65 height=10 alt="64.6%"><img src="snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/test/index.html">hdata/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=64 height=10 alt="63.8%"><img src="snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test/index.html">test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/index.html">external/ffspart</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=45 height=10 alt="45.3%"><img src="snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/storage/index.html">libstb/secvar/storage</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=47 height=10 alt="47.2%"><img src="snow.png" width=53 height=10 alt="47.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">47.2&nbsp;%</td>
+ <td class="coverNumLo">201 / 426</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">18 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/index.html">hdata</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">1237 / 2675</td>
+ <td class="coverPerLo">68.0&nbsp;%</td>
+ <td class="coverNumLo">100 / 147</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/string/index.html">libc/string</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">120 / 168</td>
+ <td class="coverPerMed">77.8&nbsp;%</td>
+ <td class="coverNumMed">14 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/index.html">external/pflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=60 height=10 alt="60.1%"><img src="snow.png" width=40 height=10 alt="60.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">60.1&nbsp;%</td>
+ <td class="coverNumLo">485 / 807</td>
+ <td class="coverPerMed">78.9&nbsp;%</td>
+ <td class="coverNumMed">15 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdlib/index.html">libc/stdlib</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="94.8%"><img src="snow.png" width=5 height=10 alt="94.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.8&nbsp;%</td>
+ <td class="coverNumHi">73 / 77</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/index.html">core</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=75 height=10 alt="74.6%"><img src="snow.png" width=25 height=10 alt="74.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.6&nbsp;%</td>
+ <td class="coverNumLo">2002 / 2683</td>
+ <td class="coverPerMed">81.9&nbsp;%</td>
+ <td class="coverNumMed">186 / 227</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/index.html">libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.6%"><img src="snow.png" width=33 height=10 alt="66.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.6&nbsp;%</td>
+ <td class="coverNumLo">1733 / 2603</td>
+ <td class="coverPerMed">84.8&nbsp;%</td>
+ <td class="coverNumMed">145 / 171</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/test/index.html">hw/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="76.5%"><img src="snow.png" width=24 height=10 alt="76.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.5&nbsp;%</td>
+ <td class="coverNumMed">117 / 153</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="include/index.html">include</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=83 height=10 alt="82.9%"><img src="snow.png" width=17 height=10 alt="82.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.9&nbsp;%</td>
+ <td class="coverNumMed">63 / 76</td>
+ <td class="coverPerMed">88.9&nbsp;%</td>
+ <td class="coverNumMed">24 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/test/index.html">core/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=97 height=10 alt="97.1%"><img src="snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">1844 / 1899</td>
+ <td class="coverPerMed">89.0&nbsp;%</td>
+ <td class="coverNumMed">137 / 154</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/crypto/pkcs7/index.html">libstb/crypto/pkcs7</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=73 height=10 alt="73.4%"><img src="snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/test/index.html">libflash/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=74 height=10 alt="73.9%"><img src="snow.png" width=26 height=10 alt="73.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.9&nbsp;%</td>
+ <td class="coverNumLo">1368 / 1851</td>
+ <td class="coverPerHi">95.2&nbsp;%</td>
+ <td class="coverNumHi">119 / 125</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/index.html">external/gard</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=70 height=10 alt="69.7%"><img src="snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/sys/index.html">/usr/include/sys</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/test/index.html">ccan/endian/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/container_of/test/index.html">ccan/container_of/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/bits/index.html">/usr/include/bits</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/test/index.html">libstb/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/check_type/test/index.html">ccan/check_type/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/build_assert/test/index.html">ccan/build_assert/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/array_size/test/index.html">ccan/array_size/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/index.html">ccan/str</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/short_types/test/index.html">ccan/short_types/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/endian/index.html">external/gard/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=33 height=10 alt="33.3%"><img src="snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/trace/index.html">external/trace</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/test/index.html">ccan/str/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">84 / 84</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/index.html">libc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/ctype/index.html">libc/ctype</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/index.html">hw</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.0%"><img src="snow.png" width=5 height=10 alt="95.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.0&nbsp;%</td>
+ <td class="coverNumHi">113 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/test/index.html">ccan/heap/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="75.7%"><img src="snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/index.html">ccan/heap</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.3%"><img src="snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/test/index.html">ccan/list/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.1%"><img src="snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">310 / 316</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdio/index.html">libc/stdio</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="97.5%"><img src="snow.png" width=2 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">159 / 163</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/index.html">libstb/secvar</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=89 height=10 alt="89.5%"><img src="snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">153 / 171</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/index.html">ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/index.html">ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="98.9%"><img src="snow.png" width=1 height=10 alt="98.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.9&nbsp;%</td>
+ <td class="coverNumHi">90 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/test/index.html">libstb/secvar/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="99.5%"><img src="snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">580 / 583</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">22 / 22</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/backend/index.html">libstb/secvar/backend</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=82 height=10 alt="82.0%"><img src="snow.png" width=18 height=10 alt="82.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.0&nbsp;%</td>
+ <td class="coverNumMed">423 / 516</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/test/index.html">libc/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.4%"><img src="snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">377 / 383</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">31 / 31</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/index-sort-l.html b/coverage-report/index-sort-l.html
new file mode 100644
index 0000000..a46b814
--- /dev/null
+++ b/coverage-report/index-sort-l.html
@@ -0,0 +1,767 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info</title>
+ <link rel="stylesheet" type="text/css" href="gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue">top level</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">14185</td>
+ <td class="headerCovTableEntry">23224</td>
+ <td class="headerCovTableEntryLo">61.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1157</td>
+ <td class="headerCovTableEntry">1572</td>
+ <td class="headerCovTableEntryLo">73.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Directory <span class="tableHeadSort"><a href="index.html"><img src="updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/list/index.html">external/pflash/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/list/index.html">external/gard/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/index.html">libstb</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=15 height=10 alt="14.9%"><img src="snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/libflash/index.html">external/gard/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=20 height=10 alt="19.9%"><img src="snow.png" width=80 height=10 alt="19.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">19.9&nbsp;%</td>
+ <td class="coverNumLo">305 / 1530</td>
+ <td class="coverPerLo">30.6&nbsp;%</td>
+ <td class="coverNumLo">26 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/libflash/index.html">external/ffspart/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=25 height=10 alt="25.2%"><img src="snow.png" width=75 height=10 alt="25.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.2&nbsp;%</td>
+ <td class="coverNumLo">385 / 1530</td>
+ <td class="coverPerLo">35.3&nbsp;%</td>
+ <td class="coverNumLo">30 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/libflash/index.html">external/pflash/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=27 height=10 alt="26.7%"><img src="snow.png" width=73 height=10 alt="26.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">26.7&nbsp;%</td>
+ <td class="coverNumLo">409 / 1530</td>
+ <td class="coverPerLo">43.5&nbsp;%</td>
+ <td class="coverNumLo">37 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt/index.html">libfdt</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=31 height=10 alt="31.0%"><img src="snow.png" width=69 height=10 alt="31.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.0&nbsp;%</td>
+ <td class="coverNumLo">262 / 845</td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">46 / 95</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/endian/index.html">external/gard/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=33 height=10 alt="33.3%"><img src="snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/common/index.html">external/pflash/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/common/index.html">external/gard/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/common/index.html">external/ffspart/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/index.html">external/ffspart</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=45 height=10 alt="45.3%"><img src="snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test/index.html">test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/index.html">hdata</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">1237 / 2675</td>
+ <td class="coverPerLo">68.0&nbsp;%</td>
+ <td class="coverNumLo">100 / 147</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/storage/index.html">libstb/secvar/storage</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=47 height=10 alt="47.2%"><img src="snow.png" width=53 height=10 alt="47.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">47.2&nbsp;%</td>
+ <td class="coverNumLo">201 / 426</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">18 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/ccan/endian/index.html">external/ffspart/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=50 height=10 alt="50.0%"><img src="snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/index.html">external/pflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=60 height=10 alt="60.1%"><img src="snow.png" width=40 height=10 alt="60.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">60.1&nbsp;%</td>
+ <td class="coverNumLo">485 / 807</td>
+ <td class="coverPerMed">78.9&nbsp;%</td>
+ <td class="coverNumMed">15 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/test/index.html">hdata/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=64 height=10 alt="63.8%"><img src="snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/index.html">hw/ipmi</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=65 height=10 alt="64.6%"><img src="snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/index.html">libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.6%"><img src="snow.png" width=33 height=10 alt="66.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.6&nbsp;%</td>
+ <td class="coverNumLo">1733 / 2603</td>
+ <td class="coverPerMed">84.8&nbsp;%</td>
+ <td class="coverNumMed">145 / 171</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/endian/index.html">external/pflash/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.7%"><img src="snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/index.html">external/gard</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=70 height=10 alt="69.7%"><img src="snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/test/index.html">hw/ipmi/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/string/index.html">libc/string</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">120 / 168</td>
+ <td class="coverPerMed">77.8&nbsp;%</td>
+ <td class="coverNumMed">14 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/crypto/pkcs7/index.html">libstb/crypto/pkcs7</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=73 height=10 alt="73.4%"><img src="snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/test/index.html">libflash/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=74 height=10 alt="73.9%"><img src="snow.png" width=26 height=10 alt="73.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.9&nbsp;%</td>
+ <td class="coverNumLo">1368 / 1851</td>
+ <td class="coverPerHi">95.2&nbsp;%</td>
+ <td class="coverNumHi">119 / 125</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/index.html">core</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=75 height=10 alt="74.6%"><img src="snow.png" width=25 height=10 alt="74.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.6&nbsp;%</td>
+ <td class="coverNumLo">2002 / 2683</td>
+ <td class="coverPerMed">81.9&nbsp;%</td>
+ <td class="coverNumMed">186 / 227</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/test/index.html">ccan/heap/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="75.7%"><img src="snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/test/index.html">hw/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="76.5%"><img src="snow.png" width=24 height=10 alt="76.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.5&nbsp;%</td>
+ <td class="coverNumMed">117 / 153</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/backend/index.html">libstb/secvar/backend</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=82 height=10 alt="82.0%"><img src="snow.png" width=18 height=10 alt="82.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.0&nbsp;%</td>
+ <td class="coverNumMed">423 / 516</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="include/index.html">include</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=83 height=10 alt="82.9%"><img src="snow.png" width=17 height=10 alt="82.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.9&nbsp;%</td>
+ <td class="coverNumMed">63 / 76</td>
+ <td class="coverPerMed">88.9&nbsp;%</td>
+ <td class="coverNumMed">24 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/index.html">libstb/secvar</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=89 height=10 alt="89.5%"><img src="snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">153 / 171</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdlib/index.html">libc/stdlib</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="94.8%"><img src="snow.png" width=5 height=10 alt="94.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.8&nbsp;%</td>
+ <td class="coverNumHi">73 / 77</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/index.html">hw</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.0%"><img src="snow.png" width=5 height=10 alt="95.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.0&nbsp;%</td>
+ <td class="coverNumHi">113 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/index.html">ccan/heap</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.3%"><img src="snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/test/index.html">core/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=97 height=10 alt="97.1%"><img src="snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">1844 / 1899</td>
+ <td class="coverPerMed">89.0&nbsp;%</td>
+ <td class="coverNumMed">137 / 154</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdio/index.html">libc/stdio</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="97.5%"><img src="snow.png" width=2 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">159 / 163</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/test/index.html">ccan/list/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.1%"><img src="snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">310 / 316</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/test/index.html">libc/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.4%"><img src="snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">377 / 383</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">31 / 31</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/index.html">ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="98.9%"><img src="snow.png" width=1 height=10 alt="98.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.9&nbsp;%</td>
+ <td class="coverNumHi">90 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/test/index.html">libstb/secvar/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="99.5%"><img src="snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">580 / 583</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">22 / 22</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/build_assert/test/index.html">ccan/build_assert/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/short_types/test/index.html">ccan/short_types/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/check_type/test/index.html">ccan/check_type/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/bits/index.html">/usr/include/bits</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/array_size/test/index.html">ccan/array_size/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/sys/index.html">/usr/include/sys</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/container_of/test/index.html">ccan/container_of/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/test/index.html">libstb/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/index.html">ccan/str</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/ctype/index.html">libc/ctype</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/index.html">ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/trace/index.html">external/trace</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/index.html">libc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/test/index.html">ccan/endian/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/test/index.html">ccan/str/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">84 / 84</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/index.html b/coverage-report/index.html
new file mode 100644
index 0000000..3fb1a8a
--- /dev/null
+++ b/coverage-report/index.html
@@ -0,0 +1,767 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info</title>
+ <link rel="stylesheet" type="text/css" href="gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue">top level</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">14185</td>
+ <td class="headerCovTableEntry">23224</td>
+ <td class="headerCovTableEntryLo">61.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1157</td>
+ <td class="headerCovTableEntry">1572</td>
+ <td class="headerCovTableEntryLo">73.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Directory <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/bits/index.html">/usr/include/bits</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="usr/include/sys/index.html">/usr/include/sys</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/array_size/test/index.html">ccan/array_size/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/build_assert/test/index.html">ccan/build_assert/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/check_type/test/index.html">ccan/check_type/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/container_of/test/index.html">ccan/container_of/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/index.html">ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">30 / 30</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/endian/test/index.html">ccan/endian/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">73 / 73</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/index.html">ccan/heap</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.3%"><img src="snow.png" width=5 height=10 alt="95.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.3&nbsp;%</td>
+ <td class="coverNumHi">61 / 64</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/heap/test/index.html">ccan/heap/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="75.7%"><img src="snow.png" width=24 height=10 alt="75.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.7&nbsp;%</td>
+ <td class="coverNumMed">53 / 70</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/index.html">ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="98.9%"><img src="snow.png" width=1 height=10 alt="98.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.9&nbsp;%</td>
+ <td class="coverNumHi">90 / 91</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">18 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/list/test/index.html">ccan/list/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.1%"><img src="snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.1&nbsp;%</td>
+ <td class="coverNumHi">310 / 316</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/short_types/test/index.html">ccan/short_types/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/index.html">ccan/str</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ccan/str/test/index.html">ccan/str/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">84 / 84</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/index.html">core</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=75 height=10 alt="74.6%"><img src="snow.png" width=25 height=10 alt="74.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.6&nbsp;%</td>
+ <td class="coverNumLo">2002 / 2683</td>
+ <td class="coverPerMed">81.9&nbsp;%</td>
+ <td class="coverNumMed">186 / 227</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="core/test/index.html">core/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=97 height=10 alt="97.1%"><img src="snow.png" width=3 height=10 alt="97.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.1&nbsp;%</td>
+ <td class="coverNumHi">1844 / 1899</td>
+ <td class="coverPerMed">89.0&nbsp;%</td>
+ <td class="coverNumMed">137 / 154</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/index.html">external/ffspart</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=45 height=10 alt="45.3%"><img src="snow.png" width=55 height=10 alt="45.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">45.3&nbsp;%</td>
+ <td class="coverNumLo">134 / 296</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">4 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/ccan/endian/index.html">external/ffspart/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=50 height=10 alt="50.0%"><img src="snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 12</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/common/index.html">external/ffspart/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/ffspart/libflash/index.html">external/ffspart/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=25 height=10 alt="25.2%"><img src="snow.png" width=75 height=10 alt="25.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">25.2&nbsp;%</td>
+ <td class="coverNumLo">385 / 1530</td>
+ <td class="coverPerLo">35.3&nbsp;%</td>
+ <td class="coverNumLo">30 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/index.html">external/gard</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=70 height=10 alt="69.7%"><img src="snow.png" width=30 height=10 alt="69.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">69.7&nbsp;%</td>
+ <td class="coverNumLo">326 / 468</td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22 / 23</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/endian/index.html">external/gard/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=33 height=10 alt="33.3%"><img src="snow.png" width=67 height=10 alt="33.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">4 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/ccan/list/index.html">external/gard/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/common/index.html">external/gard/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/gard/libflash/index.html">external/gard/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=20 height=10 alt="19.9%"><img src="snow.png" width=80 height=10 alt="19.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">19.9&nbsp;%</td>
+ <td class="coverNumLo">305 / 1530</td>
+ <td class="coverPerLo">30.6&nbsp;%</td>
+ <td class="coverNumLo">26 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/index.html">external/pflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=60 height=10 alt="60.1%"><img src="snow.png" width=40 height=10 alt="60.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">60.1&nbsp;%</td>
+ <td class="coverNumLo">485 / 807</td>
+ <td class="coverPerMed">78.9&nbsp;%</td>
+ <td class="coverNumMed">15 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/endian/index.html">external/pflash/ccan/endian</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.7%"><img src="snow.png" width=33 height=10 alt="66.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">8 / 12</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/ccan/list/index.html">external/pflash/ccan/list</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 17</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/common/index.html">external/pflash/common</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=38 height=10 alt="37.5%"><img src="snow.png" width=62 height=10 alt="37.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">37.5&nbsp;%</td>
+ <td class="coverNumLo">12 / 32</td>
+ <td class="coverPerLo">33.3&nbsp;%</td>
+ <td class="coverNumLo">2 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/pflash/libflash/index.html">external/pflash/libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=27 height=10 alt="26.7%"><img src="snow.png" width=73 height=10 alt="26.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">26.7&nbsp;%</td>
+ <td class="coverNumLo">409 / 1530</td>
+ <td class="coverPerLo">43.5&nbsp;%</td>
+ <td class="coverNumLo">37 / 85</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="external/trace/index.html">external/trace</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/index.html">hdata</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">1237 / 2675</td>
+ <td class="coverPerLo">68.0&nbsp;%</td>
+ <td class="coverNumLo">100 / 147</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hdata/test/index.html">hdata/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=64 height=10 alt="63.8%"><img src="snow.png" width=36 height=10 alt="63.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">63.8&nbsp;%</td>
+ <td class="coverNumLo">104 / 163</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">8 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/index.html">hw</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="95.0%"><img src="snow.png" width=5 height=10 alt="95.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.0&nbsp;%</td>
+ <td class="coverNumHi">113 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/index.html">hw/ipmi</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=65 height=10 alt="64.6%"><img src="snow.png" width=35 height=10 alt="64.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">64.6&nbsp;%</td>
+ <td class="coverNumLo">64 / 99</td>
+ <td class="coverPerLo">57.1&nbsp;%</td>
+ <td class="coverNumLo">4 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/ipmi/test/index.html">hw/ipmi/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">25 / 35</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="hw/test/index.html">hw/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=76 height=10 alt="76.5%"><img src="snow.png" width=24 height=10 alt="76.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">76.5&nbsp;%</td>
+ <td class="coverNumMed">117 / 153</td>
+ <td class="coverPerMed">85.7&nbsp;%</td>
+ <td class="coverNumMed">6 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="include/index.html">include</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=83 height=10 alt="82.9%"><img src="snow.png" width=17 height=10 alt="82.9%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.9&nbsp;%</td>
+ <td class="coverNumMed">63 / 76</td>
+ <td class="coverPerMed">88.9&nbsp;%</td>
+ <td class="coverNumMed">24 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/index.html">libc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/ctype/index.html">libc/ctype</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdio/index.html">libc/stdio</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="97.5%"><img src="snow.png" width=2 height=10 alt="97.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.5&nbsp;%</td>
+ <td class="coverNumHi">159 / 163</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/stdlib/index.html">libc/stdlib</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=95 height=10 alt="94.8%"><img src="snow.png" width=5 height=10 alt="94.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.8&nbsp;%</td>
+ <td class="coverNumHi">73 / 77</td>
+ <td class="coverPerMed">80.0&nbsp;%</td>
+ <td class="coverNumMed">4 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/string/index.html">libc/string</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=71 height=10 alt="71.4%"><img src="snow.png" width=29 height=10 alt="71.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.4&nbsp;%</td>
+ <td class="coverNumLo">120 / 168</td>
+ <td class="coverPerMed">77.8&nbsp;%</td>
+ <td class="coverNumMed">14 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libc/test/index.html">libc/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=98 height=10 alt="98.4%"><img src="snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">377 / 383</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">31 / 31</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt/index.html">libfdt</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=31 height=10 alt="31.0%"><img src="snow.png" width=69 height=10 alt="31.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">31.0&nbsp;%</td>
+ <td class="coverNumLo">262 / 845</td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">46 / 95</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/index.html">libflash</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=67 height=10 alt="66.6%"><img src="snow.png" width=33 height=10 alt="66.6%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.6&nbsp;%</td>
+ <td class="coverNumLo">1733 / 2603</td>
+ <td class="coverPerMed">84.8&nbsp;%</td>
+ <td class="coverNumMed">145 / 171</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash/test/index.html">libflash/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=74 height=10 alt="73.9%"><img src="snow.png" width=26 height=10 alt="73.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.9&nbsp;%</td>
+ <td class="coverNumLo">1368 / 1851</td>
+ <td class="coverPerHi">95.2&nbsp;%</td>
+ <td class="coverNumHi">119 / 125</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/index.html">libstb</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=15 height=10 alt="14.9%"><img src="snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/crypto/pkcs7/index.html">libstb/crypto/pkcs7</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=73 height=10 alt="73.4%"><img src="snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/index.html">libstb/secvar</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=89 height=10 alt="89.5%"><img src="snow.png" width=11 height=10 alt="89.5%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.5&nbsp;%</td>
+ <td class="coverNumMed">153 / 171</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/backend/index.html">libstb/secvar/backend</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=82 height=10 alt="82.0%"><img src="snow.png" width=18 height=10 alt="82.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">82.0&nbsp;%</td>
+ <td class="coverNumMed">423 / 516</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">24 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/storage/index.html">libstb/secvar/storage</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=47 height=10 alt="47.2%"><img src="snow.png" width=53 height=10 alt="47.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">47.2&nbsp;%</td>
+ <td class="coverNumLo">201 / 426</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">18 / 27</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/secvar/test/index.html">libstb/secvar/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=99 height=10 alt="99.5%"><img src="snow.png" width=1 height=10 alt="99.5%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.5&nbsp;%</td>
+ <td class="coverNumHi">580 / 583</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">22 / 22</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libstb/test/index.html">libstb/test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test/index.html">test</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="ruby.png" width=46 height=10 alt="46.2%"><img src="snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/index-sort-b.html b/coverage-report/libc/ctype/index-sort-b.html
new file mode 100644
index 0000000..09fcef6
--- /dev/null
+++ b/coverage-report/libc/ctype/index-sort-b.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/ctype</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isxdigit.c.gcov.html">isxdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="toupper.c.gcov.html">toupper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isprint.c.gcov.html">isprint.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isspace.c.gcov.html">isspace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isdigit.c.gcov.html">isdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tolower.c.gcov.html">tolower.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/index-sort-f.html b/coverage-report/libc/ctype/index-sort-f.html
new file mode 100644
index 0000000..1c5aa84
--- /dev/null
+++ b/coverage-report/libc/ctype/index-sort-f.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/ctype</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isxdigit.c.gcov.html">isxdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="toupper.c.gcov.html">toupper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isprint.c.gcov.html">isprint.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isspace.c.gcov.html">isspace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isdigit.c.gcov.html">isdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tolower.c.gcov.html">tolower.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/index-sort-l.html b/coverage-report/libc/ctype/index-sort-l.html
new file mode 100644
index 0000000..1f0cab0
--- /dev/null
+++ b/coverage-report/libc/ctype/index-sort-l.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/ctype</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isprint.c.gcov.html">isprint.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tolower.c.gcov.html">tolower.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isxdigit.c.gcov.html">isxdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="toupper.c.gcov.html">toupper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isspace.c.gcov.html">isspace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isdigit.c.gcov.html">isdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/index.html b/coverage-report/libc/ctype/index.html
new file mode 100644
index 0000000..205491e
--- /dev/null
+++ b/coverage-report/libc/ctype/index.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/ctype</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isdigit.c.gcov.html">isdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isprint.c.gcov.html">isprint.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isspace.c.gcov.html">isspace.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="isxdigit.c.gcov.html">isxdigit.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="tolower.c.gcov.html">tolower.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="toupper.c.gcov.html">toupper.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isdigit.c.func-sort-c.html b/coverage-report/libc/ctype/isdigit.c.func-sort-c.html
new file mode 100644
index 0000000..1eaa26a
--- /dev/null
+++ b/coverage-report/libc/ctype/isdigit.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isdigit.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isdigit.c<span style="font-size: 80%;"> (<a href="isdigit.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="isdigit.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isdigit.c.gcov.html#14">isdigit</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isdigit.c.func.html b/coverage-report/libc/ctype/isdigit.c.func.html
new file mode 100644
index 0000000..172f695
--- /dev/null
+++ b/coverage-report/libc/ctype/isdigit.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isdigit.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isdigit.c<span style="font-size: 80%;"> (<a href="isdigit.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="isdigit.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isdigit.c.gcov.html#14">isdigit</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isdigit.c.gcov.html b/coverage-report/libc/ctype/isdigit.c.gcov.html
new file mode 100644
index 0000000..b7e40bd
--- /dev/null
+++ b/coverage-report/libc/ctype/isdigit.c.gcov.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isdigit.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isdigit.c<span style="font-size: 80%;"> (source / <a href="isdigit.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1345 : int __attrconst isdigit(int ch)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 1345 : switch (ch) {</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 100 : case '0': case '1': case '2': case '3': case '4':</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : case '5': case '6': case '7': case '8': case '9':</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 100 : return 1;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1245 : default:</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1245 : return 0;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isprint.c.func-sort-c.html b/coverage-report/libc/ctype/isprint.c.func-sort-c.html
new file mode 100644
index 0000000..9c79409
--- /dev/null
+++ b/coverage-report/libc/ctype/isprint.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isprint.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isprint.c<span style="font-size: 80%;"> (<a href="isprint.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="isprint.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isprint.c.gcov.html#14">isprint</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isprint.c.func.html b/coverage-report/libc/ctype/isprint.c.func.html
new file mode 100644
index 0000000..752af35
--- /dev/null
+++ b/coverage-report/libc/ctype/isprint.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isprint.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isprint.c<span style="font-size: 80%;"> (<a href="isprint.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="isprint.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isprint.c.gcov.html#14">isprint</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isprint.c.gcov.html b/coverage-report/libc/ctype/isprint.c.gcov.html
new file mode 100644
index 0000000..c0e24d8
--- /dev/null
+++ b/coverage-report/libc/ctype/isprint.c.gcov.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isprint.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isprint.c<span style="font-size: 80%;"> (source / <a href="isprint.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1345 : int __attrconst isprint(int ch)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 1345 : return (ch &gt;= 32 &amp;&amp; ch &lt; 127);</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isspace.c.func-sort-c.html b/coverage-report/libc/ctype/isspace.c.func-sort-c.html
new file mode 100644
index 0000000..93b71df
--- /dev/null
+++ b/coverage-report/libc/ctype/isspace.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isspace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isspace.c<span style="font-size: 80%;"> (<a href="isspace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="isspace.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isspace.c.gcov.html#14">isspace</a></td>
+ <td class="coverFnHi">1350</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isspace.c.func.html b/coverage-report/libc/ctype/isspace.c.func.html
new file mode 100644
index 0000000..62e57b9
--- /dev/null
+++ b/coverage-report/libc/ctype/isspace.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isspace.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isspace.c<span style="font-size: 80%;"> (<a href="isspace.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="isspace.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isspace.c.gcov.html#14">isspace</a></td>
+ <td class="coverFnHi">1350</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isspace.c.gcov.html b/coverage-report/libc/ctype/isspace.c.gcov.html
new file mode 100644
index 0000000..2556424
--- /dev/null
+++ b/coverage-report/libc/ctype/isspace.c.gcov.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isspace.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isspace.c<span style="font-size: 80%;"> (source / <a href="isspace.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1350 : int __attrconst isspace(int ch)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 1350 : switch (ch) {</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 45 : case ' ':</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : case '\f':</a>
+<a name="21"><span class="lineNum"> 21 </span> : : case '\n':</a>
+<a name="22"><span class="lineNum"> 22 </span> : : case '\r':</a>
+<a name="23"><span class="lineNum"> 23 </span> : : case '\t':</a>
+<a name="24"><span class="lineNum"> 24 </span> : : case '\v':</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 45 : return 1;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1305 : default:</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1305 : return 0;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isxdigit.c.func-sort-c.html b/coverage-report/libc/ctype/isxdigit.c.func-sort-c.html
new file mode 100644
index 0000000..f0fae00
--- /dev/null
+++ b/coverage-report/libc/ctype/isxdigit.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isxdigit.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isxdigit.c<span style="font-size: 80%;"> (<a href="isxdigit.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="isxdigit.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isxdigit.c.gcov.html#14">isxdigit</a></td>
+ <td class="coverFnHi">1355</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isxdigit.c.func.html b/coverage-report/libc/ctype/isxdigit.c.func.html
new file mode 100644
index 0000000..0bcfa92
--- /dev/null
+++ b/coverage-report/libc/ctype/isxdigit.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isxdigit.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isxdigit.c<span style="font-size: 80%;"> (<a href="isxdigit.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="isxdigit.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="isxdigit.c.gcov.html#14">isxdigit</a></td>
+ <td class="coverFnHi">1355</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/isxdigit.c.gcov.html b/coverage-report/libc/ctype/isxdigit.c.gcov.html
new file mode 100644
index 0000000..61a1218
--- /dev/null
+++ b/coverage-report/libc/ctype/isxdigit.c.gcov.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/isxdigit.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - isxdigit.c<span style="font-size: 80%;"> (source / <a href="isxdigit.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1355 : int __attrconst isxdigit(int ch)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : return ( </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 1355 : (ch &gt;= '0' &amp;&amp; ch &lt;= '9') |</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 2710 : (ch &gt;= 'A' &amp;&amp; ch &lt;= 'F') |</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1355 : (ch &gt;= 'a' &amp;&amp; ch &lt;= 'f') );</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/tolower.c.func-sort-c.html b/coverage-report/libc/ctype/tolower.c.func-sort-c.html
new file mode 100644
index 0000000..19f74ee
--- /dev/null
+++ b/coverage-report/libc/ctype/tolower.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/tolower.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - tolower.c<span style="font-size: 80%;"> (<a href="tolower.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="tolower.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tolower.c.gcov.html#14">tolower</a></td>
+ <td class="coverFnHi">2570</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/tolower.c.func.html b/coverage-report/libc/ctype/tolower.c.func.html
new file mode 100644
index 0000000..485fd52
--- /dev/null
+++ b/coverage-report/libc/ctype/tolower.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/tolower.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - tolower.c<span style="font-size: 80%;"> (<a href="tolower.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="tolower.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="tolower.c.gcov.html#14">tolower</a></td>
+ <td class="coverFnHi">2570</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/tolower.c.gcov.html b/coverage-report/libc/ctype/tolower.c.gcov.html
new file mode 100644
index 0000000..796b5a2
--- /dev/null
+++ b/coverage-report/libc/ctype/tolower.c.gcov.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/tolower.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - tolower.c<span style="font-size: 80%;"> (source / <a href="tolower.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 2570 : int __attrconst tolower(int c) </span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 2570 : return (((c &gt;= 'A') &amp;&amp; (c &lt;= 'Z')) ? (c - 'A' + 'a' ) : c);</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/toupper.c.func-sort-c.html b/coverage-report/libc/ctype/toupper.c.func-sort-c.html
new file mode 100644
index 0000000..a4834de
--- /dev/null
+++ b/coverage-report/libc/ctype/toupper.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/toupper.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - toupper.c<span style="font-size: 80%;"> (<a href="toupper.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="toupper.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="toupper.c.gcov.html#14">toupper</a></td>
+ <td class="coverFnHi">2570</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/toupper.c.func.html b/coverage-report/libc/ctype/toupper.c.func.html
new file mode 100644
index 0000000..f2b32a2
--- /dev/null
+++ b/coverage-report/libc/ctype/toupper.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/toupper.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - toupper.c<span style="font-size: 80%;"> (<a href="toupper.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="toupper.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="toupper.c.gcov.html#14">toupper</a></td>
+ <td class="coverFnHi">2570</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/ctype/toupper.c.gcov.html b/coverage-report/libc/ctype/toupper.c.gcov.html
new file mode 100644
index 0000000..789093b
--- /dev/null
+++ b/coverage-report/libc/ctype/toupper.c.gcov.html
@@ -0,0 +1,106 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/ctype/toupper.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/ctype</a> - toupper.c<span style="font-size: 80%;"> (source / <a href="toupper.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;ctype.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 2570 : int __attrconst toupper (int cha)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 2570 : if((cha &gt;= 'a') &amp;&amp; (cha &lt;= 'z'))</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 260 : return(cha - 'a' + 'A');</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 2310 : return(cha);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/index-sort-b.html b/coverage-report/libc/index-sort-b.html
new file mode 100644
index 0000000..cd08fce
--- /dev/null
+++ b/coverage-report/libc/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libc</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time.c.gcov.html">time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/index-sort-f.html b/coverage-report/libc/index-sort-f.html
new file mode 100644
index 0000000..6a5941e
--- /dev/null
+++ b/coverage-report/libc/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libc</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time.c.gcov.html">time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/index-sort-l.html b/coverage-report/libc/index-sort-l.html
new file mode 100644
index 0000000..618fd03
--- /dev/null
+++ b/coverage-report/libc/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libc</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time.c.gcov.html">time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/index.html b/coverage-report/libc/index.html
new file mode 100644
index 0000000..f968d60
--- /dev/null
+++ b/coverage-report/libc/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libc</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="time.c.gcov.html">time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">66 / 66</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/index-sort-b.html b/coverage-report/libc/stdio/index-sort-b.html
new file mode 100644
index 0000000..93c50ff
--- /dev/null
+++ b/coverage-report/libc/stdio/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdio</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryHi">97.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="snprintf.c.gcov.html">snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vsnprintf.c.gcov.html">vsnprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">152 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/index-sort-f.html b/coverage-report/libc/stdio/index-sort-f.html
new file mode 100644
index 0000000..fadd4c9
--- /dev/null
+++ b/coverage-report/libc/stdio/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdio</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryHi">97.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="snprintf.c.gcov.html">snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vsnprintf.c.gcov.html">vsnprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">152 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/index-sort-l.html b/coverage-report/libc/stdio/index-sort-l.html
new file mode 100644
index 0000000..6bfa596
--- /dev/null
+++ b/coverage-report/libc/stdio/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdio</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryHi">97.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vsnprintf.c.gcov.html">vsnprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">152 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="snprintf.c.gcov.html">snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/index.html b/coverage-report/libc/stdio/index.html
new file mode 100644
index 0000000..fa123a0
--- /dev/null
+++ b/coverage-report/libc/stdio/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdio</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntryHi">97.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="snprintf.c.gcov.html">snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="vsnprintf.c.gcov.html">vsnprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">152 / 156</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/snprintf.c.func-sort-c.html b/coverage-report/libc/stdio/snprintf.c.func-sort-c.html
new file mode 100644
index 0000000..39067a5
--- /dev/null
+++ b/coverage-report/libc/stdio/snprintf.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio/snprintf.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdio</a> - snprintf.c<span style="font-size: 80%;"> (<a href="snprintf.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="snprintf.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="snprintf.c.gcov.html#14">snprintf</a></td>
+ <td class="coverFnHi">1613</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/snprintf.c.func.html b/coverage-report/libc/stdio/snprintf.c.func.html
new file mode 100644
index 0000000..e457496
--- /dev/null
+++ b/coverage-report/libc/stdio/snprintf.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio/snprintf.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdio</a> - snprintf.c<span style="font-size: 80%;"> (<a href="snprintf.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="snprintf.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="snprintf.c.gcov.html#14">snprintf</a></td>
+ <td class="coverFnHi">1613</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/snprintf.c.gcov.html b/coverage-report/libc/stdio/snprintf.c.gcov.html
new file mode 100644
index 0000000..0ce545d
--- /dev/null
+++ b/coverage-report/libc/stdio/snprintf.c.gcov.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio/snprintf.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdio</a> - snprintf.c<span style="font-size: 80%;"> (source / <a href="snprintf.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1613 : int snprintf(char *buff, size_t size, const char *format, ...)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : va_list ar;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : int count;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1613 : if (buff==NULL)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 5 : return(-1);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1608 : va_start(ar, format);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1608 : count = vsnprintf(buff, size, format, ar);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1608 : va_end(ar);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1608 : return(count);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/vsnprintf.c.func-sort-c.html b/coverage-report/libc/stdio/vsnprintf.c.func-sort-c.html
new file mode 100644
index 0000000..9a34ad7
--- /dev/null
+++ b/coverage-report/libc/stdio/vsnprintf.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio/vsnprintf.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdio</a> - vsnprintf.c<span style="font-size: 80%;"> (<a href="vsnprintf.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">152</td>
+ <td class="headerCovTableEntry">156</td>
+ <td class="headerCovTableEntryHi">97.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="vsnprintf.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#24">print_str_fill</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#44">print_str</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#71">print_itoa</a></td>
+ <td class="coverFnHi">691</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#104">print_fill</a></td>
+ <td class="coverFnHi">3241</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#126">print_format</a></td>
+ <td class="coverFnHi">3243</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#246">vsnprintf</a></td>
+ <td class="coverFnHi">3246</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#57">print_intlen</a></td>
+ <td class="coverFnHi">3932</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/vsnprintf.c.func.html b/coverage-report/libc/stdio/vsnprintf.c.func.html
new file mode 100644
index 0000000..f9e2f3b
--- /dev/null
+++ b/coverage-report/libc/stdio/vsnprintf.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio/vsnprintf.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdio</a> - vsnprintf.c<span style="font-size: 80%;"> (<a href="vsnprintf.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">152</td>
+ <td class="headerCovTableEntry">156</td>
+ <td class="headerCovTableEntryHi">97.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="vsnprintf.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#104">print_fill</a></td>
+ <td class="coverFnHi">3241</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#126">print_format</a></td>
+ <td class="coverFnHi">3243</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#57">print_intlen</a></td>
+ <td class="coverFnHi">3932</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#71">print_itoa</a></td>
+ <td class="coverFnHi">691</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#44">print_str</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#24">print_str_fill</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="vsnprintf.c.gcov.html#246">vsnprintf</a></td>
+ <td class="coverFnHi">3246</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdio/vsnprintf.c.gcov.html b/coverage-report/libc/stdio/vsnprintf.c.gcov.html
new file mode 100644
index 0000000..c4972cf
--- /dev/null
+++ b/coverage-report/libc/stdio/vsnprintf.c.gcov.html
@@ -0,0 +1,385 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdio/vsnprintf.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdio</a> - vsnprintf.c<span style="font-size: 80%;"> (source / <a href="vsnprintf.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">152</td>
+ <td class="headerCovTableEntry">156</td>
+ <td class="headerCovTableEntryHi">97.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;compiler.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;stdio.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;stdlib.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;string.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;ctype.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : static const unsigned long long convert[] = {</a>
+<a name="21"><span class="lineNum"> 21 </span> : : 0x0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : 0xFFFFFFFFFFULL, 0xFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL</a>
+<a name="23"><span class="lineNum"> 23 </span> : : };</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : static int</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 2 : print_str_fill(char **buffer, size_t bufsize, char *sizec,</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : const char *str, char c)</a>
+<a name="28"><span class="lineNum"> 28 </span> : : {</a>
+<a name="29"><span class="lineNum"> 29 </span> : : size_t i, sizei, len;</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 2 : char *bstart = *buffer;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 2 : sizei = strtoul(sizec, NULL, 10);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 2 : len = strlen(str);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 2 : if (sizei &gt; len) {</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 2 : for (i = 0;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 590 : (i &lt; (sizei - len)) &amp;&amp; ((*buffer - bstart) &lt; bufsize);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 588 : i++) {</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 588 : **buffer = c;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 588 : *buffer += 1;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 2 : return 1;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : static int</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 12 : print_str(char **buffer, size_t bufsize, const char *str)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 12 : char *bstart = *buffer;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : size_t i;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 42 : for (i = 0; (i &lt; strlen(str)) &amp;&amp; ((*buffer - bstart) &lt; bufsize); i++) {</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 30 : **buffer = str[i];</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 30 : *buffer += 1;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 12 : return 1;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : static unsigned int __attrconst</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 3932 : print_intlen(unsigned long value, unsigned short int base)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 3932 : int i = 0;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 13144 : while (value &gt; 0) {</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 9212 : value /= base;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 9212 : i++;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : }</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 3932 : if (i == 0)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 64 : i = 1;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 3932 : return i;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : static int</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 691 : print_itoa(char **buffer, size_t bufsize, unsigned long value,</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : unsigned short base, bool upper)</a>
+<a name="75"><span class="lineNum"> 75 </span> : : {</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 691 : const char zeichen[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : char c;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : int i, len;</a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 691 : if(base &lt;= 2 || base &gt; 16)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 691 : len = i = print_intlen(value, base);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> : : /* Don't print to buffer if bufsize is not enough. */</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 691 : if (len &gt; bufsize)</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 75 : return 0;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : do {</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 3068 : c = zeichen[value % base];</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 3068 : if (upper)</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 360 : c = toupper(c);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 3068 : (*buffer)[--i] = c;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 3068 : value /= base;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 3068 : } while(value);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 616 : *buffer += len;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 616 : return 1;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> : : static int</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 3241 : print_fill(char **buffer, size_t bufsize, char *sizec, unsigned long size,</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : unsigned short int base, char c, int optlen)</a>
+<a name="108"><span class="lineNum"> 108 </span> : : {</a>
+<a name="109"><span class="lineNum"> 109 </span> : : int i, sizei, len;</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 3241 : char *bstart = *buffer;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 3241 : sizei = strtoul(sizec, NULL, 10);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 3241 : len = print_intlen(size, base) + optlen;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 3241 : if (sizei &gt; len) {</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 84 : for (i = 0;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 321 : (i &lt; (sizei - len)) &amp;&amp; ((*buffer - bstart) &lt; bufsize);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 237 : i++) {</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 237 : **buffer = c;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 237 : *buffer += 1;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : }</a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 3241 : return 0;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : }</a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> : : static int</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 3243 : print_format(char **buffer, size_t bufsize, const char *format, void *var)</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : {</a>
+<a name="130"><span class="lineNum"> 130 </span> : : char *start;</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 3243 : unsigned int i = 0, length_mod = sizeof(int);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 3243 : unsigned long value = 0;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : unsigned long signBit;</a>
+<a name="134"><span class="lineNum"> 134 </span> : : char *form, sizec[32];</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 3243 : char sign = ' ';</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 3243 : bool upper = false;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 3243 : form = (char *) format;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 3243 : start = *buffer;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 3243 : form++;</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 3243 : if(*form == '0' || *form == '.') {</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 98 : sign = '0';</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 98 : form++;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : }</a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 6726 : while ((*form != '\0') &amp;&amp; ((*buffer - start) &lt; bufsize)) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 3483 : switch(*form) {</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 511 : case 'u':</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : case 'd':</a>
+<a name="151"><span class="lineNum"> 151 </span> : : case 'i':</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 511 : sizec[i] = '\0';</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 511 : value = (unsigned long) var;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 511 : signBit = 0x1ULL &lt;&lt; (length_mod * 8 - 1);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 511 : if ((*form != 'u') &amp;&amp; (signBit &amp; value)) {</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 120 : **buffer = '-';</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 120 : *buffer += 1;</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 120 : value = (-(unsigned long)value) &amp; convert[length_mod];</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : }</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 511 : print_fill(buffer, bufsize - (*buffer - start),</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : sizec, value, 10, sign, 0);</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 511 : print_itoa(buffer, bufsize - (*buffer - start),</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : value, 10, upper);</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 511 : break;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 80 : case 'X':</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 80 : upper = true;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : /* fallthrough */</a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 160 : case 'x':</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 160 : sizec[i] = '\0';</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 160 : value = (unsigned long) var &amp; convert[length_mod];</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 160 : print_fill(buffer, bufsize - (*buffer - start),</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : sizec, value, 16, sign, 0);</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 160 : print_itoa(buffer, bufsize - (*buffer - start),</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : value, 16, upper);</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 160 : break;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 10 : case 'O':</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : case 'o':</a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 10 : sizec[i] = '\0';</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 10 : value = (long int) var &amp; convert[length_mod];</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 10 : print_fill(buffer, bufsize - (*buffer - start),</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : sizec, value, 8, sign, 0);</a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 10 : print_itoa(buffer, bufsize - (*buffer - start),</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : value, 8, upper);</a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 10 : break;</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 10 : case 'p':</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 10 : sizec[i] = '\0';</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 10 : print_fill(buffer, bufsize - (*buffer - start),</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : sizec, (unsigned long) var, 16, ' ', 2);</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 10 : print_str(buffer, bufsize - (*buffer - start),</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : &quot;0x&quot;);</a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 10 : print_itoa(buffer, bufsize - (*buffer - start),</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : (unsigned long) var, 16, upper);</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 10 : break;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 2550 : case 'c':</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 2550 : sizec[i] = '\0';</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 2550 : print_fill(buffer, bufsize - (*buffer - start),</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : sizec, 1, 10, ' ', 0);</a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 2550 : **buffer = (unsigned long) var;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 2550 : *buffer += 1;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 2550 : break;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 2 : case 's':</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 2 : sizec[i] = '\0';</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 2 : print_str_fill(buffer,</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 2 : bufsize - (*buffer - start), sizec,</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : (char *) var, ' ');</a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 2 : print_str(buffer, bufsize - (*buffer - start),</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : (char *) var);</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 18 : case 'l':</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 18 : form++;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 18 : if(*form == 'l') {</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : length_mod = sizeof(long long int);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : } else {</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 18 : form--;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 18 : length_mod = sizeof(long int);</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : }</a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 18 : break;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 70 : case 'h':</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 70 : form++;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 70 : if(*form == 'h') {</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : length_mod = sizeof(signed char);</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : } else {</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 70 : form--;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 70 : length_mod = sizeof(short int);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : }</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 70 : break;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 40 : case 'z':</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 40 : length_mod = sizeof(size_t);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 40 : break;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 112 : default:</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 112 : if(*form &gt;= '0' &amp;&amp; *form &lt;= '9')</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 112 : sizec[i++] = *form;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : }</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 3483 : form++;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : }</a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 3243 : return (long int) (*buffer - start);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : </a>
+<a name="243"><span class="lineNum"> 243 </span> : : /*</a>
+<a name="244"><span class="lineNum"> 244 </span> : : * The vsnprintf function prints a formatted strings into a buffer.</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * BUG: buffer size checking does not fully work yet</a>
+<a name="246"><span class="lineNum"> 246 </span> : : */</a>
+<a name="247"><span class="lineNum"> 247 </span> : : int</a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 3246 : vsnprintf(char *buffer, size_t bufsize, const char *format, va_list arg)</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : {</a>
+<a name="250"><span class="lineNum"> 250 </span> : : char *ptr, *bstart;</a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 3246 : bstart = buffer;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 3246 : ptr = (char *) format;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /*</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * Return from here if size passed is zero, otherwise we would</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * overrun buffer while setting NULL character at the end.</a>
+<a name="258"><span class="lineNum"> 258 </span> : : */</a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 3246 : if (!buffer || !bufsize)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> : : /* Leave one space for NULL character */</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 3246 : bufsize--;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 6701 : while(*ptr != '\0' &amp;&amp; (buffer - bstart) &lt; bufsize)</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : {</a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 3455 : if(*ptr == '%') {</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : char formstr[20];</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 3248 : int i=0;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : do {</a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 3586 : formstr[i] = *ptr;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 3586 : ptr++;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 3586 : i++;</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 3313 : } while(!(*ptr == 'd' || *ptr == 'i' || *ptr == 'u' || *ptr == 'x' || *ptr == 'X'</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 2915 : || *ptr == 'p' || *ptr == 'c' || *ptr == 's' || *ptr == '%'</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 3596 : || *ptr == 'O' || *ptr == 'o' )); </span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 3248 : formstr[i++] = *ptr;</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 3248 : formstr[i] = '\0';</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 3248 : if(*ptr == '%') {</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 5 : *buffer++ = '%';</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : } else {</a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 3243 : print_format(&amp;buffer,</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 3243 : bufsize - (buffer - bstart),</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : formstr, va_arg(arg, void *));</a>
+<a name="286"><span class="lineNum"> 286 </span> : : }</a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 3248 : ptr++;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : } else {</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 207 : *buffer = *ptr;</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 207 : buffer++;</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 207 : ptr++;</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : }</a>
+<a name="295"><span class="lineNum"> 295 </span> : : }</a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 3246 : *buffer = '\0';</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 3246 : return (buffer - bstart);</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/atoi.c.func-sort-c.html b/coverage-report/libc/stdlib/atoi.c.func-sort-c.html
new file mode 100644
index 0000000..d133090
--- /dev/null
+++ b/coverage-report/libc/stdlib/atoi.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/atoi.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - atoi.c<span style="font-size: 80%;"> (<a href="atoi.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="atoi.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="atoi.c.gcov.html#13">atoi</a></td>
+ <td class="coverFnHi">50</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/atoi.c.func.html b/coverage-report/libc/stdlib/atoi.c.func.html
new file mode 100644
index 0000000..5caa602
--- /dev/null
+++ b/coverage-report/libc/stdlib/atoi.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/atoi.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - atoi.c<span style="font-size: 80%;"> (<a href="atoi.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="atoi.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="atoi.c.gcov.html#13">atoi</a></td>
+ <td class="coverFnHi">50</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/atoi.c.gcov.html b/coverage-report/libc/stdlib/atoi.c.gcov.html
new file mode 100644
index 0000000..6825579
--- /dev/null
+++ b/coverage-report/libc/stdlib/atoi.c.gcov.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/atoi.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - atoi.c<span style="font-size: 80%;"> (source / <a href="atoi.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 50 : int atoi(const char *str)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 50 : return strtol(str, NULL, 10);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/atol.c.func-sort-c.html b/coverage-report/libc/stdlib/atol.c.func-sort-c.html
new file mode 100644
index 0000000..f450ac0
--- /dev/null
+++ b/coverage-report/libc/stdlib/atol.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/atol.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - atol.c<span style="font-size: 80%;"> (<a href="atol.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="atol.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="atol.c.gcov.html#13">atol</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/atol.c.func.html b/coverage-report/libc/stdlib/atol.c.func.html
new file mode 100644
index 0000000..d88636a
--- /dev/null
+++ b/coverage-report/libc/stdlib/atol.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/atol.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - atol.c<span style="font-size: 80%;"> (<a href="atol.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="atol.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="atol.c.gcov.html#13">atol</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/atol.c.gcov.html b/coverage-report/libc/stdlib/atol.c.gcov.html
new file mode 100644
index 0000000..345a921
--- /dev/null
+++ b/coverage-report/libc/stdlib/atol.c.gcov.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/atol.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - atol.c<span style="font-size: 80%;"> (source / <a href="atol.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 10 : long atol(const char *str)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 10 : return strtol(str, NULL, 10);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/index-sort-b.html b/coverage-report/libc/stdlib/index-sort-b.html
new file mode 100644
index 0000000..030b9f2
--- /dev/null
+++ b/coverage-report/libc/stdlib/index-sort-b.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdlib</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntryHi">94.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="rand.c.gcov.html">rand.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtoul.c.gcov.html">strtoul.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atoi.c.gcov.html">atoi.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atol.c.gcov.html">atol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtol.c.gcov.html">strtol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">37 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/index-sort-f.html b/coverage-report/libc/stdlib/index-sort-f.html
new file mode 100644
index 0000000..7d569b2
--- /dev/null
+++ b/coverage-report/libc/stdlib/index-sort-f.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdlib</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntryHi">94.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="rand.c.gcov.html">rand.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtoul.c.gcov.html">strtoul.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atoi.c.gcov.html">atoi.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atol.c.gcov.html">atol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtol.c.gcov.html">strtol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">37 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/index-sort-l.html b/coverage-report/libc/stdlib/index-sort-l.html
new file mode 100644
index 0000000..9950775
--- /dev/null
+++ b/coverage-report/libc/stdlib/index-sort-l.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdlib</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntryHi">94.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="rand.c.gcov.html">rand.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtol.c.gcov.html">strtol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">37 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atoi.c.gcov.html">atoi.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atol.c.gcov.html">atol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtoul.c.gcov.html">strtoul.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/index.html b/coverage-report/libc/stdlib/index.html
new file mode 100644
index 0000000..3190119
--- /dev/null
+++ b/coverage-report/libc/stdlib/index.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/stdlib</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">73</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntryHi">94.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryMed">80.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atoi.c.gcov.html">atoi.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="atol.c.gcov.html">atol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="rand.c.gcov.html">rand.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 3</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtol.c.gcov.html">strtol.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=97 height=10 alt="97.4%"><img src="../../snow.png" width=3 height=10 alt="97.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.4&nbsp;%</td>
+ <td class="coverNumHi">37 / 38</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtoul.c.gcov.html">strtoul.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">32 / 32</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/rand.c.func-sort-c.html b/coverage-report/libc/stdlib/rand.c.func-sort-c.html
new file mode 100644
index 0000000..a2fd7d0
--- /dev/null
+++ b/coverage-report/libc/stdlib/rand.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/rand.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - rand.c<span style="font-size: 80%;"> (<a href="rand.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="rand.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="rand.c.gcov.html#17">rand</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/rand.c.func.html b/coverage-report/libc/stdlib/rand.c.func.html
new file mode 100644
index 0000000..468d6d2
--- /dev/null
+++ b/coverage-report/libc/stdlib/rand.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/rand.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - rand.c<span style="font-size: 80%;"> (<a href="rand.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="rand.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="rand.c.gcov.html#17">rand</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/rand.c.gcov.html b/coverage-report/libc/stdlib/rand.c.gcov.html
new file mode 100644
index 0000000..8c3caeb
--- /dev/null
+++ b/coverage-report/libc/stdlib/rand.c.gcov.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/rand.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - rand.c<span style="font-size: 80%;"> (source / <a href="rand.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : static unsigned long _rand = 1;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : int</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : rand(void)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : _rand = _rand * 25364735 + 34563;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : return ((unsigned int) (_rand &gt;&gt; 16) &amp; RAND_MAX);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/strtol.c.func-sort-c.html b/coverage-report/libc/stdlib/strtol.c.func-sort-c.html
new file mode 100644
index 0000000..e0fab8e
--- /dev/null
+++ b/coverage-report/libc/stdlib/strtol.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/strtol.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - strtol.c<span style="font-size: 80%;"> (<a href="strtol.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntryHi">97.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strtol.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strtol.c.gcov.html#13">strtol</a></td>
+ <td class="coverFnHi">105</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/strtol.c.func.html b/coverage-report/libc/stdlib/strtol.c.func.html
new file mode 100644
index 0000000..33ce317
--- /dev/null
+++ b/coverage-report/libc/stdlib/strtol.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/strtol.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - strtol.c<span style="font-size: 80%;"> (<a href="strtol.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntryHi">97.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strtol.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strtol.c.gcov.html#13">strtol</a></td>
+ <td class="coverFnHi">105</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/strtol.c.gcov.html b/coverage-report/libc/stdlib/strtol.c.gcov.html
new file mode 100644
index 0000000..22e3aac
--- /dev/null
+++ b/coverage-report/libc/stdlib/strtol.c.gcov.html
@@ -0,0 +1,198 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/strtol.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - strtol.c<span style="font-size: 80%;"> (source / <a href="strtol.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">37</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntryHi">97.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 105 : long int strtol(const char *S, char **PTR,int BASE)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 105 : long rval = 0;</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 105 : short int negative = 0;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : short int digit;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : // *PTR is S, unless PTR is NULL, in which case i override it with my own ptr</a>
+<a name="21"><span class="lineNum"> 21 </span> : : char* ptr;</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 105 : if (PTR == NULL)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> : : //override</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 100 : PTR = &amp;ptr;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : // i use PTR to advance through the string</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 105 : *PTR = (char *) S;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : //check if BASE is ok</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 105 : if ((BASE &lt; 0) || BASE &gt; 36)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : {</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 10 : return 0;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> : : // ignore white space at beginning of S</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 110 : while ((**PTR == ' ')</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 95 : || (**PTR == '\t')</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 95 : || (**PTR == '\n')</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 95 : || (**PTR == '\r')</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : )</a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 15 : (*PTR)++;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : // check if S starts with &quot;-&quot; in which case the return value is negative</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 95 : if (**PTR == '-')</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 20 : negative = 1;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 20 : (*PTR)++;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : }</a>
+<a name="49"><span class="lineNum"> 49 </span> : : // if BASE is 0... determine the base from the first chars...</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 95 : if (BASE == 0)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> : : // if S starts with &quot;0x&quot;, BASE = 16, else 10</a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 10 : if ((**PTR == '0') &amp;&amp; (*((*PTR)+1) == 'x'))</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 10 : BASE = 16;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : else</a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : BASE = 10;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : }</a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 95 : if (BASE == 16)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : {</a>
+<a name="64"><span class="lineNum"> 64 </span> : : // S may start with &quot;0x&quot;</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 10 : if ((**PTR == '0') &amp;&amp; (*((*PTR)+1) == 'x'))</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : {</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 10 : (*PTR)++;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 10 : (*PTR)++;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : }</a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : //until end of string</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 375 : while (**PTR)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : {</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 315 : if (((**PTR) &gt;= '0') &amp;&amp; ((**PTR) &lt;= '9'))</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : {</a>
+<a name="76"><span class="lineNum"> 76 </span> : : //digit (0..9)</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 275 : digit = **PTR - '0';</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 40 : else if (((**PTR) &gt;= 'a') &amp;&amp; ((**PTR) &lt;='z'))</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : {</a>
+<a name="81"><span class="lineNum"> 81 </span> : : //alphanumeric digit lowercase(a (10) .. z (35) )</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 25 : digit = (**PTR - 'a') + 10;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 15 : else if (((**PTR) &gt;= 'A') &amp;&amp; ((**PTR) &lt;='Z'))</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> : : //alphanumeric digit uppercase(a (10) .. z (35) )</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 5 : digit = (**PTR - 'A') + 10;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : else</a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> : : //end of parseable number reached...</a>
+<a name="92"><span class="lineNum"> 92 </span> : : break;</a>
+<a name="93"><span class="lineNum"> 93 </span> : : }</a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 305 : if (digit &lt; BASE)</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : {</a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 280 : rval = (rval * BASE) + digit;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : else</a>
+<a name="99"><span class="lineNum"> 99 </span> : : {</a>
+<a name="100"><span class="lineNum"> 100 </span> : : //digit found, but its too big for current base</a>
+<a name="101"><span class="lineNum"> 101 </span> : : //end of parseable number reached...</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 25 : break;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : //next...</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 280 : (*PTR)++;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : }</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 95 : if (negative)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : {</a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 20 : return rval * -1;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : }</a>
+<a name="111"><span class="lineNum"> 111 </span> : : //else</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 75 : return rval;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/strtoul.c.func-sort-c.html b/coverage-report/libc/stdlib/strtoul.c.func-sort-c.html
new file mode 100644
index 0000000..40f6936
--- /dev/null
+++ b/coverage-report/libc/stdlib/strtoul.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/strtoul.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - strtoul.c<span style="font-size: 80%;"> (<a href="strtoul.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strtoul.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strtoul.c.gcov.html#13">strtoul</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/strtoul.c.func.html b/coverage-report/libc/stdlib/strtoul.c.func.html
new file mode 100644
index 0000000..60dc796
--- /dev/null
+++ b/coverage-report/libc/stdlib/strtoul.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/strtoul.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - strtoul.c<span style="font-size: 80%;"> (<a href="strtoul.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strtoul.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strtoul.c.gcov.html#13">strtoul</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/stdlib/strtoul.c.gcov.html b/coverage-report/libc/stdlib/strtoul.c.gcov.html
new file mode 100644
index 0000000..c292246
--- /dev/null
+++ b/coverage-report/libc/stdlib/strtoul.c.gcov.html
@@ -0,0 +1,188 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/stdlib/strtoul.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/stdlib</a> - strtoul.c<span style="font-size: 80%;"> (source / <a href="strtoul.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 80 : unsigned long int strtoul(const char *S, char **PTR,int BASE)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 80 : unsigned long rval = 0;</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : short int digit;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : // *PTR is S, unless PTR is NULL, in which case i override it with my own ptr</a>
+<a name="20"><span class="lineNum"> 20 </span> : : char* ptr;</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 80 : if (PTR == NULL)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : //override</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 80 : PTR = &amp;ptr;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : // i use PTR to advance through the string</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 80 : *PTR = (char *) S;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : //check if BASE is ok</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 80 : if ((BASE &lt; 0) || BASE &gt; 36)</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : {</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 10 : return 0;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : // ignore white space at beginning of S</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 80 : while ((**PTR == ' ')</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 70 : || (**PTR == '\t')</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 70 : || (**PTR == '\n')</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 70 : || (**PTR == '\r')</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : )</a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 10 : (*PTR)++;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : // if BASE is 0... determine the base from the first chars...</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 70 : if (BASE == 0)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> : : // if S starts with &quot;0x&quot;, BASE = 16, else 10</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 15 : if ((**PTR == '0') &amp;&amp; (*((*PTR)+1) == 'x'))</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 10 : BASE = 16;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : }</a>
+<a name="50"><span class="lineNum"> 50 </span> : : else</a>
+<a name="51"><span class="lineNum"> 51 </span> : : {</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 5 : BASE = 10;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 70 : if (BASE == 16)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> : : // S may start with &quot;0x&quot;</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 10 : if ((**PTR == '0') &amp;&amp; (*((*PTR)+1) == 'x'))</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 10 : (*PTR)++;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 10 : (*PTR)++;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : }</a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+<a name="64"><span class="lineNum"> 64 </span> : : //until end of string</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 240 : while (**PTR)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : {</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 200 : if (((**PTR) &gt;= '0') &amp;&amp; ((**PTR) &lt;='9'))</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : {</a>
+<a name="69"><span class="lineNum"> 69 </span> : : //digit (0..9)</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 165 : digit = **PTR - '0';</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : }</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 35 : else if (((**PTR) &gt;= 'a') &amp;&amp; ((**PTR) &lt;='z'))</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : {</a>
+<a name="74"><span class="lineNum"> 74 </span> : : //alphanumeric digit lowercase(a (10) .. z (35) )</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 20 : digit = (**PTR - 'a') + 10;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 15 : else if (((**PTR) &gt;= 'A') &amp;&amp; ((**PTR) &lt;='Z'))</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : {</a>
+<a name="79"><span class="lineNum"> 79 </span> : : //alphanumeric digit uppercase(a (10) .. z (35) )</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 5 : digit = (**PTR - 'A') + 10;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : }</a>
+<a name="82"><span class="lineNum"> 82 </span> : : else</a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : //end of parseable number reached...</a>
+<a name="85"><span class="lineNum"> 85 </span> : : break;</a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 190 : if (digit &lt; BASE)</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : {</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 170 : rval = (rval * BASE) + digit;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : else</a>
+<a name="92"><span class="lineNum"> 92 </span> : : {</a>
+<a name="93"><span class="lineNum"> 93 </span> : : //digit found, but its too big for current base</a>
+<a name="94"><span class="lineNum"> 94 </span> : : //end of parseable number reached...</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 20 : break;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : }</a>
+<a name="97"><span class="lineNum"> 97 </span> : : //next...</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 170 : (*PTR)++;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : }</a>
+<a name="100"><span class="lineNum"> 100 </span> : : //done</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 70 : return rval;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : }</a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/index-sort-b.html b/coverage-report/libc/string/index-sort-b.html
new file mode 100644
index 0000000..1d30af0
--- /dev/null
+++ b/coverage-report/libc/string/index-sort-b.html
@@ -0,0 +1,311 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/string</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">120</td>
+ <td class="headerCovTableEntry">168</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryMed">77.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcpy.c.gcov.html">memcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncmp.c.gcov.html">strncmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 9</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncpy.c.gcov.html">strncpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strdup.c.gcov.html">strdup.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strstr.c.gcov.html">strstr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 11</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncasecmp.c.gcov.html">strncasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcasecmp.c.gcov.html">strcasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcpy.c.gcov.html">strcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strrchr.c.gcov.html">strrchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memmove.c.gcov.html">memmove.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcat.c.gcov.html">strcat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strchr.c.gcov.html">strchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcmp.c.gcov.html">memcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memset.c.gcov.html">memset.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memchr.c.gcov.html">memchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strlen.c.gcov.html">strlen.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=46 height=10 alt="46.2%"><img src="../../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcmp.c.gcov.html">strcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtok.c.gcov.html">strtok.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 21</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/index-sort-f.html b/coverage-report/libc/string/index-sort-f.html
new file mode 100644
index 0000000..5b34848
--- /dev/null
+++ b/coverage-report/libc/string/index-sort-f.html
@@ -0,0 +1,311 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/string</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">120</td>
+ <td class="headerCovTableEntry">168</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryMed">77.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncmp.c.gcov.html">strncmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 9</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strstr.c.gcov.html">strstr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 11</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtok.c.gcov.html">strtok.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 21</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strlen.c.gcov.html">strlen.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=46 height=10 alt="46.2%"><img src="../../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strdup.c.gcov.html">strdup.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcpy.c.gcov.html">memcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncpy.c.gcov.html">strncpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncasecmp.c.gcov.html">strncasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcasecmp.c.gcov.html">strcasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcpy.c.gcov.html">strcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strrchr.c.gcov.html">strrchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memmove.c.gcov.html">memmove.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcat.c.gcov.html">strcat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strchr.c.gcov.html">strchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcmp.c.gcov.html">memcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memset.c.gcov.html">memset.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memchr.c.gcov.html">memchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcmp.c.gcov.html">strcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/index-sort-l.html b/coverage-report/libc/string/index-sort-l.html
new file mode 100644
index 0000000..afdc700
--- /dev/null
+++ b/coverage-report/libc/string/index-sort-l.html
@@ -0,0 +1,311 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/string</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">120</td>
+ <td class="headerCovTableEntry">168</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryMed">77.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncmp.c.gcov.html">strncmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 9</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strstr.c.gcov.html">strstr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 11</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtok.c.gcov.html">strtok.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 21</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strlen.c.gcov.html">strlen.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=46 height=10 alt="46.2%"><img src="../../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcat.c.gcov.html">strcat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strdup.c.gcov.html">strdup.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcpy.c.gcov.html">strcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcasecmp.c.gcov.html">strcasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strchr.c.gcov.html">strchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcmp.c.gcov.html">strcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strrchr.c.gcov.html">strrchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memmove.c.gcov.html">memmove.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memchr.c.gcov.html">memchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncpy.c.gcov.html">strncpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncasecmp.c.gcov.html">strncasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcmp.c.gcov.html">memcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcpy.c.gcov.html">memcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memset.c.gcov.html">memset.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/index.html b/coverage-report/libc/string/index.html
new file mode 100644
index 0000000..93c4c9f
--- /dev/null
+++ b/coverage-report/libc/string/index.html
@@ -0,0 +1,311 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/string</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">120</td>
+ <td class="headerCovTableEntry">168</td>
+ <td class="headerCovTableEntryLo">71.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryMed">77.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memchr.c.gcov.html">memchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcmp.c.gcov.html">memcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memcpy.c.gcov.html">memcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memmove.c.gcov.html">memmove.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="memset.c.gcov.html">memset.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">15 / 15</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcasecmp.c.gcov.html">strcasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcat.c.gcov.html">strcat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strchr.c.gcov.html">strchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcmp.c.gcov.html">strcmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strcpy.c.gcov.html">strcpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strdup.c.gcov.html">strdup.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5 / 5</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strlen.c.gcov.html">strlen.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=46 height=10 alt="46.2%"><img src="../../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">6 / 13</td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">1 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncasecmp.c.gcov.html">strncasecmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncmp.c.gcov.html">strncmp.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 9</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strncpy.c.gcov.html">strncpy.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strrchr.c.gcov.html">strrchr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strstr.c.gcov.html">strstr.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 11</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="strtok.c.gcov.html">strtok.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 21</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memchr.c.func-sort-c.html b/coverage-report/libc/string/memchr.c.func-sort-c.html
new file mode 100644
index 0000000..d0a3791
--- /dev/null
+++ b/coverage-report/libc/string/memchr.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memchr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memchr.c<span style="font-size: 80%;"> (<a href="memchr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="memchr.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memchr.c.gcov.html#14">memchr</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memchr.c.func.html b/coverage-report/libc/string/memchr.c.func.html
new file mode 100644
index 0000000..8e2924a
--- /dev/null
+++ b/coverage-report/libc/string/memchr.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memchr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memchr.c<span style="font-size: 80%;"> (<a href="memchr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="memchr.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memchr.c.gcov.html#14">memchr</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memchr.c.gcov.html b/coverage-report/libc/string/memchr.c.gcov.html
new file mode 100644
index 0000000..152839d
--- /dev/null
+++ b/coverage-report/libc/string/memchr.c.gcov.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memchr.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memchr.c<span style="font-size: 80%;"> (source / <a href="memchr.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : void *memchr(const void *ptr, int c, size_t n);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 10 : void *memchr(const void *ptr, int c, size_t n)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 10 : unsigned char ch = (unsigned char)c;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 10 : const unsigned char *p = ptr;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 90 : while (n-- &gt; 0) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 85 : if (*p == ch)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 5 : return (void *)p;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 80 : p += 1;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 5 : return NULL;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memcmp.c.func-sort-c.html b/coverage-report/libc/string/memcmp.c.func-sort-c.html
new file mode 100644
index 0000000..0c36cd9
--- /dev/null
+++ b/coverage-report/libc/string/memcmp.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memcmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memcmp.c<span style="font-size: 80%;"> (<a href="memcmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="memcmp.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memcmp.c.gcov.html#14">memcmp</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memcmp.c.func.html b/coverage-report/libc/string/memcmp.c.func.html
new file mode 100644
index 0000000..75ab9c0
--- /dev/null
+++ b/coverage-report/libc/string/memcmp.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memcmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memcmp.c<span style="font-size: 80%;"> (<a href="memcmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="memcmp.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memcmp.c.gcov.html#14">memcmp</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memcmp.c.gcov.html b/coverage-report/libc/string/memcmp.c.gcov.html
new file mode 100644
index 0000000..593383c
--- /dev/null
+++ b/coverage-report/libc/string/memcmp.c.gcov.html
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memcmp.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memcmp.c<span style="font-size: 80%;"> (source / <a href="memcmp.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : int memcmp(const void *ptr1, const void *ptr2, size_t n);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 25 : int memcmp(const void *ptr1, const void *ptr2, size_t n)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 25 : const unsigned char *p1 = ptr1;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 25 : const unsigned char *p2 = ptr2;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 265 : while (n-- &gt; 0) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 245 : if (*p1 != *p2)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 5 : return (*p1 - *p2);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 240 : p1 += 1;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 240 : p2 += 1;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 20 : return 0;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memcpy.c.func-sort-c.html b/coverage-report/libc/string/memcpy.c.func-sort-c.html
new file mode 100644
index 0000000..2d6ec2b
--- /dev/null
+++ b/coverage-report/libc/string/memcpy.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memcpy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memcpy.c<span style="font-size: 80%;"> (<a href="memcpy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="memcpy.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memcpy.c.gcov.html#15">memcpy</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memcpy.c.func.html b/coverage-report/libc/string/memcpy.c.func.html
new file mode 100644
index 0000000..9f0c647
--- /dev/null
+++ b/coverage-report/libc/string/memcpy.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memcpy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memcpy.c<span style="font-size: 80%;"> (<a href="memcpy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="memcpy.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memcpy.c.gcov.html#15">memcpy</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memcpy.c.gcov.html b/coverage-report/libc/string/memcpy.c.gcov.html
new file mode 100644
index 0000000..2045d07
--- /dev/null
+++ b/coverage-report/libc/string/memcpy.c.gcov.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memcpy.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memcpy.c<span style="font-size: 80%;"> (source / <a href="memcpy.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;ccan/short_types/short_types.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : void *memcpy(void *dest, const void *src, size_t n);</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 25 : void *memcpy(void *dest, const void *src, size_t n)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 25 : void *ret = dest;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 30 : while (n &gt;= 8) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 5 : *(uint64_t *)dest = *(uint64_t *)src;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 5 : dest += 8;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 5 : src += 8;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 5 : n -= 8;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 105 : while (n &gt; 0) {</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 80 : *(uint8_t *)dest = *(uint8_t *)src;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 80 : dest += 1;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 80 : src += 1;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 80 : n -= 1;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 25 : return ret;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memmove.c.func-sort-c.html b/coverage-report/libc/string/memmove.c.func-sort-c.html
new file mode 100644
index 0000000..6ec52d1
--- /dev/null
+++ b/coverage-report/libc/string/memmove.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memmove.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memmove.c<span style="font-size: 80%;"> (<a href="memmove.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="memmove.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memmove.c.gcov.html#15">memmove</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memmove.c.func.html b/coverage-report/libc/string/memmove.c.func.html
new file mode 100644
index 0000000..7f4698c
--- /dev/null
+++ b/coverage-report/libc/string/memmove.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memmove.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memmove.c<span style="font-size: 80%;"> (<a href="memmove.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="memmove.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memmove.c.gcov.html#15">memmove</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memmove.c.gcov.html b/coverage-report/libc/string/memmove.c.gcov.html
new file mode 100644
index 0000000..4554880
--- /dev/null
+++ b/coverage-report/libc/string/memmove.c.gcov.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memmove.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memmove.c<span style="font-size: 80%;"> (source / <a href="memmove.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : void *memcpy(void *dest, const void *src, size_t n);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : void *memmove(void *dest, const void *src, size_t n);</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 15 : void *memmove(void *dest, const void *src, size_t n)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> : : /* Do the buffers overlap in a bad way? */</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 15 : if (src &lt; dest &amp;&amp; src + n &gt;= dest) {</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : char *cdest;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : const char *csrc;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : int i;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : /* Copy from end to start */</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 5 : cdest = dest + n - 1;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 5 : csrc = src + n - 1;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 55 : for (i = 0; i &lt; n; i++) {</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 50 : *cdest-- = *csrc--;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 5 : return dest;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : } else {</a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* Normal copy is possible */</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 10 : return memcpy(dest, src, n);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memset.c.func-sort-c.html b/coverage-report/libc/string/memset.c.func-sort-c.html
new file mode 100644
index 0000000..9b0131c
--- /dev/null
+++ b/coverage-report/libc/string/memset.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memset.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memset.c<span style="font-size: 80%;"> (<a href="memset.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="memset.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memset.c.gcov.html#16">memset</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memset.c.func.html b/coverage-report/libc/string/memset.c.func.html
new file mode 100644
index 0000000..54ee051
--- /dev/null
+++ b/coverage-report/libc/string/memset.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memset.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memset.c<span style="font-size: 80%;"> (<a href="memset.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="memset.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="memset.c.gcov.html#16">memset</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/memset.c.gcov.html b/coverage-report/libc/string/memset.c.gcov.html
new file mode 100644
index 0000000..6219a59
--- /dev/null
+++ b/coverage-report/libc/string/memset.c.gcov.html
@@ -0,0 +1,139 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/memset.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - memset.c<span style="font-size: 80%;"> (source / <a href="memset.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define CACHE_LINE_SIZE 128</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : void *memset(void *dest, int c, size_t size);</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 20 : void *memset(void *dest, int c, size_t size)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 20 : unsigned char *d = (unsigned char *)dest;</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 20 : unsigned long big_c = 0;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : #if defined(__powerpc__) || defined(__powerpc64__)</a>
+<a name="24"><span class="lineNum"> 24 </span> : : if (size &gt; CACHE_LINE_SIZE &amp;&amp; c==0) {</a>
+<a name="25"><span class="lineNum"> 25 </span> : : while ((unsigned long long)d % CACHE_LINE_SIZE) {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : *d++ = (unsigned char)c;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : size--;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+<a name="29"><span class="lineNum"> 29 </span> : : while (size &gt;= CACHE_LINE_SIZE) {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : asm volatile (&quot;dcbz 0,%0\n&quot; : : &quot;r&quot;(d) : &quot;memory&quot;);</a>
+<a name="31"><span class="lineNum"> 31 </span> : : d+= CACHE_LINE_SIZE;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : size-= CACHE_LINE_SIZE;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #endif</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 20 : if (c) {</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 5 : big_c = c;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 5 : big_c |= (big_c &lt;&lt; 8) | big_c;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 5 : big_c |= (big_c &lt;&lt; 16) | big_c;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 5 : big_c |= (big_c &lt;&lt; 32) | big_c;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 815 : while (size &gt;= 8 &amp;&amp; c == 0) {</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 795 : *((unsigned long *)d) = big_c;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 795 : d+=8;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 795 : size-=8;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 555 : while (size-- &gt; 0) {</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 535 : *d++ = (unsigned char)c;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 20 : return dest;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcasecmp.c.func-sort-c.html b/coverage-report/libc/string/strcasecmp.c.func-sort-c.html
new file mode 100644
index 0000000..9215591
--- /dev/null
+++ b/coverage-report/libc/string/strcasecmp.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcasecmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcasecmp.c<span style="font-size: 80%;"> (<a href="strcasecmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strcasecmp.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcasecmp.c.gcov.html#14">strcasecmp</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcasecmp.c.func.html b/coverage-report/libc/string/strcasecmp.c.func.html
new file mode 100644
index 0000000..c3e1d01
--- /dev/null
+++ b/coverage-report/libc/string/strcasecmp.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcasecmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcasecmp.c<span style="font-size: 80%;"> (<a href="strcasecmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strcasecmp.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcasecmp.c.gcov.html#14">strcasecmp</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcasecmp.c.gcov.html b/coverage-report/libc/string/strcasecmp.c.gcov.html
new file mode 100644
index 0000000..d4d8aa1
--- /dev/null
+++ b/coverage-report/libc/string/strcasecmp.c.gcov.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcasecmp.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcasecmp.c<span style="font-size: 80%;"> (source / <a href="strcasecmp.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : int strcasecmp(const char *s1, const char *s2);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 20 : int strcasecmp(const char *s1, const char *s2)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 190 : while (*s1 != 0 &amp;&amp; *s2 != 0) {</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 180 : if (toupper(*s1) != toupper(*s2))</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 10 : break;</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 170 : ++s1;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 170 : ++s2;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 20 : return *s1 - *s2;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcat.c.func-sort-c.html b/coverage-report/libc/string/strcat.c.func-sort-c.html
new file mode 100644
index 0000000..0c50137
--- /dev/null
+++ b/coverage-report/libc/string/strcat.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcat.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcat.c<span style="font-size: 80%;"> (<a href="strcat.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strcat.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcat.c.gcov.html#16">strcat</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcat.c.func.html b/coverage-report/libc/string/strcat.c.func.html
new file mode 100644
index 0000000..eb4733f
--- /dev/null
+++ b/coverage-report/libc/string/strcat.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcat.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcat.c<span style="font-size: 80%;"> (<a href="strcat.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strcat.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcat.c.gcov.html#16">strcat</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcat.c.gcov.html b/coverage-report/libc/string/strcat.c.gcov.html
new file mode 100644
index 0000000..3a84b26
--- /dev/null
+++ b/coverage-report/libc/string/strcat.c.gcov.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcat.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcat.c<span style="font-size: 80%;"> (source / <a href="strcat.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : size_t strlen(const char *s);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : char *strcpy(char *dst, const char *src);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : char *strcat(char *dst, const char *src);</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 10 : char *strcat(char *dst, const char *src)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : size_t p;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 10 : p = strlen(dst);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 10 : strcpy(&amp;dst[p], src);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 10 : return dst;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strchr.c.func-sort-c.html b/coverage-report/libc/string/strchr.c.func-sort-c.html
new file mode 100644
index 0000000..3cc5017
--- /dev/null
+++ b/coverage-report/libc/string/strchr.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strchr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strchr.c<span style="font-size: 80%;"> (<a href="strchr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strchr.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strchr.c.gcov.html#14">strchr</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strchr.c.func.html b/coverage-report/libc/string/strchr.c.func.html
new file mode 100644
index 0000000..c62b207
--- /dev/null
+++ b/coverage-report/libc/string/strchr.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strchr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strchr.c<span style="font-size: 80%;"> (<a href="strchr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strchr.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strchr.c.gcov.html#14">strchr</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strchr.c.gcov.html b/coverage-report/libc/string/strchr.c.gcov.html
new file mode 100644
index 0000000..838fc4f
--- /dev/null
+++ b/coverage-report/libc/string/strchr.c.gcov.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strchr.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strchr.c<span style="font-size: 80%;"> (source / <a href="strchr.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : char *strchr(const char *s, int c);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 20 : char *strchr(const char *s, int c)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 20 : char cb = c;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 140 : while (*s != 0) {</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 135 : if (*s == cb) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 15 : return (char *)s;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 120 : s += 1;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 5 : return NULL;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcmp.c.func-sort-c.html b/coverage-report/libc/string/strcmp.c.func-sort-c.html
new file mode 100644
index 0000000..6760941
--- /dev/null
+++ b/coverage-report/libc/string/strcmp.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcmp.c<span style="font-size: 80%;"> (<a href="strcmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strcmp.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcmp.c.gcov.html#12">strcmp</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcmp.c.func.html b/coverage-report/libc/string/strcmp.c.func.html
new file mode 100644
index 0000000..ac81f53
--- /dev/null
+++ b/coverage-report/libc/string/strcmp.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcmp.c<span style="font-size: 80%;"> (<a href="strcmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strcmp.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcmp.c.gcov.html#12">strcmp</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcmp.c.gcov.html b/coverage-report/libc/string/strcmp.c.gcov.html
new file mode 100644
index 0000000..813bbdd
--- /dev/null
+++ b/coverage-report/libc/string/strcmp.c.gcov.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcmp.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcmp.c<span style="font-size: 80%;"> (source / <a href="strcmp.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : int strcmp(const char *s1, const char *s2);</a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 10 : int strcmp(const char *s1, const char *s2)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 75 : while (*s1 != 0 &amp;&amp; *s2 != 0) {</span></a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 70 : if (*s1 != *s2)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 5 : break;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 65 : s1 += 1;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 65 : s2 += 1;</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : }</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 10 : return *s1 - *s2;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcpy.c.func-sort-c.html b/coverage-report/libc/string/strcpy.c.func-sort-c.html
new file mode 100644
index 0000000..d10432a
--- /dev/null
+++ b/coverage-report/libc/string/strcpy.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcpy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcpy.c<span style="font-size: 80%;"> (<a href="strcpy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strcpy.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcpy.c.gcov.html#12">strcpy</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcpy.c.func.html b/coverage-report/libc/string/strcpy.c.func.html
new file mode 100644
index 0000000..7bdbe5d
--- /dev/null
+++ b/coverage-report/libc/string/strcpy.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcpy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcpy.c<span style="font-size: 80%;"> (<a href="strcpy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strcpy.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strcpy.c.gcov.html#12">strcpy</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strcpy.c.gcov.html b/coverage-report/libc/string/strcpy.c.gcov.html
new file mode 100644
index 0000000..a4127bf
--- /dev/null
+++ b/coverage-report/libc/string/strcpy.c.gcov.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strcpy.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strcpy.c<span style="font-size: 80%;"> (source / <a href="strcpy.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : char *strcpy(char *dst, const char *src);</a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 10 : char *strcpy(char *dst, const char *src)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 10 : char *ptr = dst;</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : do {</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 245 : *ptr++ = *src;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 245 : } while (*src++ != 0);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 10 : return dst;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strdup.c.func-sort-c.html b/coverage-report/libc/string/strdup.c.func-sort-c.html
new file mode 100644
index 0000000..9ad73cd
--- /dev/null
+++ b/coverage-report/libc/string/strdup.c.func-sort-c.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strdup.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strdup.c<span style="font-size: 80%;"> (<a href="strdup.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strdup.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strdup.c.func.html b/coverage-report/libc/string/strdup.c.func.html
new file mode 100644
index 0000000..1b241d0
--- /dev/null
+++ b/coverage-report/libc/string/strdup.c.func.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strdup.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strdup.c<span style="font-size: 80%;"> (<a href="strdup.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strdup.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strdup.c.gcov.html b/coverage-report/libc/string/strdup.c.gcov.html
new file mode 100644
index 0000000..90539cd
--- /dev/null
+++ b/coverage-report/libc/string/strdup.c.gcov.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strdup.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strdup.c<span style="font-size: 80%;"> (source / <a href="strdup.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2012 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : size_t strlen(const char *s);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : void *memcpy(void *dest, const void *src, size_t n);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : char *strdup(const char *src);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : char *strdup(const char *src)</a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 42 : size_t len = strlen(src) + 1;</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : char *ret;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 42 : ret = malloc(len);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 42 : if (ret)</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 42 : memcpy(ret, src, len);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 42 : return ret;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strlen.c.func-sort-c.html b/coverage-report/libc/string/strlen.c.func-sort-c.html
new file mode 100644
index 0000000..3ed413a
--- /dev/null
+++ b/coverage-report/libc/string/strlen.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strlen.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strlen.c<span style="font-size: 80%;"> (<a href="strlen.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strlen.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strlen.c.gcov.html#27">strnlen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strlen.c.gcov.html#14">strlen</a></td>
+ <td class="coverFnHi">75</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strlen.c.func.html b/coverage-report/libc/string/strlen.c.func.html
new file mode 100644
index 0000000..7b1a4ac
--- /dev/null
+++ b/coverage-report/libc/string/strlen.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strlen.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strlen.c<span style="font-size: 80%;"> (<a href="strlen.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strlen.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strlen.c.gcov.html#14">strlen</a></td>
+ <td class="coverFnHi">75</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strlen.c.gcov.html#27">strnlen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strlen.c.gcov.html b/coverage-report/libc/string/strlen.c.gcov.html
new file mode 100644
index 0000000..bc7583e
--- /dev/null
+++ b/coverage-report/libc/string/strlen.c.gcov.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strlen.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strlen.c<span style="font-size: 80%;"> (source / <a href="strlen.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : size_t strlen(const char *s);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 75 : size_t strlen(const char *s)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 75 : size_t len = 0;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 845 : while (*s != 0) {</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 770 : len += 1;</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 770 : s += 1;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 75 : return len;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : size_t strnlen(const char *s, size_t n);</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : size_t strnlen(const char *s, size_t n)</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : {</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : size_t len = 0;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : while (*s != 0 &amp;&amp; n) {</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : len += 1;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : s += 1;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : n--;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : }</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : return len;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncasecmp.c.func-sort-c.html b/coverage-report/libc/string/strncasecmp.c.func-sort-c.html
new file mode 100644
index 0000000..3eadd46
--- /dev/null
+++ b/coverage-report/libc/string/strncasecmp.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncasecmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncasecmp.c<span style="font-size: 80%;"> (<a href="strncasecmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strncasecmp.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strncasecmp.c.gcov.html#14">strncasecmp</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncasecmp.c.func.html b/coverage-report/libc/string/strncasecmp.c.func.html
new file mode 100644
index 0000000..8904ead
--- /dev/null
+++ b/coverage-report/libc/string/strncasecmp.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncasecmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncasecmp.c<span style="font-size: 80%;"> (<a href="strncasecmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strncasecmp.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strncasecmp.c.gcov.html#14">strncasecmp</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncasecmp.c.gcov.html b/coverage-report/libc/string/strncasecmp.c.gcov.html
new file mode 100644
index 0000000..79baccc
--- /dev/null
+++ b/coverage-report/libc/string/strncasecmp.c.gcov.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncasecmp.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncasecmp.c<span style="font-size: 80%;"> (source / <a href="strncasecmp.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : int strncasecmp(const char *s1, const char *s2, size_t n);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 40 : int strncasecmp(const char *s1, const char *s2, size_t n)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 40 : if (n &lt; 1)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 5 : return 0;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 220 : while (*s1 != 0 &amp;&amp; *s2 != 0 &amp;&amp; --n &gt; 0) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 195 : if (toupper(*s1) != toupper(*s2))</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 10 : break;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 185 : ++s1;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 185 : ++s2;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 35 : return toupper(*s1) - toupper(*s2);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncmp.c.func-sort-c.html b/coverage-report/libc/string/strncmp.c.func-sort-c.html
new file mode 100644
index 0000000..43692cf
--- /dev/null
+++ b/coverage-report/libc/string/strncmp.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncmp.c<span style="font-size: 80%;"> (<a href="strncmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strncmp.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strncmp.c.gcov.html#14">strncmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncmp.c.func.html b/coverage-report/libc/string/strncmp.c.func.html
new file mode 100644
index 0000000..9fcb59e
--- /dev/null
+++ b/coverage-report/libc/string/strncmp.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncmp.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncmp.c<span style="font-size: 80%;"> (<a href="strncmp.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strncmp.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strncmp.c.gcov.html#14">strncmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncmp.c.gcov.html b/coverage-report/libc/string/strncmp.c.gcov.html
new file mode 100644
index 0000000..928a14e
--- /dev/null
+++ b/coverage-report/libc/string/strncmp.c.gcov.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncmp.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncmp.c<span style="font-size: 80%;"> (source / <a href="strncmp.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : int strncmp(const char *s1, const char *s2, size_t n);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineNoCov"> 0 : int strncmp(const char *s1, const char *s2, size_t n)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineNoCov"> 0 : if (n &lt; 1)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : while (*s1 != 0 &amp;&amp; *s2 != 0 &amp;&amp; --n &gt; 0) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : if (*s1 != *s2)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : s1 += 1;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : s2 += 1;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : return *s1 - *s2;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncpy.c.func-sort-c.html b/coverage-report/libc/string/strncpy.c.func-sort-c.html
new file mode 100644
index 0000000..8d16340
--- /dev/null
+++ b/coverage-report/libc/string/strncpy.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncpy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncpy.c<span style="font-size: 80%;"> (<a href="strncpy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strncpy.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strncpy.c.gcov.html#14">strncpy</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncpy.c.func.html b/coverage-report/libc/string/strncpy.c.func.html
new file mode 100644
index 0000000..4117a84
--- /dev/null
+++ b/coverage-report/libc/string/strncpy.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncpy.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncpy.c<span style="font-size: 80%;"> (<a href="strncpy.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strncpy.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strncpy.c.gcov.html#14">strncpy</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strncpy.c.gcov.html b/coverage-report/libc/string/strncpy.c.gcov.html
new file mode 100644
index 0000000..d6949db
--- /dev/null
+++ b/coverage-report/libc/string/strncpy.c.gcov.html
@@ -0,0 +1,118 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strncpy.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strncpy.c<span style="font-size: 80%;"> (source / <a href="strncpy.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : char *strncpy(char *dst, const char *src, size_t n);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 25 : char *strncpy(char *dst, const char *src, size_t n)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 25 : char *ret = dst;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* Copy string */</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 260 : while (*src != 0 &amp;&amp; n &gt; 0) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 235 : *dst++ = *src++;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 235 : n -= 1;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : /* strncpy always clears the rest of destination string... */</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 290 : while (n &gt; 0) {</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 265 : *dst++ = 0;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 265 : n -= 1;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : }</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 25 : return ret;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strrchr.c.func-sort-c.html b/coverage-report/libc/string/strrchr.c.func-sort-c.html
new file mode 100644
index 0000000..eddda20
--- /dev/null
+++ b/coverage-report/libc/string/strrchr.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strrchr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strrchr.c<span style="font-size: 80%;"> (<a href="strrchr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strrchr.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strrchr.c.gcov.html#14">strrchr</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strrchr.c.func.html b/coverage-report/libc/string/strrchr.c.func.html
new file mode 100644
index 0000000..935b9c7
--- /dev/null
+++ b/coverage-report/libc/string/strrchr.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strrchr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strrchr.c<span style="font-size: 80%;"> (<a href="strrchr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strrchr.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strrchr.c.gcov.html#14">strrchr</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strrchr.c.gcov.html b/coverage-report/libc/string/strrchr.c.gcov.html
new file mode 100644
index 0000000..be60723
--- /dev/null
+++ b/coverage-report/libc/string/strrchr.c.gcov.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strrchr.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strrchr.c<span style="font-size: 80%;"> (source / <a href="strrchr.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008, 2019 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : char *strrchr(const char *s, int c);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 25 : char *strrchr(const char *s, int c)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 25 : char *last = NULL;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 25 : char cb = c;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 325 : while (*s != 0) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 300 : if (*s == cb)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 35 : last = (char *)s;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 300 : s += 1;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 25 : return last;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strstr.c.func-sort-c.html b/coverage-report/libc/string/strstr.c.func-sort-c.html
new file mode 100644
index 0000000..1e79b05
--- /dev/null
+++ b/coverage-report/libc/string/strstr.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strstr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strstr.c<span style="font-size: 80%;"> (<a href="strstr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strstr.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strstr.c.gcov.html#16">strstr</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strstr.c.func.html b/coverage-report/libc/string/strstr.c.func.html
new file mode 100644
index 0000000..7bf5353
--- /dev/null
+++ b/coverage-report/libc/string/strstr.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strstr.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strstr.c<span style="font-size: 80%;"> (<a href="strstr.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strstr.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strstr.c.gcov.html#16">strstr</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strstr.c.gcov.html b/coverage-report/libc/string/strstr.c.gcov.html
new file mode 100644
index 0000000..1e03ec9
--- /dev/null
+++ b/coverage-report/libc/string/strstr.c.gcov.html
@@ -0,0 +1,124 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strstr.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strstr.c<span style="font-size: 80%;"> (source / <a href="strstr.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : size_t strlen(const char *s);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : int strncmp(const char *s1, const char *s2, size_t n);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : char *strstr(const char *hay, const char *needle);</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineNoCov"> 0 : char *strstr(const char *hay, const char *needle)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : char *pos;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : size_t hlen, nlen;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : if (hay == NULL || needle == NULL)</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : hlen = strlen(hay);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : nlen = strlen(needle);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : if (nlen &lt; 1)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : return (char *)hay;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : for (pos = (char *)hay; pos &lt; hay + hlen; pos++) {</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : if (strncmp(pos, needle, nlen) == 0) {</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : return pos;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strtok.c.func-sort-c.html b/coverage-report/libc/string/strtok.c.func-sort-c.html
new file mode 100644
index 0000000..4ecfb8d
--- /dev/null
+++ b/coverage-report/libc/string/strtok.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strtok.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strtok.c<span style="font-size: 80%;"> (<a href="strtok.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="strtok.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strtok.c.gcov.html#14">strtok</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strtok.c.func.html b/coverage-report/libc/string/strtok.c.func.html
new file mode 100644
index 0000000..954e18b
--- /dev/null
+++ b/coverage-report/libc/string/strtok.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strtok.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strtok.c<span style="font-size: 80%;"> (<a href="strtok.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="strtok.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="strtok.c.gcov.html#14">strtok</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/string/strtok.c.gcov.html b/coverage-report/libc/string/strtok.c.gcov.html
new file mode 100644
index 0000000..50c6287
--- /dev/null
+++ b/coverage-report/libc/string/strtok.c.gcov.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/string/strtok.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/string</a> - strtok.c<span style="font-size: 80%;"> (source / <a href="strtok.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">21</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /******************************************************************************</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * Copyright (c) 2004, 2008 IBM Corporation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * All rights reserved.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * This program and the accompanying materials</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * are made available under the terms of the BSD License</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * which accompanies this distribution, and is available at</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.opensource.org/licenses/bsd-license.php</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Contributors:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * IBM Corporation - initial implementation</a>
+<a name="11"><span class="lineNum"> 11 </span> : : *****************************************************************************/</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : char *strtok(char *src, const char *pattern);</a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineNoCov"> 0 : char *strtok(char *src, const char *pattern)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : static char *nxtTok;</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : char *retVal = NULL;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : if (!src) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : src = nxtTok;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : if (!src)</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : return retVal;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : while (*src) {</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : const char *pp = pattern;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : while (*pp) {</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : if (*pp == *src) {</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : pp++;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : if (!*pp) {</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : if (!retVal)</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : retVal = src;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : else if (!src[-1])</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : } else</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : *src = '\0';</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : src++;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : nxtTok = src;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : return retVal;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/index-sort-b.html b/coverage-report/libc/test/index-sort-b.html
new file mode 100644
index 0000000..5b3f50f
--- /dev/null
+++ b/coverage-report/libc/test/index-sort-b.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">377</td>
+ <td class="headerCovTableEntry">383</td>
+ <td class="headerCovTableEntryHi">98.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf.c.gcov.html">run-snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.0%"><img src="../../snow.png" width=2 height=10 alt="98.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.0&nbsp;%</td>
+ <td class="coverNumHi">146 / 149</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype.c.gcov.html">run-ctype.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stdlib.c.gcov.html">run-stdlib.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops-test.c.gcov.html">run-memops-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=92 height=10 alt="92.0%"><img src="../../snow.png" width=8 height=10 alt="92.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.0&nbsp;%</td>
+ <td class="coverNumHi">23 / 25</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops.c.gcov.html">run-memops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype-test.c.gcov.html">run-ctype-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf-test.c.gcov.html">run-snprintf-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=91 height=10 alt="90.9%"><img src="../../snow.png" width=9 height=10 alt="90.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time.c.gcov.html">run-time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/index-sort-f.html b/coverage-report/libc/test/index-sort-f.html
new file mode 100644
index 0000000..72f5791
--- /dev/null
+++ b/coverage-report/libc/test/index-sort-f.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">377</td>
+ <td class="headerCovTableEntry">383</td>
+ <td class="headerCovTableEntryHi">98.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype.c.gcov.html">run-ctype.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stdlib.c.gcov.html">run-stdlib.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops.c.gcov.html">run-memops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time.c.gcov.html">run-time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf-test.c.gcov.html">run-snprintf-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=91 height=10 alt="90.9%"><img src="../../snow.png" width=9 height=10 alt="90.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype-test.c.gcov.html">run-ctype-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops-test.c.gcov.html">run-memops-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=92 height=10 alt="92.0%"><img src="../../snow.png" width=8 height=10 alt="92.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.0&nbsp;%</td>
+ <td class="coverNumHi">23 / 25</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf.c.gcov.html">run-snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.0%"><img src="../../snow.png" width=2 height=10 alt="98.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.0&nbsp;%</td>
+ <td class="coverNumHi">146 / 149</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/index-sort-l.html b/coverage-report/libc/test/index-sort-l.html
new file mode 100644
index 0000000..8822b60
--- /dev/null
+++ b/coverage-report/libc/test/index-sort-l.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">377</td>
+ <td class="headerCovTableEntry">383</td>
+ <td class="headerCovTableEntryHi">98.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf-test.c.gcov.html">run-snprintf-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=91 height=10 alt="90.9%"><img src="../../snow.png" width=9 height=10 alt="90.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops-test.c.gcov.html">run-memops-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=92 height=10 alt="92.0%"><img src="../../snow.png" width=8 height=10 alt="92.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.0&nbsp;%</td>
+ <td class="coverNumHi">23 / 25</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf.c.gcov.html">run-snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.0%"><img src="../../snow.png" width=2 height=10 alt="98.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.0&nbsp;%</td>
+ <td class="coverNumHi">146 / 149</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype-test.c.gcov.html">run-ctype-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time.c.gcov.html">run-time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stdlib.c.gcov.html">run-stdlib.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype.c.gcov.html">run-ctype.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops.c.gcov.html">run-memops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/index.html b/coverage-report/libc/test/index.html
new file mode 100644
index 0000000..b9b61a5
--- /dev/null
+++ b/coverage-report/libc/test/index.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libc/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">377</td>
+ <td class="headerCovTableEntry">383</td>
+ <td class="headerCovTableEntryHi">98.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntry">31</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype-test.c.gcov.html">run-ctype-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">12 / 12</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-ctype.c.gcov.html">run-ctype.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops-test.c.gcov.html">run-memops-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=92 height=10 alt="92.0%"><img src="../../snow.png" width=8 height=10 alt="92.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">92.0&nbsp;%</td>
+ <td class="coverNumHi">23 / 25</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-memops.c.gcov.html">run-memops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">53 / 53</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf-test.c.gcov.html">run-snprintf-test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=91 height=10 alt="90.9%"><img src="../../snow.png" width=9 height=10 alt="90.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">90.9&nbsp;%</td>
+ <td class="coverNumHi">10 / 11</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-snprintf.c.gcov.html">run-snprintf.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="98.0%"><img src="../../snow.png" width=2 height=10 alt="98.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.0&nbsp;%</td>
+ <td class="coverNumHi">146 / 149</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">10 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stdlib.c.gcov.html">run-stdlib.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">41 / 41</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-time.c.gcov.html">run-time.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">39 / 39</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-ctype-test.c.func-sort-c.html b/coverage-report/libc/test/run-ctype-test.c.func-sort-c.html
new file mode 100644
index 0000000..7dd20b6
--- /dev/null
+++ b/coverage-report/libc/test/run-ctype-test.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-ctype-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-ctype-test.c<span style="font-size: 80%;"> (<a href="run-ctype-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-ctype-test.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#46">skiboot_tolower</a></td>
+ <td class="coverFnHi">1285</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#51">skiboot_toupper</a></td>
+ <td class="coverFnHi">1285</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#26">skiboot_isdigit</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#31">skiboot_isprint</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#36">skiboot_isspace</a></td>
+ <td class="coverFnHi">1350</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#41">skiboot_isxdigit</a></td>
+ <td class="coverFnHi">1355</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-ctype-test.c.func.html b/coverage-report/libc/test/run-ctype-test.c.func.html
new file mode 100644
index 0000000..af14a06
--- /dev/null
+++ b/coverage-report/libc/test/run-ctype-test.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-ctype-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-ctype-test.c<span style="font-size: 80%;"> (<a href="run-ctype-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-ctype-test.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#26">skiboot_isdigit</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#31">skiboot_isprint</a></td>
+ <td class="coverFnHi">1345</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#36">skiboot_isspace</a></td>
+ <td class="coverFnHi">1350</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#41">skiboot_isxdigit</a></td>
+ <td class="coverFnHi">1355</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#46">skiboot_tolower</a></td>
+ <td class="coverFnHi">1285</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype-test.c.gcov.html#51">skiboot_toupper</a></td>
+ <td class="coverFnHi">1285</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-ctype-test.c.gcov.html b/coverage-report/libc/test/run-ctype-test.c.gcov.html
new file mode 100644
index 0000000..a5dcf86
--- /dev/null
+++ b/coverage-report/libc/test/run-ctype-test.c.gcov.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-ctype-test.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-ctype-test.c<span style="font-size: 80%;"> (source / <a href="run-ctype-test.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * This file is run with the skiboot libc files rather than system libc.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * This means we have a bit of &quot;fun&quot; with actually executing the tests on</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * the host.</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * Patches to make this less ugly are very welcome.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;config.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;../ctype/isdigit.c&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;../ctype/isprint.c&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;../ctype/isspace.c&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;../ctype/isxdigit.c&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;../ctype/tolower.c&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &quot;../ctype/toupper.c&quot;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : int skiboot_isdigit(int ch);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : int skiboot_isprint(int ch);</a>
+<a name="23"><span class="lineNum"> 23 </span> : : int skiboot_isspace(int ch);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : int skiboot_isxdigit(int ch);</a>
+<a name="25"><span class="lineNum"> 25 </span> : : int skiboot_tolower(int ch);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : int skiboot_toupper(int ch);</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1345 : int skiboot_isdigit(int ch)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : {</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1345 : return isdigit(ch);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : }</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 1345 : int skiboot_isprint(int ch)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : {</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1345 : return isprint(ch);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1350 : int skiboot_isspace(int ch)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1350 : return isspace(ch);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1355 : int skiboot_isxdigit(int ch)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1355 : return isxdigit(ch);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1285 : int skiboot_tolower(int ch)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : {</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1285 : return tolower(ch);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1285 : int skiboot_toupper(int ch)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1285 : return toupper(ch);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-ctype.c.func-sort-c.html b/coverage-report/libc/test/run-ctype.c.func-sort-c.html
new file mode 100644
index 0000000..b1c41dc
--- /dev/null
+++ b/coverage-report/libc/test/run-ctype.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-ctype.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-ctype.c<span style="font-size: 80%;"> (<a href="run-ctype.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-ctype.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype.c.gcov.html#20">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-ctype.c.func.html b/coverage-report/libc/test/run-ctype.c.func.html
new file mode 100644
index 0000000..e3cbff5
--- /dev/null
+++ b/coverage-report/libc/test/run-ctype.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-ctype.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-ctype.c<span style="font-size: 80%;"> (<a href="run-ctype.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-ctype.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-ctype.c.gcov.html#20">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-ctype.c.gcov.html b/coverage-report/libc/test/run-ctype.c.gcov.html
new file mode 100644
index 0000000..cd94217
--- /dev/null
+++ b/coverage-report/libc/test/run-ctype.c.gcov.html
@@ -0,0 +1,180 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-ctype.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-ctype.c<span style="font-size: 80%;"> (source / <a href="run-ctype.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #define BUFSZ 50</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;assert.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;ctype.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : int skiboot_isdigit(int ch);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : int skiboot_isprint(int ch);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : int skiboot_isspace(int ch);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : int skiboot_isxdigit(int ch);</a>
+<a name="19"><span class="lineNum"> 19 </span> : : int skiboot_tolower(int ch);</a>
+<a name="20"><span class="lineNum"> 20 </span> : : int skiboot_toupper(int ch);</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 5 : int main(void)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> : : int i;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : int r1, r2;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 55 : for(i = '0'; i &lt;= '9'; i++)</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 50 : assert(skiboot_isdigit(i));</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 5 : assert(skiboot_isdigit('a') == 0);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 5 : assert(skiboot_isdigit('Z') == 0);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1290 : for (i = 0; i &lt; 257; i++) {</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 1285 : r1 = skiboot_isdigit(i);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1285 : r2 = isdigit(i);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1285 : if (r1)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 50 : assert(r2);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1285 : if (!r1)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1235 : assert(!r2);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : }</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 55 : for(i = '0'; i &lt;= '9'; i++)</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 50 : assert(skiboot_isprint(i));</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 5 : assert(skiboot_isprint('\0') == 0);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 5 : assert(skiboot_isprint(4) == 0);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1290 : for (i = 0; i &lt; 257; i++) {</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1285 : r1 = skiboot_isprint(i);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1285 : r2 = isprint(i);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1285 : if (r1)</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 475 : assert(r2);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1285 : if (!r1)</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 810 : assert(!r2);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 55 : for(i = '0'; i &lt;= '9'; i++)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 50 : assert(skiboot_isspace(i) == 0);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 5 : assert(skiboot_isspace('\f'));</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 5 : assert(skiboot_isspace('\n'));</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 5 : assert(skiboot_isspace(' '));</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1290 : for (i = 0; i &lt; 257; i++) {</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1285 : r1 = skiboot_isspace(i);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1285 : r2 = isspace(i);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1285 : if (r1)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 30 : assert(r2);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1285 : if (!r1)</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1255 : assert(!r2);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 55 : for(i = '0'; i &lt;= '9'; i++)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 50 : assert(skiboot_isxdigit(i));</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 5 : assert(skiboot_isxdigit('a'));</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 5 : assert(skiboot_isxdigit('A'));</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 5 : assert(skiboot_isxdigit('F'));</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 5 : assert(skiboot_isxdigit('Z') == 0);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1290 : for (i = 0; i &lt; 257; i++) {</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1285 : r1 = skiboot_isxdigit(i);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1285 : r2 = isxdigit(i);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1285 : if (r1)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 110 : assert(r2);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1285 : if (!r1)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1175 : assert(!r2);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1290 : for (i = 0; i &lt; 257; i++) {</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1285 : assert(skiboot_tolower(i) == tolower(i));</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1290 : for (i = 0; i &lt; 257; i++) {</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1285 : assert(skiboot_toupper(i) == toupper(i));</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 5 : return 0;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-memops-test.c.func-sort-c.html b/coverage-report/libc/test/run-memops-test.c.func-sort-c.html
new file mode 100644
index 0000000..079edac
--- /dev/null
+++ b/coverage-report/libc/test/run-memops-test.c.func-sort-c.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-memops-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-memops-test.c<span style="font-size: 80%;"> (<a href="run-memops-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntryHi">92.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-memops-test.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#55">test_memchr</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#60">test_memcmp</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#65">test_strcmp</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#90">test_memmove</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#42">test_memset</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#80">test_strcasecmp</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#70">test_strchr</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#75">test_strrchr</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#85">test_strncasecmp</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-memops-test.c.func.html b/coverage-report/libc/test/run-memops-test.c.func.html
new file mode 100644
index 0000000..7378cd8
--- /dev/null
+++ b/coverage-report/libc/test/run-memops-test.c.func.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-memops-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-memops-test.c<span style="font-size: 80%;"> (<a href="run-memops-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntryHi">92.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-memops-test.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#55">test_memchr</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#60">test_memcmp</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#90">test_memmove</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#42">test_memset</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#80">test_strcasecmp</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#70">test_strchr</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#65">test_strcmp</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#85">test_strncasecmp</a></td>
+ <td class="coverFnHi">40</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops-test.c.gcov.html#75">test_strrchr</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-memops-test.c.gcov.html b/coverage-report/libc/test/run-memops-test.c.gcov.html
new file mode 100644
index 0000000..34676ab
--- /dev/null
+++ b/coverage-report/libc/test/run-memops-test.c.gcov.html
@@ -0,0 +1,182 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-memops-test.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-memops-test.c<span style="font-size: 80%;"> (source / <a href="run-memops-test.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">23</td>
+ <td class="headerCovTableEntry">25</td>
+ <td class="headerCovTableEntryHi">92.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * This file is run with the skiboot libc files rather than system libc.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * This means we have a bit of &quot;fun&quot; with actually executing the tests on</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * the host.</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * Patches to make this less ugly are very welcome.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;config.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;../string/memchr.c&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;../string/memcmp.c&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;../string/memcpy.c&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;../string/memmove.c&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;../string/memset.c&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &quot;../string/strcasecmp.c&quot;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &quot;../string/strcat.c&quot;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &quot;../string/strchr.c&quot;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;../string/strrchr.c&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;../string/strcmp.c&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &quot;../string/strcpy.c&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : /* #include &quot;../string/strdup.c&quot; */</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &quot;../string/strlen.c&quot;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &quot;../string/strncasecmp.c&quot;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &quot;../string/strncmp.c&quot;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &quot;../string/strncpy.c&quot;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #include &quot;../string/strstr.c&quot;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #include &quot;../string/strtok.c&quot;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : int test_memset(char* buf, int c, size_t s);</a>
+<a name="35"><span class="lineNum"> 35 </span> : : int test_memchr(const void *ptr, int c, size_t n, void* expected);</a>
+<a name="36"><span class="lineNum"> 36 </span> : : int test_memcmp(const void *ptr1, const void *ptr2, size_t n, int expected);</a>
+<a name="37"><span class="lineNum"> 37 </span> : : int test_strcmp(const void *ptr1, const void *ptr2, int expected);</a>
+<a name="38"><span class="lineNum"> 38 </span> : : int test_strchr(const char *s, int c, char *expected);</a>
+<a name="39"><span class="lineNum"> 39 </span> : : int test_strrchr(const char *s, int c, char *expected);</a>
+<a name="40"><span class="lineNum"> 40 </span> : : int test_strcasecmp(const char *s1, const char *s2, int expected);</a>
+<a name="41"><span class="lineNum"> 41 </span> : : int test_strncasecmp(const char *s1, const char *s2, size_t n, int expected);</a>
+<a name="42"><span class="lineNum"> 42 </span> : : int test_memmove(void *dest, const void *src, size_t n, const void *r, const void *expected, size_t expected_n);</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 20 : int test_memset(char* buf, int c, size_t s)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> : : int i;</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 20 : int r= 0;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 20 : memset(buf, c, s);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 6915 : for(i=0; i&lt;s; i++)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 6895 : if (buf[i] != c)</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : r = -1;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 20 : return r;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 10 : int test_memchr(const void *ptr, int c, size_t n, void* expected)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 10 : return(expected == memchr(ptr, c, n));</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : }</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 10 : int test_memcmp(const void *ptr1, const void *ptr2, size_t n, int expected)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : {</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 10 : return(expected == memcmp(ptr1, ptr2, n));</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 10 : int test_strcmp(const void *ptr1, const void *ptr2, int expected)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : {</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 10 : return(expected == strcmp(ptr1, ptr2));</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 20 : int test_strchr(const char *s, int c, char *expected)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : {</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 20 : return(expected == strchr(s, c));</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : }</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 25 : int test_strrchr(const char *s, int c, char *expected)</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : {</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 25 : return(expected == strrchr(s, c));</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 20 : int test_strcasecmp(const char *s1, const char *s2, int expected)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 20 : return(expected == strcasecmp(s1, s2));</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : }</a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 40 : int test_strncasecmp(const char *s1, const char *s2, size_t n, int expected)</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : {</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 40 : return(expected == strncasecmp(s1, s2, n));</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 15 : int test_memmove(void *dest, const void *src, size_t n, const void *r, const void *expected, size_t expected_n)</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : {</a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 15 : if (memmove(dest, src, n) != dest)</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 15 : return(memcmp(r, expected, expected_n) == 0);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-memops.c.func-sort-c.html b/coverage-report/libc/test/run-memops.c.func-sort-c.html
new file mode 100644
index 0000000..84e5a64
--- /dev/null
+++ b/coverage-report/libc/test/run-memops.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-memops.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-memops.c<span style="font-size: 80%;"> (<a href="run-memops.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-memops.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops.c.gcov.html#21">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-memops.c.func.html b/coverage-report/libc/test/run-memops.c.func.html
new file mode 100644
index 0000000..69bc4f3
--- /dev/null
+++ b/coverage-report/libc/test/run-memops.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-memops.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-memops.c<span style="font-size: 80%;"> (<a href="run-memops.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-memops.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-memops.c.gcov.html#21">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-memops.c.gcov.html b/coverage-report/libc/test/run-memops.c.gcov.html
new file mode 100644
index 0000000..2a0c6a1
--- /dev/null
+++ b/coverage-report/libc/test/run-memops.c.gcov.html
@@ -0,0 +1,183 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-memops.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-memops.c<span style="font-size: 80%;"> (source / <a href="run-memops.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntry">53</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #define BUFSZ 50</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : int test_memset(char* buf, int c, size_t s);</a>
+<a name="14"><span class="lineNum"> 14 </span> : : int test_memchr(const void *ptr, int c, size_t n, void* expected);</a>
+<a name="15"><span class="lineNum"> 15 </span> : : int test_memcmp(const void *ptr1, const void *ptr2, size_t n, int expected);</a>
+<a name="16"><span class="lineNum"> 16 </span> : : int test_strcmp(const void *ptr1, const void *ptr2, int expected);</a>
+<a name="17"><span class="lineNum"> 17 </span> : : int test_strchr(const char *s, int c, char *expected);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : int test_strrchr(const char *s, int c, char *expected);</a>
+<a name="19"><span class="lineNum"> 19 </span> : : int test_strcasecmp(const char *s1, const char *s2, int expected);</a>
+<a name="20"><span class="lineNum"> 20 </span> : : int test_strncasecmp(const char *s1, const char *s2, size_t n, int expected);</a>
+<a name="21"><span class="lineNum"> 21 </span> : : int test_memmove(void *dest, const void *src, size_t n, const void *r, const void *expected, size_t expected_n);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 5 : int main(void)</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : {</a>
+<a name="25"><span class="lineNum"> 25 </span> : : char *buf;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : char *buf2;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 5 : buf = malloc(100);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 5 : assert(test_memset(buf, 0x42, 100) == 0);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 5 : buf = malloc(128);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 5 : assert(test_memset(buf, 0, 128) == 0);</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 5 : assert(test_memset(buf+1, 0, 127) == 0);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 5 : buf = malloc(1024);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 5 : assert(test_memset(buf, 0, 1024) == 0);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 5 : buf = malloc(20);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 5 : strncpy(buf, &quot;Hello World!&quot;, 20);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 5 : assert(test_memchr(buf, 'o', strlen(buf), buf+4));</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 5 : assert(test_memchr(buf, 'a', strlen(buf), NULL));</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 5 : assert(test_memcmp(buf, &quot;Hello World!&quot;, strlen(buf), 0));</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 5 : assert(test_memcmp(buf, &quot;Hfllow World&quot;, strlen(buf), -1));</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 5 : assert(test_strcmp(buf, &quot;Hello World!&quot;, 0));</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 5 : assert(test_strcmp(buf, &quot;Hfllow World&quot;, -1));</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 5 : assert(test_strchr(buf, 'H', buf));</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 5 : assert(test_strchr(buf, 'e', buf+1));</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 5 : assert(test_strchr(buf, 'a', NULL));</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 5 : assert(test_strchr(buf, '!', buf+11));</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 5 : assert(test_strrchr(buf, 'H', buf));</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 5 : assert(test_strrchr(buf, 'o', buf+7));</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 5 : assert(test_strrchr(buf, 'a', NULL));</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 5 : assert(test_strrchr(buf, 'l', buf+9));</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 5 : assert(test_strrchr(buf, '!', buf+11));</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 5 : assert(test_strcasecmp(buf, &quot;Hello World!&quot;, 0));</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 5 : assert(test_strcasecmp(buf, &quot;HELLO WORLD!&quot;, 0));</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 5 : assert(test_strcasecmp(buf, &quot;IELLO world!&quot;, -1));</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 5 : assert(test_strcasecmp(buf, &quot;HeLLo WOrlc!&quot;, 1));</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;Hello World!&quot;, strlen(buf), 0));</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;HELLO WORLD!&quot;, strlen(buf), 0));</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;IELLO world!&quot;, strlen(buf), -1));</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;HeLLo WOrlc!&quot;, strlen(buf), 1));</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;HeLLo WOrlc!&quot;, 0, 0));</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;HeLLo WOrlc!&quot;, 1, 0));</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;HeLLo WOrlc!&quot;, 2, 0));</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 5 : assert(test_strncasecmp(buf, &quot;HeLLp WOrlc!&quot;, 5, -1));</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 5 : buf = malloc(20);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 5 : buf2 = malloc(20);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 5 : strncpy(buf, &quot;Hello&quot;, 20);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 5 : strncpy(buf2, &quot; World!&quot;, 20);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 5 : assert(test_memmove(buf + 5, buf2, strlen(buf2), buf,</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : &quot;Hello World!&quot;, strlen(&quot;Hello World!&quot;)));</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 5 : strncpy(buf, &quot;HHello World!&quot;, 20);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 5 : assert(test_memmove(buf, buf+1, strlen(&quot;Hello World!&quot;), buf, &quot;Hello World!&quot;, strlen(&quot;Hello World!&quot;)));</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 5 : strncpy(buf, &quot;0123456789&quot;, 20);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 5 : assert(test_memmove(buf+1, buf , strlen(&quot;0123456789&quot;), buf, &quot;00123456789&quot;, strlen(&quot;00123456789&quot;)));</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 5 : free(buf2);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 5 : return 0;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-snprintf-test.c.func-sort-c.html b/coverage-report/libc/test/run-snprintf-test.c.func-sort-c.html
new file mode 100644
index 0000000..51647fa
--- /dev/null
+++ b/coverage-report/libc/test/run-snprintf-test.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-snprintf-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-snprintf-test.c<span style="font-size: 80%;"> (<a href="run-snprintf-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">90.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-snprintf-test.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf-test.c.gcov.html#17">test1</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf-test.c.gcov.html#24">skiboot_snprintf</a></td>
+ <td class="coverFnHi">1630</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-snprintf-test.c.func.html b/coverage-report/libc/test/run-snprintf-test.c.func.html
new file mode 100644
index 0000000..2f0c039
--- /dev/null
+++ b/coverage-report/libc/test/run-snprintf-test.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-snprintf-test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-snprintf-test.c<span style="font-size: 80%;"> (<a href="run-snprintf-test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">90.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-snprintf-test.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf-test.c.gcov.html#24">skiboot_snprintf</a></td>
+ <td class="coverFnHi">1630</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf-test.c.gcov.html#17">test1</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-snprintf-test.c.gcov.html b/coverage-report/libc/test/run-snprintf-test.c.gcov.html
new file mode 100644
index 0000000..1cc43ea
--- /dev/null
+++ b/coverage-report/libc/test/run-snprintf-test.c.gcov.html
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-snprintf-test.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-snprintf-test.c<span style="font-size: 80%;"> (source / <a href="run-snprintf-test.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">90.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * This file is run with the skiboot libc files rather than system libc.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * This means we have a bit of &quot;fun&quot; with actually executing the tests on</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * the host.</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * Patches to make this less ugly are very welcome.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : */</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;config.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;../stdio/snprintf.c&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;../stdio/vsnprintf.c&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : int test1(void);</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 5 : int test1(void)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 5 : return snprintf(NULL, 1, &quot;Hello&quot;);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : }</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : int skiboot_snprintf(char *buf, size_t bufsz, size_t l, const char* format, ...);</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1630 : int skiboot_snprintf(char *buf, size_t bufsz, size_t l, const char* format, ...)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> : : va_list ar;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : int count;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1630 : if (buf)</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1630 : memset(buf, 0, bufsz);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1630 : if ((buf==NULL) || (format==NULL))</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return(-1);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1630 : va_start(ar, format);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1630 : count = vsnprintf(buf, l, format, ar);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1630 : va_end(ar);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1630 : return(count);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-snprintf.c.func-sort-c.html b/coverage-report/libc/test/run-snprintf.c.func-sort-c.html
new file mode 100644
index 0000000..892dad2
--- /dev/null
+++ b/coverage-report/libc/test/run-snprintf.c.func-sort-c.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-snprintf.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-snprintf.c<span style="font-size: 80%;"> (<a href="run-snprintf.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">146</td>
+ <td class="headerCovTableEntry">149</td>
+ <td class="headerCovTableEntryHi">98.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-snprintf.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#172">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#14">test_printf_0u</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#115">test_printf_c</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#142">test_printf_o</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#132">test_printf_p</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#37">test_printf_u</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#65">test_printf_d</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#93">test_printf_x</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#162">test_printf_z</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#152">test_printf_h</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-snprintf.c.func.html b/coverage-report/libc/test/run-snprintf.c.func.html
new file mode 100644
index 0000000..09fd127
--- /dev/null
+++ b/coverage-report/libc/test/run-snprintf.c.func.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-snprintf.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-snprintf.c<span style="font-size: 80%;"> (<a href="run-snprintf.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">146</td>
+ <td class="headerCovTableEntry">149</td>
+ <td class="headerCovTableEntryHi">98.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-snprintf.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#172">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#14">test_printf_0u</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#115">test_printf_c</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#65">test_printf_d</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#152">test_printf_h</a></td>
+ <td class="coverFnHi">35</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#142">test_printf_o</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#132">test_printf_p</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#37">test_printf_u</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#93">test_printf_x</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-snprintf.c.gcov.html#162">test_printf_z</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-snprintf.c.gcov.html b/coverage-report/libc/test/run-snprintf.c.gcov.html
new file mode 100644
index 0000000..4b74c3e
--- /dev/null
+++ b/coverage-report/libc/test/run-snprintf.c.gcov.html
@@ -0,0 +1,331 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-snprintf.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-snprintf.c<span style="font-size: 80%;"> (source / <a href="run-snprintf.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">146</td>
+ <td class="headerCovTableEntry">149</td>
+ <td class="headerCovTableEntryHi">98.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #define BUFSZ 50</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : int test1(void);</a>
+<a name="14"><span class="lineNum"> 14 </span> : : int skiboot_snprintf(char *buf, size_t bufsz, size_t l, const char* format, ...);</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 5 : static void test_printf_0u(int n)</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : {</a>
+<a name="18"><span class="lineNum"> 18 </span> : : char *buf, *buf2;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : int blen;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : unsigned int i;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 50 : for(i=1; i&lt;10; i++)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 45 : blen = i+1;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 45 : if (n&lt;0)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : blen++;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 45 : buf = (char*)malloc(blen);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 45 : buf2 = (char*)malloc(blen);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 45 : skiboot_snprintf(buf, blen, blen, &quot;%08u&quot;, n);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 45 : snprintf(buf2, blen, &quot;%08u&quot;, n);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 45 : n = n * 10;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 45 : assert(0 == strncmp(buf, buf2, blen));</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 45 : free(buf);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 45 : free(buf2);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 5 : }</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 5 : static void test_printf_u(int n)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> : : char *buf, *buf2;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : int blen;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : unsigned int r;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : unsigned int i;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 50 : for(i=1; i&lt;10; i++)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : {</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 45 : blen = i+1;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 45 : if (n&lt;0)</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : blen++;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 45 : buf = (char*)malloc(blen);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 45 : buf2 = (char*)malloc(blen);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 45 : r = skiboot_snprintf(buf, blen, blen, &quot;%u&quot;, n);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 45 : snprintf(buf2, blen, &quot;%u&quot;, n);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 45 : n = n * 10;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 45 : if (n&lt;0)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : assert(i+1 == r);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : else</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 45 : assert(i == r);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 45 : assert(0 == strncmp(buf, buf2, blen));</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 45 : free(buf);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 45 : free(buf2);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 5 : }</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 10 : static void test_printf_d(int n)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : {</a>
+<a name="69"><span class="lineNum"> 69 </span> : : char *buf, *buf2;</a>
+<a name="70"><span class="lineNum"> 70 </span> : : int blen;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : int r;</a>
+<a name="72"><span class="lineNum"> 72 </span> : : int i;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 100 : for(i=1; i&lt;10; i++)</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : {</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 90 : blen = i+1;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 90 : if (n&lt;0)</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 45 : blen++;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 90 : buf = (char*)malloc(blen);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 90 : buf2 = (char*)malloc(blen);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 90 : r = skiboot_snprintf(buf, blen, blen, &quot;%d&quot;, n);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 90 : snprintf(buf2, blen, &quot;%d&quot;, n);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 90 : n = n * 10;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 90 : if (n&lt;0)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 45 : assert(i+1 == r);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : else</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 45 : assert(i == r);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 90 : assert(0 == strncmp(buf, buf2, blen));</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 90 : free(buf);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 90 : free(buf2);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 10 : static void test_printf_x(const char* f)</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : char *buf, *buf2;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : int blen;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : int i, r;</a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 10 : unsigned int n=0x1;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 90 : for (i=0; i&lt;8; i++)</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : {</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 80 : blen = i+2;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 80 : buf = (char*)malloc(blen);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 80 : buf2 = (char*)malloc(blen);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 80 : r = skiboot_snprintf(buf, blen, blen, f, n);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 80 : snprintf(buf2, blen, f, n);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 80 : assert(i+1 == r);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 80 : assert(0 == strncmp(buf, buf2, blen));</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 80 : free(buf);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 80 : free(buf2);</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 80 : n = n &lt;&lt; 4;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : }</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 10 : }</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 5 : static void test_printf_c(void)</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : {</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 5 : char *buf= (char*)malloc(2);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : char buf2[2];</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 5 : unsigned char i= 0xff;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : int r;</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1280 : while(i)</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : {</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1275 : r = skiboot_snprintf(buf, 2, 2, &quot;%c&quot;, i);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1275 : snprintf(buf2, 2, &quot;%c&quot;, i);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1275 : assert(r==1);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1275 : assert(0 == strncmp(buf, buf2, 2));</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1275 : i--;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : }</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 5 : }</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 5 : static void test_printf_p(void)</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : {</a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 5 : char *buf= (char*)malloc(32);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : char buf2[32];</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 5 : skiboot_snprintf(buf, 32, 32, &quot;%p&quot;, buf);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 5 : snprintf(buf2, 32, &quot;%p&quot;, buf);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 5 : assert(0 == strncmp(buf, buf2, 32));</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 5 : }</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 5 : static void test_printf_o(void)</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : {</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 5 : char *buf= (char*)malloc(32);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : char buf2[32];</a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 5 : skiboot_snprintf(buf, 32, 32, &quot;%o&quot;, 0x12345678);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 5 : snprintf(buf2, 32, &quot;%o&quot;, 0x12345678);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 5 : assert(0 == strncmp(buf, buf2, 32));</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 5 : }</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 35 : static void test_printf_h(short i)</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : {</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 35 : char *buf= (char*)malloc(32);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : char buf2[32];</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 35 : skiboot_snprintf(buf, 32, 32, &quot;%hd&quot;, i);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 35 : snprintf(buf2, 32, &quot;%hd&quot;, i);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 35 : assert(0 == strncmp(buf, buf2, 32));</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 35 : free(buf);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 35 : }</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 20 : static void test_printf_z(size_t i)</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : {</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 20 : char *buf= (char*)malloc(32);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : char buf2[32];</a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 20 : skiboot_snprintf(buf, 32, 32, &quot;%zu&quot;, i);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 20 : snprintf(buf2, 32, &quot;%zu&quot;, i);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 20 : assert(0 == strncmp(buf, buf2, 32));</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 20 : free(buf);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 20 : }</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 5 : int main(void)</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : {</a>
+<a name="176"><span class="lineNum"> 176 </span> : : char *buf;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : int r;</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 5 : buf = (char*)malloc(BUFSZ);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 5 : memset(buf, 0, BUFSZ);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 5 : assert(-1 == test1());</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 5 : r = skiboot_snprintf(buf, BUFSZ, 2, &quot;%%&quot;);</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 5 : assert(r==1);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 5 : assert(buf[0] == '%' &amp;&amp; buf[1] == 0);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 5 : r = skiboot_snprintf(buf, BUFSZ, 2, &quot;%d&quot;, 137);</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : /* BUG/FIXME:</a>
+<a name="190"><span class="lineNum"> 190 </span> : : * skiboot libc does NOT return the length of the buffer you'd need</a>
+<a name="191"><span class="lineNum"> 191 </span> : : * Instead, it'll return something random, possibly zero (as here)</a>
+<a name="192"><span class="lineNum"> 192 </span> : : * but as you'll see in test_in_buf_len2, sometimes not.</a>
+<a name="193"><span class="lineNum"> 193 </span> : : *</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * Basically, we're not POSIX printf and this is some day going to</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * cause things to be awful.</a>
+<a name="196"><span class="lineNum"> 196 </span> : : */</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 5 : assert(0 == r); // BUG, should be 3</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 5 : assert(0 == strncmp(buf, &quot;&quot;, 3));</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 5 : r = skiboot_snprintf(buf, BUFSZ, 4, &quot;%d&quot;, 137);</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 5 : assert(3 == r);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 5 : assert(0 == strncmp(buf, &quot;137&quot;, 3));</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 5 : assert(buf[3] == 0);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> : : /* Now we test the strange behaviour of our printf.</a>
+<a name="206"><span class="lineNum"> 206 </span> : : * For strings, we get partial prints going, but if we whack an</a>
+<a name="207"><span class="lineNum"> 207 </span> : : * integer on the end, we may or may not get that integer, depending</a>
+<a name="208"><span class="lineNum"> 208 </span> : : * on if we have enough size. We should test that though */</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 5 : r = skiboot_snprintf(buf, BUFSZ, 4, &quot;Hello %d&quot;, 137);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 5 : assert(3 == r);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 5 : assert(0 == strncmp(buf, &quot;Hel&quot;, 3));</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 5 : assert(buf[3] == 0);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 5 : r = skiboot_snprintf(buf, BUFSZ, 7, &quot;Hello %d&quot;, 137);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 5 : assert(6 == r);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 5 : assert(0 == strncmp(buf, &quot;Hello &quot;, 6));</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 5 : assert(buf[6] == 0);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 5 : r = skiboot_snprintf(buf, BUFSZ, 10, &quot;Hello %d&quot;, 137);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 5 : assert(9 == r);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 5 : assert(0 == strncmp(buf, &quot;Hello 137&quot;, 10));</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 5 : assert(buf[9] == 0);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 5 : free(buf);</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 5 : test_printf_u(1);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 5 : test_printf_0u(1);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 5 : test_printf_d(1);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 5 : test_printf_d(-1);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 5 : test_printf_x(&quot;%x&quot;);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 5 : test_printf_x(&quot;%X&quot;);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 5 : test_printf_c();</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 5 : test_printf_p();</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 5 : test_printf_o();</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 5 : test_printf_h(0);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 5 : test_printf_h(128);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 5 : test_printf_h(256);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 5 : test_printf_h(-1);</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 5 : test_printf_h(32767);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 5 : test_printf_h(32768);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 5 : test_printf_h(65535);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 5 : test_printf_z(0);</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 5 : test_printf_z(-1);</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 5 : test_printf_z(12345);</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 5 : test_printf_z(128000000);</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 5 : return 0;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-stdlib.c.func-sort-c.html b/coverage-report/libc/test/run-stdlib.c.func-sort-c.html
new file mode 100644
index 0000000..e5788af
--- /dev/null
+++ b/coverage-report/libc/test/run-stdlib.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-stdlib.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-stdlib.c<span style="font-size: 80%;"> (<a href="run-stdlib.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-stdlib.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-stdlib.c.gcov.html#11">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-stdlib.c.func.html b/coverage-report/libc/test/run-stdlib.c.func.html
new file mode 100644
index 0000000..8af5eba
--- /dev/null
+++ b/coverage-report/libc/test/run-stdlib.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-stdlib.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-stdlib.c<span style="font-size: 80%;"> (<a href="run-stdlib.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-stdlib.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-stdlib.c.gcov.html#11">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-stdlib.c.gcov.html b/coverage-report/libc/test/run-stdlib.c.gcov.html
new file mode 100644
index 0000000..f6b2ccd
--- /dev/null
+++ b/coverage-report/libc/test/run-stdlib.c.gcov.html
@@ -0,0 +1,170 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-stdlib.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-stdlib.c<span style="font-size: 80%;"> (source / <a href="run-stdlib.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2013-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #define BUFSZ 50</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;assert.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 5 : int main(void)</span></a>
+<a name="14"><span class="lineNum"> 14 </span> : : {</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 5 : char buf[] = &quot;42, and stuff.&quot;;</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : char *ptr;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : /* atoi/strtol - general correct behavior */</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 5 : assert(atoi(&quot;0&quot;) == 0);</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 5 : assert(atoi(&quot;1&quot;) == 1);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 5 : assert(atoi(&quot; 123456&quot;) == 123456);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 5 : assert(atoi(&quot;-72&quot;) == -72);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 5 : assert(atoi(&quot; -84&quot;) == -84);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 5 : assert(atoi(&quot;2147483647&quot;) == 2147483647);</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : /* atoi/strtol - numbers before and after strings */</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 5 : assert(atoi(&quot;hello!123&quot;) == 0);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 5 : assert(atoi(buf) == 42);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 5 : assert(atoi(&quot;42isthemagicnumber&quot;) == 42);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* atoi is base 10 only */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 5 : assert(atoi(&quot;0x800&quot;) == 0);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* atol - ensure it recognises longs */</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 5 : assert(atol(&quot;2147483648&quot;) == 2147483648);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 5 : assert(atol(&quot;-2147483649&quot;) == -2147483649);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> : : /* strtol detects hex */</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 5 : assert(strtol(&quot;0x800&quot;, NULL, 0) == 0x800);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : /* But not with a duplicate prefix */</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 5 : assert(strtol(&quot;0x0x800&quot;, NULL, 0) == 0);</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : /* strtol - invalid/weird bases */</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 5 : assert(strtol(&quot;z&quot;, NULL, -1) == 0);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 5 : assert(strtol(&quot;11111&quot;, NULL, 1) == 0);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 5 : assert(strtol(&quot;z&quot;, NULL, 37) == 0);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 5 : assert(strtol(&quot;z&quot;, NULL, 36) == 35);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 5 : assert(strtol(&quot;-Y&quot;, NULL, 36) == -34);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : /* strtol - ptr advanced correctly */</a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 5 : ptr = buf;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 5 : assert(strtol(buf, &amp;ptr, 10) == 42);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 5 : assert(ptr == buf + 2);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : /* strtoul - base 10 */</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;0&quot;, NULL, 10) == 0);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;1&quot;, NULL, 10) == 1);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot; 123456&quot;, NULL, 10) == 123456);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;-72&quot;, NULL, 10) == 0);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;9999999999&quot;, NULL, 10) == 9999999999);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;hello!123&quot;, NULL, 10) == 0);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 5 : assert(strtoul(buf, NULL, 10) == 42);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;42isthemagicnumber&quot;, NULL, 10) == 42);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : /* strtoul - autodetection of base */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot; 123456&quot;, NULL, 0) == 123456);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;0x800&quot;, NULL, 0) == 0x800);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;0x0x800&quot;, NULL, 0) == 0);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* strtoul - weird/invalid bases */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;z&quot;, NULL, -1) == 0);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;11111&quot;, NULL, 1) == 0);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;z&quot;, NULL, 37) == 0);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;z&quot;, NULL, 36) == 35);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 5 : assert(strtoul(&quot;Y&quot;, NULL, 36) == 34);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : /* labs - ensure it returns absolute value */</a>
+<a name="78"><span class="lineNum"> 78 </span> : : assert(labs(0) == 0);</a>
+<a name="79"><span class="lineNum"> 79 </span> : : assert(labs(2147483647) == 2147483647);</a>
+<a name="80"><span class="lineNum"> 80 </span> : : assert(labs(-2147483647) == 2147483647);</a>
+<a name="81"><span class="lineNum"> 81 </span> : : assert(labs(9223372036854775807) == 9223372036854775807);</a>
+<a name="82"><span class="lineNum"> 82 </span> : : assert(labs(-9223372036854775807) == 9223372036854775807);</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 5 : return 0;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-time.c.func-sort-c.html b/coverage-report/libc/test/run-time.c.func-sort-c.html
new file mode 100644
index 0000000..6985ca7
--- /dev/null
+++ b/coverage-report/libc/test/run-time.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-time.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-time.c<span style="font-size: 80%;"> (<a href="run-time.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-time.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-time.c.gcov.html#39">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-time.c.func.html b/coverage-report/libc/test/run-time.c.func.html
new file mode 100644
index 0000000..6286047
--- /dev/null
+++ b/coverage-report/libc/test/run-time.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-time.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-time.c<span style="font-size: 80%;"> (<a href="run-time.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-time.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-time.c.gcov.html#39">main</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/test/run-time.c.gcov.html b/coverage-report/libc/test/run-time.c.gcov.html
new file mode 100644
index 0000000..a88fc36
--- /dev/null
+++ b/coverage-report/libc/test/run-time.c.gcov.html
@@ -0,0 +1,171 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/test/run-time.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libc/test</a> - run-time.c<span style="font-size: 80%;"> (source / <a href="run-time.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntry">39</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright 2014-2015 IBM Corp.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : */</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;/usr/include/assert.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;libc/include/time.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;../time.c&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #define MKTIME_TEST(Y,M,D,h,m,s,t) \</a>
+<a name="13"><span class="lineNum"> 13 </span> : : tm.tm_year = Y; \</a>
+<a name="14"><span class="lineNum"> 14 </span> : : tm.tm_mon = M; \</a>
+<a name="15"><span class="lineNum"> 15 </span> : : tm.tm_mday = D; \</a>
+<a name="16"><span class="lineNum"> 16 </span> : : tm.tm_hour = h; \</a>
+<a name="17"><span class="lineNum"> 17 </span> : : tm.tm_min = m; \</a>
+<a name="18"><span class="lineNum"> 18 </span> : : tm.tm_sec = s; \</a>
+<a name="19"><span class="lineNum"> 19 </span> : : assert(mktime(&amp;tm) == t); \</a>
+<a name="20"><span class="lineNum"> 20 </span> : : assert(tm.tm_year == Y); \</a>
+<a name="21"><span class="lineNum"> 21 </span> : : assert(tm.tm_mon == M); \</a>
+<a name="22"><span class="lineNum"> 22 </span> : : assert(tm.tm_mday == D); \</a>
+<a name="23"><span class="lineNum"> 23 </span> : : assert(tm.tm_hour == h); \</a>
+<a name="24"><span class="lineNum"> 24 </span> : : assert(tm.tm_min == m); \</a>
+<a name="25"><span class="lineNum"> 25 </span> : : assert(tm.tm_sec == s)</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define GMTIME_TEST(Y,M,D,h,m,s,tv) \</a>
+<a name="28"><span class="lineNum"> 28 </span> : : t = tv; \</a>
+<a name="29"><span class="lineNum"> 29 </span> : : gmtime_r(&amp;t, &amp;tm); \</a>
+<a name="30"><span class="lineNum"> 30 </span> : : assert(tm.tm_year == Y); \</a>
+<a name="31"><span class="lineNum"> 31 </span> : : assert(tm.tm_mon == M); \</a>
+<a name="32"><span class="lineNum"> 32 </span> : : assert(tm.tm_mday == D); \</a>
+<a name="33"><span class="lineNum"> 33 </span> : : assert(tm.tm_hour == h); \</a>
+<a name="34"><span class="lineNum"> 34 </span> : : assert(tm.tm_min == m); \</a>
+<a name="35"><span class="lineNum"> 35 </span> : : assert(tm.tm_sec == s)</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define TIME_TEST(Y,M,D,h,m,s,tv) \</a>
+<a name="38"><span class="lineNum"> 38 </span> : : MKTIME_TEST(Y,M,D,h,m,s,tv); \</a>
+<a name="39"><span class="lineNum"> 39 </span> : : GMTIME_TEST(Y,M,D,h,m,s,tv)</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 5 : int main(void)</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : {</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct tm tm;</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 5 : time_t t = 0;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 5 : TIME_TEST(1970, 0, 1, 0, 0, 0, 0);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 5 : TIME_TEST(1971, 0, 1, 0, 0, 0, 365*SECS_PER_DAY);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 5 : TIME_TEST(1972, 0, 1, 0, 0, 0, 2*365*SECS_PER_DAY);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 5 : TIME_TEST(1972, 11, 31, 0, 0, 0, 3*365*SECS_PER_DAY);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 5 : TIME_TEST(1973, 0, 1, 0, 0, 0, (3*365+1)*SECS_PER_DAY);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 5 : TIME_TEST(2000, 11, 31, 0, 0, 0, 978220800);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 5 : TIME_TEST(2001, 0, 1, 0, 0, 0, 978307200);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 5 : TIME_TEST(2003, 11, 31, 0, 0, 0, 1072828800);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 5 : TIME_TEST(2004, 0, 1, 0, 0, 0, 1072828800+SECS_PER_DAY);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 5 : TIME_TEST(2004, 11, 29, 0, 0, 0, 1072828800+364*SECS_PER_DAY);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 5 : TIME_TEST(2004, 11, 30, 0, 0, 0, 1072828800+365*SECS_PER_DAY);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 5 : TIME_TEST(2004, 11, 31, 0, 0, 0, 1072828800+366*SECS_PER_DAY);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 5 : TIME_TEST(2004, 11, 31, 23, 59, 59, 1072828800+367*SECS_PER_DAY-1);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 5 : TIME_TEST(2100, 11, 31, 0, 0, 0, 4133894400);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 5 : TIME_TEST(2101, 0, 1, 0, 0, 0, 4133980800);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> : : /* Test the normalisation functionality of mktime */</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 5 : tm.tm_year = 2000;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 5 : tm.tm_mon = 1;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 5 : tm.tm_mday = 10;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 5 : tm.tm_hour = 5;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 5 : tm.tm_min = 32;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 5 : tm.tm_sec = 105;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 5 : mktime(&amp;tm);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 5 : assert(tm.tm_year == 2000);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 5 : assert(tm.tm_mon == 1);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 5 : assert(tm.tm_mday == 10);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 5 : assert(tm.tm_hour == 5);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 5 : assert(tm.tm_min == 33);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 5 : assert(tm.tm_sec == 45);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 5 : tm.tm_sec += 366*24*60*60;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 5 : mktime(&amp;tm);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 5 : assert(tm.tm_year == 2001);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 5 : assert(tm.tm_mon == 1);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 5 : assert(tm.tm_mday == 10);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 5 : assert(tm.tm_hour == 5);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 5 : assert(tm.tm_min == 33);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 5 : assert(tm.tm_sec == 45);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 5 : return 0;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/time.c.func-sort-c.html b/coverage-report/libc/time.c.func-sort-c.html
new file mode 100644
index 0000000..1ab9b98
--- /dev/null
+++ b/coverage-report/libc/time.c.func-sort-c.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/time.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libc</a> - time.c<span style="font-size: 80%;"> (<a href="time.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="time.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#37">gmtime_r</a></td>
+ <td class="coverFnHi">75</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#86">mktime</a></td>
+ <td class="coverFnHi">85</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#15">days_in_month</a></td>
+ <td class="coverFnHi">145</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#5">leap_years</a></td>
+ <td class="coverFnHi">320</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#10">is_leap_year</a></td>
+ <td class="coverFnHi">765</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/time.c.func.html b/coverage-report/libc/time.c.func.html
new file mode 100644
index 0000000..9f3c485
--- /dev/null
+++ b/coverage-report/libc/time.c.func.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/time.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libc</a> - time.c<span style="font-size: 80%;"> (<a href="time.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="time.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#15">days_in_month</a></td>
+ <td class="coverFnHi">145</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#37">gmtime_r</a></td>
+ <td class="coverFnHi">75</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#10">is_leap_year</a></td>
+ <td class="coverFnHi">765</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#5">leap_years</a></td>
+ <td class="coverFnHi">320</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="time.c.gcov.html#86">mktime</a></td>
+ <td class="coverFnHi">85</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libc/time.c.gcov.html b/coverage-report/libc/time.c.gcov.html
new file mode 100644
index 0000000..e7cac93
--- /dev/null
+++ b/coverage-report/libc/time.c.gcov.html
@@ -0,0 +1,227 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libc/time.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libc</a> - time.c<span style="font-size: 80%;"> (source / <a href="time.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntry">66</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;time.h&gt;</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : /*</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Returns the number of leap years prior to the given year.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> :<span class="lineCov"> 320 : static int leap_years(int year)</span></a>
+<a name="8"><span class="lineNum"> 8 </span> : : {</a>
+<a name="9"><span class="lineNum"> 9 </span> :<span class="lineCov"> 320 : return (year-1)/4 + (year-1)/400 - (year-1)/100;</span></a>
+<a name="10"><span class="lineNum"> 10 </span> : : }</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 765 : static int is_leap_year(int year)</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : {</a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 765 : return ((year % 4 == 0) &amp;&amp; (year % 100 != 0)) || (year % 400 == 0);</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : }</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 145 : static int days_in_month(int month, int year)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> : : static char month_days[] = {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : };</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : /* we may need to update this in the year 4000, pending a</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * decision on whether or not it's a leap year */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 145 : if (month == 1)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 15 : return is_leap_year(year) ? 29 : 28;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 130 : return month_days[month];</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : }</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : static const int days_per_month[2][13] =</a>
+<a name="32"><span class="lineNum"> 32 </span> : : {{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},</a>
+<a name="33"><span class="lineNum"> 33 </span> : : {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}};</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : #define SECS_PER_MIN 60</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #define SECS_PER_HOUR (SECS_PER_MIN*60)</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define SECS_PER_DAY (24*SECS_PER_HOUR)</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define DAYS_PER_YEAR 365</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 75 : struct tm *gmtime_r(const time_t *timep, struct tm *result)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> : : int i;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : int Y;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : int M;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : int D;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : int h;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : int m;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : int s;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 75 : D = *timep / SECS_PER_DAY;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 75 : s = *timep % SECS_PER_DAY;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 75 : m = s / 60;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 75 : h = m / 60;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 75 : m %= 60;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 75 : s %= 60;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : /*</a>
+<a name="57"><span class="lineNum"> 57 </span> : : * Work out the year. We subtract one day for every four years</a>
+<a name="58"><span class="lineNum"> 58 </span> : : * and every 400 years after 1969. However as leap years don't</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * occur every 100 years we add one day back to counteract the</a>
+<a name="60"><span class="lineNum"> 60 </span> : : * the subtraction for every 4 years.</a>
+<a name="61"><span class="lineNum"> 61 </span> : : */</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 75 : Y = (D - (1+D/365)/4 + (69+D/365)/100 - (369+D/365)/400)/365;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : /*</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * Remember we're doing integer arithmetic here so</a>
+<a name="66"><span class="lineNum"> 66 </span> : : * leap_years(Y+1970) - leap_years(1970) != leap_years(Y)</a>
+<a name="67"><span class="lineNum"> 67 </span> : : */</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 75 : D = D - Y*365 - (leap_years(Y+1970) - leap_years(1970)) + 1;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 75 : Y += 1970;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 75 : M = 0;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 590 : for (i = 0; i &lt; 13; i++)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 590 : if (D &lt;= days_per_month[is_leap_year(Y) ? 1 : 0][i]) {</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 75 : M = i;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 75 : break;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 75 : D -= days_per_month[is_leap_year(Y)][M-1];</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 75 : result-&gt;tm_year = Y;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 75 : result-&gt;tm_mon = M - 1;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 75 : result-&gt;tm_mday = D;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 75 : result-&gt;tm_hour = h;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 75 : result-&gt;tm_min = m;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 75 : result-&gt;tm_sec = s;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 75 : return result;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 85 : time_t mktime(struct tm *tm)</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : {</a>
+<a name="90"><span class="lineNum"> 90 </span> : : unsigned long year, month, mday, hour, minute, second, d;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : static const unsigned long sec_in_400_years =</a>
+<a name="92"><span class="lineNum"> 92 </span> : : ((3903ul * 365) + (97 * 366)) * 24 * 60 * 60;</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 85 : second = tm-&gt;tm_sec;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 85 : minute = tm-&gt;tm_min;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 85 : hour = tm-&gt;tm_hour;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 85 : mday = tm-&gt;tm_mday;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 85 : month = tm-&gt;tm_mon;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 85 : year = tm-&gt;tm_year;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : /* There are the same number of seconds in any 400-year block; this</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * limits the iterations in the loop below */</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 85 : year += 400 * (second / sec_in_400_years);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 85 : second = second % sec_in_400_years;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 85 : if (second &gt;= 60) {</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 10 : minute += second / 60;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 10 : second = second % 60;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 85 : if (minute &gt;= 60) {</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 5 : hour += minute / 60;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 5 : minute = minute % 60;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : }</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 85 : if (hour &gt;= 24) {</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 5 : mday += hour / 24;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 5 : hour = hour % 24;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 145 : for (d = days_in_month(month, year); mday &gt; d;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 60 : d = days_in_month(month, year)) {</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 60 : month++;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 60 : if (month &gt; 11) {</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 5 : month = 0;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 5 : year++;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : }</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 60 : mday -= d;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : }</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 85 : tm-&gt;tm_year = year;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 85 : tm-&gt;tm_mon = month;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 85 : tm-&gt;tm_mday = mday;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 85 : tm-&gt;tm_hour = hour;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 85 : tm-&gt;tm_min = minute;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 85 : tm-&gt;tm_sec = second;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 85 : d = mday;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 85 : d += days_per_month[is_leap_year(year)][month];</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 85 : d += (year-1970)*DAYS_PER_YEAR + leap_years(year) - leap_years(1970) - 1;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 85 : return d*SECS_PER_DAY + hour*SECS_PER_HOUR + minute*SECS_PER_MIN + second;</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt.c.func-sort-c.html b/coverage-report/libfdt/fdt.c.func-sort-c.html
new file mode 100644
index 0000000..f622afa
--- /dev/null
+++ b/coverage-report/libfdt/fdt.c.func-sort-c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt.c<span style="font-size: 80%;"> (<a href="fdt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">64.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="fdt.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#231">fdt_check_prop_offset_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#280">fdt_first_subnode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#320">fdt_move</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#240">fdt_next_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#291">fdt_next_subnode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#111">fdt_check_header</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#97">fdt_header_size_</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#222">fdt_check_node_offset_</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#85">check_block_</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#61">fdt_ro_probe_</a></td>
+ <td class="coverFnHi">45</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#80">check_off_</a></td>
+ <td class="coverFnHi">55</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#308">fdt_find_string_</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#169">fdt_next_tag</a></td>
+ <td class="coverFnHi">3329</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#152">fdt_offset_ptr</a></td>
+ <td class="coverFnHi">14237</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt.c.func.html b/coverage-report/libfdt/fdt.c.func.html
new file mode 100644
index 0000000..b5fda50
--- /dev/null
+++ b/coverage-report/libfdt/fdt.c.func.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt.c<span style="font-size: 80%;"> (<a href="fdt.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">64.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="fdt.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#85">check_block_</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#80">check_off_</a></td>
+ <td class="coverFnHi">55</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#111">fdt_check_header</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#222">fdt_check_node_offset_</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#231">fdt_check_prop_offset_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#308">fdt_find_string_</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#280">fdt_first_subnode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#97">fdt_header_size_</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#320">fdt_move</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#240">fdt_next_node</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#291">fdt_next_subnode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#169">fdt_next_tag</a></td>
+ <td class="coverFnHi">3329</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#152">fdt_offset_ptr</a></td>
+ <td class="coverFnHi">14237</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt.c.gcov.html#61">fdt_ro_probe_</a></td>
+ <td class="coverFnHi">45</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt.c.gcov.html b/coverage-report/libfdt/fdt.c.gcov.html
new file mode 100644
index 0000000..f8390b5
--- /dev/null
+++ b/coverage-report/libfdt/fdt.c.gcov.html
@@ -0,0 +1,416 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt.c<span style="font-size: 80%;"> (source / <a href="fdt.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">77</td>
+ <td class="headerCovTableEntry">159</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryLo">64.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /*</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * libfdt - Flat Device Tree manipulation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright (C) 2006 David Gibson, IBM Corporation.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * libfdt is dual licensed: you can use it either under the terms of</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * the GPL, or the BSD license, at your option.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * a) This library is free software; you can redistribute it and/or</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * modify it under the terms of the GNU General Public License as</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * published by the Free Software Foundation; either version 2 of the</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * License, or (at your option) any later version.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * This library is distributed in the hope that it will be useful,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * GNU General Public License for more details.</a>
+<a name="17"><span class="lineNum"> 17 </span> : : *</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * You should have received a copy of the GNU General Public</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * License along with this library; if not, write to the Free</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * MA 02110-1301 USA</a>
+<a name="22"><span class="lineNum"> 22 </span> : : *</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * Alternatively,</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * b) Redistribution and use in source and binary forms, with or</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * without modification, are permitted provided that the following</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * conditions are met:</a>
+<a name="28"><span class="lineNum"> 28 </span> : : *</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * 1. Redistributions of source code must retain the above</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * disclaimer.</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * 2. Redistributions in binary form must reproduce the above</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * disclaimer in the documentation and/or other materials</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * provided with the distribution.</a>
+<a name="36"><span class="lineNum"> 36 </span> : : *</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</a>
+<a name="50"><span class="lineNum"> 50 </span> : : */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : #include &quot;libfdt_env.h&quot;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : #include &lt;fdt.h&gt;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #include &lt;libfdt.h&gt;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : #include &quot;libfdt_internal.h&quot;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : /*</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * Minimal sanity check for a read-only tree. fdt_ro_probe_() checks</a>
+<a name="60"><span class="lineNum"> 60 </span> : : * that the given buffer contains what appears to be a flattened</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * device tree with sane information in its header.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : */</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 45 : int fdt_ro_probe_(const void *fdt)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 45 : if (fdt_magic(fdt) == FDT_MAGIC) {</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : /* Complete tree */</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 45 : if (fdt_version(fdt) &lt; FDT_FIRST_SUPPORTED_VERSION)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADVERSION;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 45 : if (fdt_last_comp_version(fdt) &gt; FDT_LAST_SUPPORTED_VERSION)</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADVERSION;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : } else if (fdt_magic(fdt) == FDT_SW_MAGIC) {</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : /* Unfinished sequential-write blob */</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : if (fdt_size_dt_struct(fdt) == 0)</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTATE;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : } else {</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADMAGIC;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 45 : return 0;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 55 : static int check_off_(uint32_t hdrsize, uint32_t totalsize, uint32_t off)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 55 : return (off &gt;= hdrsize) &amp;&amp; (off &lt;= totalsize);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : }</a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 22 : static int check_block_(uint32_t hdrsize, uint32_t totalsize,</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : uint32_t base, uint32_t size)</a>
+<a name="89"><span class="lineNum"> 89 </span> : : {</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 22 : if (!check_off_(hdrsize, totalsize, base))</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : return 0; /* block start out of bounds */</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 22 : if ((base + size) &lt; base)</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : return 0; /* overflow */</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 22 : if (!check_off_(hdrsize, totalsize, base + size))</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : return 0; /* block end out of bounds */</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 22 : return 1;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 11 : size_t fdt_header_size_(uint32_t version)</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : {</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 11 : if (version &lt;= 1)</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : return FDT_V1_SIZE;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 11 : else if (version &lt;= 2)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : return FDT_V2_SIZE;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 11 : else if (version &lt;= 3)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : return FDT_V3_SIZE;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 11 : else if (version &lt;= 16)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : return FDT_V16_SIZE;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : else</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 11 : return FDT_V17_SIZE;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 11 : int fdt_check_header(const void *fdt)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> : : size_t hdrsize;</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 11 : if (fdt_magic(fdt) != FDT_MAGIC)</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADMAGIC;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 11 : hdrsize = fdt_header_size(fdt);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 11 : if ((fdt_version(fdt) &lt; FDT_FIRST_SUPPORTED_VERSION)</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 11 : || (fdt_last_comp_version(fdt) &gt; FDT_LAST_SUPPORTED_VERSION))</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADVERSION;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 11 : if (fdt_version(fdt) &lt; fdt_last_comp_version(fdt))</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADVERSION;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 11 : if ((fdt_totalsize(fdt) &lt; hdrsize)</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 11 : || (fdt_totalsize(fdt) &gt; INT_MAX))</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> : : /* Bounds check memrsv block */</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 11 : if (!check_off_(hdrsize, fdt_totalsize(fdt), fdt_off_mem_rsvmap(fdt)))</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : /* Bounds check structure block */</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 11 : if (fdt_version(fdt) &lt; 17) {</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : if (!check_off_(hdrsize, fdt_totalsize(fdt),</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : fdt_off_dt_struct(fdt)))</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : } else {</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 11 : if (!check_block_(hdrsize, fdt_totalsize(fdt),</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : fdt_off_dt_struct(fdt),</a>
+<a name="142"><span class="lineNum"> 142 </span> : : fdt_size_dt_struct(fdt)))</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> : : /* Bounds check strings block */</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 11 : if (!check_block_(hdrsize, fdt_totalsize(fdt),</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : fdt_off_dt_strings(fdt), fdt_size_dt_strings(fdt)))</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 11 : return 0;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : }</a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 14237 : const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len)</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : {</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 14237 : unsigned absoffset = offset + fdt_off_dt_struct(fdt);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 14237 : if ((absoffset &lt; offset)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 14237 : || ((absoffset + len) &lt; absoffset)</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 14237 : || (absoffset + len) &gt; fdt_totalsize(fdt))</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 14237 : if (fdt_version(fdt) &gt;= 0x11)</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 14237 : if (((offset + len) &lt; offset)</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 14237 : || ((offset + len) &gt; fdt_size_dt_struct(fdt)))</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 14237 : return fdt_offset_ptr_(fdt, offset);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : }</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 3329 : uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : {</a>
+<a name="173"><span class="lineNum"> 173 </span> : : const fdt32_t *tagp, *lenp;</a>
+<a name="174"><span class="lineNum"> 174 </span> : : uint32_t tag;</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 3329 : int offset = startoffset;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : const char *p;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 3329 : *nextoffset = -FDT_ERR_TRUNCATED;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 3329 : tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 3329 : if (!tagp)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : return FDT_END; /* premature end */</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 3329 : tag = fdt32_to_cpu(*tagp);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 3329 : offset += FDT_TAGSIZE;</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 3329 : *nextoffset = -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 3329 : switch (tag) {</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 4756 : case FDT_BEGIN_NODE:</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : /* skip name */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : do {</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 4756 : p = fdt_offset_ptr(fdt, offset++, 1);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 4756 : } while (p &amp;&amp; (*p != '\0'));</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 259 : if (!p)</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : return FDT_END; /* premature end */</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 259 : break;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 2823 : case FDT_PROP:</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 2823 : lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 2823 : if (!lenp)</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return FDT_END; /* premature end */</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : /* skip-name offset, length and value */</a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 2823 : offset += sizeof(struct fdt_property) - FDT_TAGSIZE</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 2823 : + fdt32_to_cpu(*lenp);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 2823 : if (fdt_version(fdt) &lt; 0x10 &amp;&amp; fdt32_to_cpu(*lenp) &gt;= 8 &amp;&amp;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : ((offset - fdt32_to_cpu(*lenp)) % 8) != 0)</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : offset += 4;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 2823 : break;</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 247 : case FDT_END:</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : case FDT_END_NODE:</a>
+<a name="210"><span class="lineNum"> 210 </span> : : case FDT_NOP:</a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 247 : break;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : return FDT_END;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 3329 : if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset))</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : return FDT_END; /* premature end */</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 3329 : *nextoffset = FDT_TAGALIGN(offset);</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 3329 : return tag;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : }</a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 16 : int fdt_check_node_offset_(const void *fdt, int offset)</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : {</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 16 : if ((offset &lt; 0) || (offset % FDT_TAGSIZE)</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 16 : || (fdt_next_tag(fdt, offset, &amp;offset) != FDT_BEGIN_NODE))</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADOFFSET;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 16 : return offset;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : }</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : int fdt_check_prop_offset_(const void *fdt, int offset)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : {</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : if ((offset &lt; 0) || (offset % FDT_TAGSIZE)</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : || (fdt_next_tag(fdt, offset, &amp;offset) != FDT_PROP))</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADOFFSET;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : int fdt_next_node(const void *fdt, int offset, int *depth)</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : {</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : int nextoffset = 0;</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : uint32_t tag;</a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : if (offset &gt;= 0)</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : if ((nextoffset = fdt_check_node_offset_(fdt, offset)) &lt; 0)</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : return nextoffset;</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> : : do {</a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : offset = nextoffset;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : tag = fdt_next_tag(fdt, offset, &amp;nextoffset);</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : switch (tag) {</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : case FDT_PROP:</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : case FDT_NOP:</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : case FDT_BEGIN_NODE:</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : if (depth)</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : (*depth)++;</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : case FDT_END_NODE:</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : if (depth &amp;&amp; ((--(*depth)) &lt; 0))</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : return nextoffset;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : case FDT_END:</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : if ((nextoffset &gt;= 0)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : || ((nextoffset == -FDT_ERR_TRUNCATED) &amp;&amp; !depth))</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : else</a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : return nextoffset;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : }</a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : } while (tag != FDT_BEGIN_NODE);</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : }</a>
+<a name="281"><span class="lineNum"> 281 </span> : : </a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : int fdt_first_subnode(const void *fdt, int offset)</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : {</a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : int depth = 0;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, &amp;depth);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : if (offset &lt; 0 || depth != 1)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : }</a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineNoCov"> 0 : int fdt_next_subnode(const void *fdt, int offset)</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : {</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : int depth = 1;</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /*</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * With respect to the parent, the depth of the next subnode will be</a>
+<a name="299"><span class="lineNum"> 299 </span> : : * the same as the last.</a>
+<a name="300"><span class="lineNum"> 300 </span> : : */</a>
+<a name="301"><span class="lineNum"> 301 </span> : : do {</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, &amp;depth);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : if (offset &lt; 0 || depth &lt; 1)</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : } while (depth &gt; 1);</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : }</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 2785 : const char *fdt_find_string_(const char *strtab, int tabsize, const char *s)</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : {</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 2785 : int len = strlen(s) + 1;</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 2785 : const char *last = strtab + tabsize - len;</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : const char *p;</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 1231128 : for (p = strtab; p &lt;= last; p++)</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 1230932 : if (memcmp(p, s, len) == 0)</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 2589 : return p;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 196 : return NULL;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : }</a>
+<a name="321"><span class="lineNum"> 321 </span> : : </a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : int fdt_move(const void *fdt, void *buf, int bufsize)</span></a>
+<a name="323"><span class="lineNum"> 323 </span> : : {</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineNoCov"> 0 : if (fdt_totalsize(fdt) &gt; bufsize)</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : </a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineNoCov"> 0 : memmove(buf, fdt, fdt_totalsize(fdt));</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_ro.c.func-sort-c.html b/coverage-report/libfdt/fdt_ro.c.func-sort-c.html
new file mode 100644
index 0000000..5eccc46
--- /dev/null
+++ b/coverage-report/libfdt/fdt_ro.c.func-sort-c.html
@@ -0,0 +1,245 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_ro.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_ro.c<span style="font-size: 80%;"> (<a href="fdt_ro.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntry">455</td>
+ <td class="headerCovTableEntryLo">5.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryLo">7.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="fdt_ro.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#879">fdt_check_full</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#145">fdt_find_max_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#366">fdt_first_property_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#173">fdt_generate_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#558">fdt_get_alias</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#546">fdt_get_alias_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#203">fdt_get_mem_rsv</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#563">fdt_get_path</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#529">fdt_get_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#469">fdt_get_property</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#405">fdt_get_property_by_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#384">fdt_get_property_by_offset_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#451">fdt_get_property_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#421">fdt_get_property_namelen_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#523">fdt_getprop</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#495">fdt_getprop_by_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#477">fdt_getprop_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#191">fdt_mem_rsv</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#376">fdt_next_property_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#841">fdt_node_check_compatible</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#651">fdt_node_depth</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#854">fdt_node_offset_by_compatible</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#699">fdt_node_offset_by_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#672">fdt_node_offset_by_prop_value</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#56">fdt_nodename_eq_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#217">fdt_num_mem_rsv</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#662">fdt_parent_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#323">fdt_path_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#278">fdt_path_offset_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#136">fdt_string_eq_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#724">fdt_stringlist_contains</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#741">fdt_stringlist_count</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#796">fdt_stringlist_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#766">fdt_stringlist_search</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#272">fdt_subnode_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#253">fdt_subnode_offset_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#615">fdt_supernode_atdepth_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#229">nextprop_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#328">fdt_get_name</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#77">fdt_get_string</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#131">fdt_string</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_ro.c.func.html b/coverage-report/libfdt/fdt_ro.c.func.html
new file mode 100644
index 0000000..2ce8969
--- /dev/null
+++ b/coverage-report/libfdt/fdt_ro.c.func.html
@@ -0,0 +1,245 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_ro.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_ro.c<span style="font-size: 80%;"> (<a href="fdt_ro.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntry">455</td>
+ <td class="headerCovTableEntryLo">5.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryLo">7.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="fdt_ro.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#879">fdt_check_full</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#145">fdt_find_max_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#366">fdt_first_property_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#173">fdt_generate_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#558">fdt_get_alias</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#546">fdt_get_alias_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#203">fdt_get_mem_rsv</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#328">fdt_get_name</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#563">fdt_get_path</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#529">fdt_get_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#469">fdt_get_property</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#405">fdt_get_property_by_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#384">fdt_get_property_by_offset_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#451">fdt_get_property_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#421">fdt_get_property_namelen_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#77">fdt_get_string</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#523">fdt_getprop</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#495">fdt_getprop_by_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#477">fdt_getprop_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#191">fdt_mem_rsv</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#376">fdt_next_property_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#841">fdt_node_check_compatible</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#651">fdt_node_depth</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#854">fdt_node_offset_by_compatible</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#699">fdt_node_offset_by_phandle</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#672">fdt_node_offset_by_prop_value</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#56">fdt_nodename_eq_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#217">fdt_num_mem_rsv</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#662">fdt_parent_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#323">fdt_path_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#278">fdt_path_offset_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#131">fdt_string</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#136">fdt_string_eq_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#724">fdt_stringlist_contains</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#741">fdt_stringlist_count</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#796">fdt_stringlist_get</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#766">fdt_stringlist_search</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#272">fdt_subnode_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#253">fdt_subnode_offset_namelen</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#615">fdt_supernode_atdepth_offset</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_ro.c.gcov.html#229">nextprop_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_ro.c.gcov.html b/coverage-report/libfdt/fdt_ro.c.gcov.html
new file mode 100644
index 0000000..7884055
--- /dev/null
+++ b/coverage-report/libfdt/fdt_ro.c.gcov.html
@@ -0,0 +1,1027 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_ro.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_ro.c<span style="font-size: 80%;"> (source / <a href="fdt_ro.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntry">455</td>
+ <td class="headerCovTableEntryLo">5.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">41</td>
+ <td class="headerCovTableEntryLo">7.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /*</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * libfdt - Flat Device Tree manipulation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright (C) 2006 David Gibson, IBM Corporation.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * libfdt is dual licensed: you can use it either under the terms of</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * the GPL, or the BSD license, at your option.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * a) This library is free software; you can redistribute it and/or</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * modify it under the terms of the GNU General Public License as</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * published by the Free Software Foundation; either version 2 of the</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * License, or (at your option) any later version.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * This library is distributed in the hope that it will be useful,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * GNU General Public License for more details.</a>
+<a name="17"><span class="lineNum"> 17 </span> : : *</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * You should have received a copy of the GNU General Public</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * License along with this library; if not, write to the Free</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * MA 02110-1301 USA</a>
+<a name="22"><span class="lineNum"> 22 </span> : : *</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * Alternatively,</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * b) Redistribution and use in source and binary forms, with or</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * without modification, are permitted provided that the following</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * conditions are met:</a>
+<a name="28"><span class="lineNum"> 28 </span> : : *</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * 1. Redistributions of source code must retain the above</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * disclaimer.</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * 2. Redistributions in binary form must reproduce the above</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * disclaimer in the documentation and/or other materials</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * provided with the distribution.</a>
+<a name="36"><span class="lineNum"> 36 </span> : : *</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</a>
+<a name="50"><span class="lineNum"> 50 </span> : : */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : #include &quot;libfdt_env.h&quot;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : #include &lt;fdt.h&gt;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #include &lt;libfdt.h&gt;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : #include &quot;libfdt_internal.h&quot;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : static int fdt_nodename_eq_(const void *fdt, int offset,</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : const char *s, int len)</a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> : : int olen;</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : const char *p = fdt_get_name(fdt, offset, &amp;olen);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : if (!p || olen &lt; len)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : /* short match */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : if (memcmp(p, s, len) != 0)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineNoCov"> 0 : if (p[len] == '\0')</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : else if (!memchr(s, '@', len) &amp;&amp; (p[len] == '@'))</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : else</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 38 : const char *fdt_get_string(const void *fdt, int stroffset, int *lenp)</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : {</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 38 : uint32_t absoffset = stroffset + fdt_off_dt_strings(fdt);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : size_t len;</a>
+<a name="83"><span class="lineNum"> 83 </span> : : int err;</a>
+<a name="84"><span class="lineNum"> 84 </span> : : const char *s, *n;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 38 : err = fdt_ro_probe_(fdt);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 38 : if (err != 0)</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 38 : err = -FDT_ERR_BADOFFSET;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 38 : if (absoffset &gt;= fdt_totalsize(fdt))</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 38 : len = fdt_totalsize(fdt) - absoffset;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 38 : if (fdt_magic(fdt) == FDT_MAGIC) {</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 38 : if (stroffset &lt; 0)</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 38 : if (fdt_version(fdt) &gt;= 17) {</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 38 : if (stroffset &gt;= fdt_size_dt_strings(fdt))</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 38 : if ((fdt_size_dt_strings(fdt) - stroffset) &lt; len)</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : len = fdt_size_dt_strings(fdt) - stroffset;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : } else if (fdt_magic(fdt) == FDT_SW_MAGIC) {</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : if ((stroffset &gt;= 0)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : || (stroffset &lt; -fdt_size_dt_strings(fdt)))</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : if ((-stroffset) &lt; len)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : len = -stroffset;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : } else {</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : err = -FDT_ERR_INTERNAL;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : }</a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 38 : s = (const char *)fdt + absoffset;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 38 : n = memchr(s, '\0', len);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 38 : if (!n) {</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* missing terminating NULL */</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineNoCov"> 0 : err = -FDT_ERR_TRUNCATED;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 38 : if (lenp)</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : *lenp = n - s;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 38 : return s;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : fail:</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : *lenp = err;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : }</a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 38 : const char *fdt_string(const void *fdt, int stroffset)</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : {</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 38 : return fdt_get_string(fdt, stroffset, NULL);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : static int fdt_string_eq_(const void *fdt, int stroffset,</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : const char *s, int len)</a>
+<a name="140"><span class="lineNum"> 140 </span> : : {</a>
+<a name="141"><span class="lineNum"> 141 </span> : : int slen;</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : const char *p = fdt_get_string(fdt, stroffset, &amp;slen);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : return p &amp;&amp; (slen == len) &amp;&amp; (memcmp(p, s, len) == 0);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : }</a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : int fdt_find_max_phandle(const void *fdt, uint32_t *phandle)</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : {</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : uint32_t max = 0;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : int offset = -1;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : while (true) {</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : uint32_t value;</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, NULL);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : if (offset &lt; 0) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : if (offset == -FDT_ERR_NOTFOUND)</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : value = fdt_get_phandle(fdt, offset);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : if (value &gt; max)</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : max = value;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : }</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : if (phandle)</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : *phandle = max;</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : }</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : int fdt_generate_phandle(const void *fdt, uint32_t *phandle)</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : {</a>
+<a name="177"><span class="lineNum"> 177 </span> : : uint32_t max;</a>
+<a name="178"><span class="lineNum"> 178 </span> : : int err;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : err = fdt_find_max_phandle(fdt, &amp;max);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : if (err &lt; 0)</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return err;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : if (max == FDT_MAX_PHANDLE)</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOPHANDLES;</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineNoCov"> 0 : if (phandle)</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineNoCov"> 0 : *phandle = max + 1;</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : static const struct fdt_reserve_entry *fdt_mem_rsv(const void *fdt, int n)</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : {</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : int offset = n * sizeof(struct fdt_reserve_entry);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : int absoffset = fdt_off_mem_rsvmap(fdt) + offset;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : if (absoffset &lt; fdt_off_mem_rsvmap(fdt))</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : if (absoffset &gt; fdt_totalsize(fdt) - sizeof(struct fdt_reserve_entry))</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : return fdt_mem_rsv_(fdt, n);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> : : }</a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : {</a>
+<a name="207"><span class="lineNum"> 207 </span> : : const struct fdt_reserve_entry *re;</a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : re = fdt_mem_rsv(fdt, n);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : if (!re)</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADOFFSET;</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : *address = fdt64_ld(&amp;re-&gt;address);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : *size = fdt64_ld(&amp;re-&gt;size);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : }</a>
+<a name="218"><span class="lineNum"> 218 </span> : : </a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : int fdt_num_mem_rsv(const void *fdt)</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : {</a>
+<a name="221"><span class="lineNum"> 221 </span> : : int i;</a>
+<a name="222"><span class="lineNum"> 222 </span> : : const struct fdt_reserve_entry *re;</a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : for (i = 0; (re = fdt_mem_rsv(fdt, i)) != NULL; i++) {</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : if (fdt64_ld(&amp;re-&gt;size) == 0)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : return i;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : static int nextprop_(const void *fdt, int offset)</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : {</a>
+<a name="233"><span class="lineNum"> 233 </span> : : uint32_t tag;</a>
+<a name="234"><span class="lineNum"> 234 </span> : : int nextoffset;</a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> : : do {</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : tag = fdt_next_tag(fdt, offset, &amp;nextoffset);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : switch (tag) {</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineNoCov"> 0 : case FDT_END:</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : if (nextoffset &gt;= 0)</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : else</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : return nextoffset;</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : case FDT_PROP:</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="248"><span class="lineNum"> 248 </span> : : }</a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineNoCov"> 0 : offset = nextoffset;</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : } while (tag == FDT_NOP);</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : }</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : int fdt_subnode_offset_namelen(const void *fdt, int offset,</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : const char *name, int namelen)</a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> : : int depth;</a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : for (depth = 0;</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : (offset &gt;= 0) &amp;&amp; (depth &gt;= 0);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, &amp;depth))</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : if ((depth == 1)</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : &amp;&amp; fdt_nodename_eq_(fdt, offset, name, namelen))</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : </a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : if (depth &lt; 0)</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : return offset; /* error */</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineNoCov"> 0 : int fdt_subnode_offset(const void *fdt, int parentoffset,</span></a>
+<a name="275"><span class="lineNum"> 275 </span> : : const char *name)</a>
+<a name="276"><span class="lineNum"> 276 </span> : : {</a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen)</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : const char *end = path + namelen;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : const char *p = path;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : int offset = 0;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : </a>
+<a name="288"><span class="lineNum"> 288 </span> : : /* see if we have an alias */</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineNoCov"> 0 : if (*path != '/') {</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineNoCov"> 0 : const char *q = memchr(path, '/', end - p);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : if (!q)</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineNoCov"> 0 : q = end;</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : p = fdt_get_alias_namelen(fdt, p, q - p);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineNoCov"> 0 : if (!p)</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADPATH;</span></a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : offset = fdt_path_offset(fdt, p);</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : </a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : p = q;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : }</a>
+<a name="302"><span class="lineNum"> 302 </span> : : </a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : while (p &lt; end) {</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : const char *q;</a>
+<a name="305"><span class="lineNum"> 305 </span> : : </a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineNoCov"> 0 : while (*p == '/') {</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : p++;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : if (p == end)</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : }</a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : q = memchr(p, '/', end - p);</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : if (! q)</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : q = end;</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p);</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineNoCov"> 0 : if (offset &lt; 0)</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="318"><span class="lineNum"> 318 </span> : : </a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : p = q;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : }</a>
+<a name="321"><span class="lineNum"> 321 </span> : : </a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> : : }</a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : int fdt_path_offset(const void *fdt, const char *path)</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : return fdt_path_offset_namelen(fdt, path, strlen(path));</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : }</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 7 : const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : {</a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 7 : const struct fdt_node_header *nh = fdt_offset_ptr_(fdt, nodeoffset);</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : const char *nameptr;</a>
+<a name="334"><span class="lineNum"> 334 </span> : : int err;</a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 7 : if (((err = fdt_ro_probe_(fdt)) != 0)</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 7 : || ((err = fdt_check_node_offset_(fdt, nodeoffset)) &lt; 0))</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="339"><span class="lineNum"> 339 </span> : : </a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 7 : nameptr = nh-&gt;name;</span></a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 7 : if (fdt_version(fdt) &lt; 0x10) {</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : /*</a>
+<a name="344"><span class="lineNum"> 344 </span> : : * For old FDT versions, match the naming conventions of V16:</a>
+<a name="345"><span class="lineNum"> 345 </span> : : * give only the leaf name (after all /). The actual tree</a>
+<a name="346"><span class="lineNum"> 346 </span> : : * contents are loosely checked.</a>
+<a name="347"><span class="lineNum"> 347 </span> : : */</a>
+<a name="348"><span class="lineNum"> 348 </span> : : const char *leaf;</a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineNoCov"> 0 : leaf = strrchr(nameptr, '/');</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : if (leaf == NULL) {</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : err = -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : }</a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : nameptr = leaf+1;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : }</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 7 : if (len)</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : *len = strlen(nameptr);</span></a>
+<a name="359"><span class="lineNum"> 359 </span> : : </a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 7 : return nameptr;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> : : </a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : fail:</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : if (len)</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : *len = err;</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : }</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : int fdt_first_property_offset(const void *fdt, int nodeoffset)</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : {</a>
+<a name="370"><span class="lineNum"> 370 </span> : : int offset;</a>
+<a name="371"><span class="lineNum"> 371 </span> : : </a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : if ((offset = fdt_check_node_offset_(fdt, nodeoffset)) &lt; 0)</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : </a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : return nextprop_(fdt, offset);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> : : }</a>
+<a name="377"><span class="lineNum"> 377 </span> : : </a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : int fdt_next_property_offset(const void *fdt, int offset)</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : {</a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : if ((offset = fdt_check_prop_offset_(fdt, offset)) &lt; 0)</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : return nextprop_(fdt, offset);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> : : }</a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : static const struct fdt_property *fdt_get_property_by_offset_(const void *fdt,</span></a>
+<a name="387"><span class="lineNum"> 387 </span> : : int offset,</a>
+<a name="388"><span class="lineNum"> 388 </span> : : int *lenp)</a>
+<a name="389"><span class="lineNum"> 389 </span> : : {</a>
+<a name="390"><span class="lineNum"> 390 </span> : : int err;</a>
+<a name="391"><span class="lineNum"> 391 </span> : : const struct fdt_property *prop;</a>
+<a name="392"><span class="lineNum"> 392 </span> : : </a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : if ((err = fdt_check_prop_offset_(fdt, offset)) &lt; 0) {</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : *lenp = err;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : }</a>
+<a name="398"><span class="lineNum"> 398 </span> : : </a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : prop = fdt_offset_ptr_(fdt, offset);</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : *lenp = fdt32_ld(&amp;prop-&gt;len);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : return prop;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : }</a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineNoCov"> 0 : const struct fdt_property *fdt_get_property_by_offset(const void *fdt,</span></a>
+<a name="408"><span class="lineNum"> 408 </span> : : int offset,</a>
+<a name="409"><span class="lineNum"> 409 </span> : : int *lenp)</a>
+<a name="410"><span class="lineNum"> 410 </span> : : {</a>
+<a name="411"><span class="lineNum"> 411 </span> : : /* Prior to version 16, properties may need realignment</a>
+<a name="412"><span class="lineNum"> 412 </span> : : * and this API does not work. fdt_getprop_*() will, however. */</a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : if (fdt_version(fdt) &lt; 0x10) {</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : *lenp = -FDT_ERR_BADVERSION;</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="418"><span class="lineNum"> 418 </span> : : }</a>
+<a name="419"><span class="lineNum"> 419 </span> : : </a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : return fdt_get_property_by_offset_(fdt, offset, lenp);</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineNoCov"> 0 : static const struct fdt_property *fdt_get_property_namelen_(const void *fdt,</span></a>
+<a name="424"><span class="lineNum"> 424 </span> : : int offset,</a>
+<a name="425"><span class="lineNum"> 425 </span> : : const char *name,</a>
+<a name="426"><span class="lineNum"> 426 </span> : : int namelen,</a>
+<a name="427"><span class="lineNum"> 427 </span> : : int *lenp,</a>
+<a name="428"><span class="lineNum"> 428 </span> : : int *poffset)</a>
+<a name="429"><span class="lineNum"> 429 </span> : : {</a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : for (offset = fdt_first_property_offset(fdt, offset);</span></a>
+<a name="431"><span class="lineNum"> 431 </span> : : (offset &gt;= 0);</a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : (offset = fdt_next_property_offset(fdt, offset))) {</span></a>
+<a name="433"><span class="lineNum"> 433 </span> : : const struct fdt_property *prop;</a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineNoCov"> 0 : if (!(prop = fdt_get_property_by_offset_(fdt, offset, lenp))) {</span></a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : offset = -FDT_ERR_INTERNAL;</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="438"><span class="lineNum"> 438 </span> : : }</a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : if (fdt_string_eq_(fdt, fdt32_ld(&amp;prop-&gt;nameoff),</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : name, namelen)) {</a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : if (poffset)</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : *poffset = offset;</span></a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : return prop;</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : }</a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : *lenp = offset;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : }</a>
+<a name="451"><span class="lineNum"> 451 </span> : : </a>
+<a name="452"><span class="lineNum"> 452 </span> : : </a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : const struct fdt_property *fdt_get_property_namelen(const void *fdt,</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : int offset,</a>
+<a name="455"><span class="lineNum"> 455 </span> : : const char *name,</a>
+<a name="456"><span class="lineNum"> 456 </span> : : int namelen, int *lenp)</a>
+<a name="457"><span class="lineNum"> 457 </span> : : {</a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* Prior to version 16, properties may need realignment</a>
+<a name="459"><span class="lineNum"> 459 </span> : : * and this API does not work. fdt_getprop_*() will, however. */</a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : if (fdt_version(fdt) &lt; 0x10) {</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : *lenp = -FDT_ERR_BADVERSION;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> : : }</a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineNoCov"> 0 : return fdt_get_property_namelen_(fdt, offset, name, namelen, lenp,</span></a>
+<a name="467"><span class="lineNum"> 467 </span> : : NULL);</a>
+<a name="468"><span class="lineNum"> 468 </span> : : }</a>
+<a name="469"><span class="lineNum"> 469 </span> : : </a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : const struct fdt_property *fdt_get_property(const void *fdt,</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : int nodeoffset,</a>
+<a name="473"><span class="lineNum"> 473 </span> : : const char *name, int *lenp)</a>
+<a name="474"><span class="lineNum"> 474 </span> : : {</a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineNoCov"> 0 : return fdt_get_property_namelen(fdt, nodeoffset, name,</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : strlen(name), lenp);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : }</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : const char *name, int namelen, int *lenp)</a>
+<a name="481"><span class="lineNum"> 481 </span> : : {</a>
+<a name="482"><span class="lineNum"> 482 </span> : : int poffset;</a>
+<a name="483"><span class="lineNum"> 483 </span> : : const struct fdt_property *prop;</a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : prop = fdt_get_property_namelen_(fdt, nodeoffset, name, namelen, lenp,</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : &amp;poffset);</a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineNoCov"> 0 : if (!prop)</span></a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> : : /* Handle realignment */</a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : if (fdt_version(fdt) &lt; 0x10 &amp;&amp; (poffset + sizeof(*prop)) % 8 &amp;&amp;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : fdt32_ld(&amp;prop-&gt;len) &gt;= 8)</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : return prop-&gt;data + 4;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : return prop-&gt;data;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> : : }</a>
+<a name="496"><span class="lineNum"> 496 </span> : : </a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : const void *fdt_getprop_by_offset(const void *fdt, int offset,</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : const char **namep, int *lenp)</a>
+<a name="499"><span class="lineNum"> 499 </span> : : {</a>
+<a name="500"><span class="lineNum"> 500 </span> : : const struct fdt_property *prop;</a>
+<a name="501"><span class="lineNum"> 501 </span> : : </a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : prop = fdt_get_property_by_offset_(fdt, offset, lenp);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : if (!prop)</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : if (namep) {</span></a>
+<a name="506"><span class="lineNum"> 506 </span> : : const char *name;</a>
+<a name="507"><span class="lineNum"> 507 </span> : : int namelen;</a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineNoCov"> 0 : name = fdt_get_string(fdt, fdt32_ld(&amp;prop-&gt;nameoff),</span></a>
+<a name="509"><span class="lineNum"> 509 </span> : : &amp;namelen);</a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineNoCov"> 0 : if (!name) {</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="512"><span class="lineNum"> 512 </span> :<span class="lineNoCov"> 0 : *lenp = namelen;</span></a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="514"><span class="lineNum"> 514 </span> : : }</a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineNoCov"> 0 : *namep = name;</span></a>
+<a name="516"><span class="lineNum"> 516 </span> : : }</a>
+<a name="517"><span class="lineNum"> 517 </span> : : </a>
+<a name="518"><span class="lineNum"> 518 </span> : : /* Handle realignment */</a>
+<a name="519"><span class="lineNum"> 519 </span> :<span class="lineNoCov"> 0 : if (fdt_version(fdt) &lt; 0x10 &amp;&amp; (offset + sizeof(*prop)) % 8 &amp;&amp;</span></a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : fdt32_ld(&amp;prop-&gt;len) &gt;= 8)</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : return prop-&gt;data + 4;</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : return prop-&gt;data;</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : }</a>
+<a name="524"><span class="lineNum"> 524 </span> : : </a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineNoCov"> 0 : const void *fdt_getprop(const void *fdt, int nodeoffset,</span></a>
+<a name="526"><span class="lineNum"> 526 </span> : : const char *name, int *lenp)</a>
+<a name="527"><span class="lineNum"> 527 </span> : : {</a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : return fdt_getprop_namelen(fdt, nodeoffset, name, strlen(name), lenp);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> : : }</a>
+<a name="530"><span class="lineNum"> 530 </span> : : </a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : {</a>
+<a name="533"><span class="lineNum"> 533 </span> : : const fdt32_t *php;</a>
+<a name="534"><span class="lineNum"> 534 </span> : : int len;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : </a>
+<a name="536"><span class="lineNum"> 536 </span> : : /* FIXME: This is a bit sub-optimal, since we potentially scan</a>
+<a name="537"><span class="lineNum"> 537 </span> : : * over all the properties twice. */</a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : php = fdt_getprop(fdt, nodeoffset, &quot;phandle&quot;, &amp;len);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (!php || (len != sizeof(*php))) {</span></a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineNoCov"> 0 : php = fdt_getprop(fdt, nodeoffset, &quot;linux,phandle&quot;, &amp;len);</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : if (!php || (len != sizeof(*php)))</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : }</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : return fdt32_ld(php);</span></a>
+<a name="546"><span class="lineNum"> 546 </span> : : }</a>
+<a name="547"><span class="lineNum"> 547 </span> : : </a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : const char *fdt_get_alias_namelen(const void *fdt,</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : const char *name, int namelen)</a>
+<a name="550"><span class="lineNum"> 550 </span> : : {</a>
+<a name="551"><span class="lineNum"> 551 </span> : : int aliasoffset;</a>
+<a name="552"><span class="lineNum"> 552 </span> : : </a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : aliasoffset = fdt_path_offset(fdt, &quot;/aliases&quot;);</span></a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineNoCov"> 0 : if (aliasoffset &lt; 0)</span></a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : </a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL);</span></a>
+<a name="558"><span class="lineNum"> 558 </span> : : }</a>
+<a name="559"><span class="lineNum"> 559 </span> : : </a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : const char *fdt_get_alias(const void *fdt, const char *name)</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : {</a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : return fdt_get_alias_namelen(fdt, name, strlen(name));</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : }</a>
+<a name="564"><span class="lineNum"> 564 </span> : : </a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)</span></a>
+<a name="566"><span class="lineNum"> 566 </span> : : {</a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : int pdepth = 0, p = 0;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : int offset, depth, namelen;</a>
+<a name="569"><span class="lineNum"> 569 </span> : : const char *name;</a>
+<a name="570"><span class="lineNum"> 570 </span> : : </a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="572"><span class="lineNum"> 572 </span> : : </a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : if (buflen &lt; 2)</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : </a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineNoCov"> 0 : for (offset = 0, depth = 0;</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineNoCov"> 0 : (offset &gt;= 0) &amp;&amp; (offset &lt;= nodeoffset);</span></a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, &amp;depth)) {</span></a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineNoCov"> 0 : while (pdepth &gt; depth) {</span></a>
+<a name="580"><span class="lineNum"> 580 </span> : : do {</a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : p--;</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : } while (buf[p-1] != '/');</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : pdepth--;</span></a>
+<a name="584"><span class="lineNum"> 584 </span> : : }</a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : if (pdepth &gt;= depth) {</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : name = fdt_get_name(fdt, offset, &amp;namelen);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : if (!name)</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : return namelen;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : if ((p + namelen + 1) &lt;= buflen) {</span></a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineNoCov"> 0 : memcpy(buf + p, name, namelen);</span></a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineNoCov"> 0 : p += namelen;</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : buf[p++] = '/';</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : pdepth++;</span></a>
+<a name="595"><span class="lineNum"> 595 </span> : : }</a>
+<a name="596"><span class="lineNum"> 596 </span> : : }</a>
+<a name="597"><span class="lineNum"> 597 </span> : : </a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : if (offset == nodeoffset) {</span></a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineNoCov"> 0 : if (pdepth &lt; (depth + 1))</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="601"><span class="lineNum"> 601 </span> : : </a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : if (p &gt; 1) /* special case so that root path is &quot;/&quot;, not &quot;&quot; */</span></a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineNoCov"> 0 : p--;</span></a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineNoCov"> 0 : buf[p] = '\0';</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : }</a>
+<a name="607"><span class="lineNum"> 607 </span> : : }</a>
+<a name="608"><span class="lineNum"> 608 </span> : : </a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : if ((offset == -FDT_ERR_NOTFOUND) || (offset &gt;= 0))</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADOFFSET;</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : else if (offset == -FDT_ERR_BADOFFSET)</span></a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : </a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineNoCov"> 0 : return offset; /* error from fdt_next_node() */</span></a>
+<a name="615"><span class="lineNum"> 615 </span> : : }</a>
+<a name="616"><span class="lineNum"> 616 </span> : : </a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,</span></a>
+<a name="618"><span class="lineNum"> 618 </span> : : int supernodedepth, int *nodedepth)</a>
+<a name="619"><span class="lineNum"> 619 </span> : : {</a>
+<a name="620"><span class="lineNum"> 620 </span> : : int offset, depth;</a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : int supernodeoffset = -FDT_ERR_INTERNAL;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : </a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : if (supernodedepth &lt; 0)</span></a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="627"><span class="lineNum"> 627 </span> : : </a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineNoCov"> 0 : for (offset = 0, depth = 0;</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : (offset &gt;= 0) &amp;&amp; (offset &lt;= nodeoffset);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, &amp;depth)) {</span></a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineNoCov"> 0 : if (depth == supernodedepth)</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : supernodeoffset = offset;</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : </a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : if (offset == nodeoffset) {</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : if (nodedepth)</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineNoCov"> 0 : *nodedepth = depth;</span></a>
+<a name="637"><span class="lineNum"> 637 </span> : : </a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : if (supernodedepth &gt; depth)</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="640"><span class="lineNum"> 640 </span> : : else</a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : return supernodeoffset;</span></a>
+<a name="642"><span class="lineNum"> 642 </span> : : }</a>
+<a name="643"><span class="lineNum"> 643 </span> : : }</a>
+<a name="644"><span class="lineNum"> 644 </span> : : </a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineNoCov"> 0 : if ((offset == -FDT_ERR_NOTFOUND) || (offset &gt;= 0))</span></a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADOFFSET;</span></a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineNoCov"> 0 : else if (offset == -FDT_ERR_BADOFFSET)</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="649"><span class="lineNum"> 649 </span> : : </a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineNoCov"> 0 : return offset; /* error from fdt_next_node() */</span></a>
+<a name="651"><span class="lineNum"> 651 </span> : : }</a>
+<a name="652"><span class="lineNum"> 652 </span> : : </a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : int fdt_node_depth(const void *fdt, int nodeoffset)</span></a>
+<a name="654"><span class="lineNum"> 654 </span> : : {</a>
+<a name="655"><span class="lineNum"> 655 </span> : : int nodedepth;</a>
+<a name="656"><span class="lineNum"> 656 </span> : : int err;</a>
+<a name="657"><span class="lineNum"> 657 </span> : : </a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &amp;nodedepth);</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineNoCov"> 0 : if (err)</span></a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineNoCov"> 0 : return (err &lt; 0) ? err : -FDT_ERR_INTERNAL;</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : return nodedepth;</span></a>
+<a name="662"><span class="lineNum"> 662 </span> : : }</a>
+<a name="663"><span class="lineNum"> 663 </span> : : </a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineNoCov"> 0 : int fdt_parent_offset(const void *fdt, int nodeoffset)</span></a>
+<a name="665"><span class="lineNum"> 665 </span> : : {</a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineNoCov"> 0 : int nodedepth = fdt_node_depth(fdt, nodeoffset);</span></a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : if (nodedepth &lt; 0)</span></a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineNoCov"> 0 : return nodedepth;</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : return fdt_supernode_atdepth_offset(fdt, nodeoffset,</span></a>
+<a name="671"><span class="lineNum"> 671 </span> : : nodedepth - 1, NULL);</a>
+<a name="672"><span class="lineNum"> 672 </span> : : }</a>
+<a name="673"><span class="lineNum"> 673 </span> : : </a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : const char *propname,</a>
+<a name="676"><span class="lineNum"> 676 </span> : : const void *propval, int proplen)</a>
+<a name="677"><span class="lineNum"> 677 </span> : : {</a>
+<a name="678"><span class="lineNum"> 678 </span> : : int offset;</a>
+<a name="679"><span class="lineNum"> 679 </span> : : const void *val;</a>
+<a name="680"><span class="lineNum"> 680 </span> : : int len;</a>
+<a name="681"><span class="lineNum"> 681 </span> : : </a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> : : /* FIXME: The algorithm here is pretty horrible: we scan each</a>
+<a name="685"><span class="lineNum"> 685 </span> : : * property of a node in fdt_getprop(), then if that didn't</a>
+<a name="686"><span class="lineNum"> 686 </span> : : * find what we want, we scan over them again making our way</a>
+<a name="687"><span class="lineNum"> 687 </span> : : * to the next node. Still it's the easiest to implement</a>
+<a name="688"><span class="lineNum"> 688 </span> : : * approach; performance can come later. */</a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineNoCov"> 0 : for (offset = fdt_next_node(fdt, startoffset, NULL);</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : offset &gt;= 0;</a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, NULL)) {</span></a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineNoCov"> 0 : val = fdt_getprop(fdt, offset, propname, &amp;len);</span></a>
+<a name="693"><span class="lineNum"> 693 </span> :<span class="lineNoCov"> 0 : if (val &amp;&amp; (len == proplen)</span></a>
+<a name="694"><span class="lineNum"> 694 </span> :<span class="lineNoCov"> 0 : &amp;&amp; (memcmp(val, propval, len) == 0))</span></a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="696"><span class="lineNum"> 696 </span> : : }</a>
+<a name="697"><span class="lineNum"> 697 </span> : : </a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : return offset; /* error from fdt_next_node() */</span></a>
+<a name="699"><span class="lineNum"> 699 </span> : : }</a>
+<a name="700"><span class="lineNum"> 700 </span> : : </a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineNoCov"> 0 : int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)</span></a>
+<a name="702"><span class="lineNum"> 702 </span> : : {</a>
+<a name="703"><span class="lineNum"> 703 </span> : : int offset;</a>
+<a name="704"><span class="lineNum"> 704 </span> : : </a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : if ((phandle == 0) || (phandle == -1))</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADPHANDLE;</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> : : /* FIXME: The algorithm here is pretty horrible: we</a>
+<a name="711"><span class="lineNum"> 711 </span> : : * potentially scan each property of a node in</a>
+<a name="712"><span class="lineNum"> 712 </span> : : * fdt_get_phandle(), then if that didn't find what</a>
+<a name="713"><span class="lineNum"> 713 </span> : : * we want, we scan over them again making our way to the next</a>
+<a name="714"><span class="lineNum"> 714 </span> : : * node. Still it's the easiest to implement approach;</a>
+<a name="715"><span class="lineNum"> 715 </span> : : * performance can come later. */</a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineNoCov"> 0 : for (offset = fdt_next_node(fdt, -1, NULL);</span></a>
+<a name="717"><span class="lineNum"> 717 </span> : : offset &gt;= 0;</a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, NULL)) {</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineNoCov"> 0 : if (fdt_get_phandle(fdt, offset) == phandle)</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="721"><span class="lineNum"> 721 </span> : : }</a>
+<a name="722"><span class="lineNum"> 722 </span> : : </a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : return offset; /* error from fdt_next_node() */</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : }</a>
+<a name="725"><span class="lineNum"> 725 </span> : : </a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineNoCov"> 0 : int fdt_stringlist_contains(const char *strlist, int listlen, const char *str)</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : {</a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineNoCov"> 0 : int len = strlen(str);</span></a>
+<a name="729"><span class="lineNum"> 729 </span> : : const char *p;</a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineNoCov"> 0 : while (listlen &gt;= len) {</span></a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineNoCov"> 0 : if (memcmp(str, strlist, len+1) == 0)</span></a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineNoCov"> 0 : p = memchr(strlist, '\0', listlen);</span></a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : if (!p)</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : return 0; /* malformed strlist.. */</span></a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineNoCov"> 0 : listlen -= (p-strlist) + 1;</span></a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineNoCov"> 0 : strlist = p + 1;</span></a>
+<a name="739"><span class="lineNum"> 739 </span> : : }</a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="741"><span class="lineNum"> 741 </span> : : }</a>
+<a name="742"><span class="lineNum"> 742 </span> : : </a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property)</span></a>
+<a name="744"><span class="lineNum"> 744 </span> : : {</a>
+<a name="745"><span class="lineNum"> 745 </span> : : const char *list, *end;</a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : int length, count = 0;</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineNoCov"> 0 : list = fdt_getprop(fdt, nodeoffset, property, &amp;length);</span></a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineNoCov"> 0 : if (!list)</span></a>
+<a name="750"><span class="lineNum"> 750 </span> :<span class="lineNoCov"> 0 : return length;</span></a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineNoCov"> 0 : end = list + length;</span></a>
+<a name="753"><span class="lineNum"> 753 </span> : : </a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineNoCov"> 0 : while (list &lt; end) {</span></a>
+<a name="755"><span class="lineNum"> 755 </span> :<span class="lineNoCov"> 0 : length = strnlen(list, end - list) + 1;</span></a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> : : /* Abort if the last string isn't properly NUL-terminated. */</a>
+<a name="758"><span class="lineNum"> 758 </span> :<span class="lineNoCov"> 0 : if (list + length &gt; end)</span></a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADVALUE;</span></a>
+<a name="760"><span class="lineNum"> 760 </span> : : </a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineNoCov"> 0 : list += length;</span></a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : count++;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : </a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineNoCov"> 0 : return count;</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : }</a>
+<a name="767"><span class="lineNum"> 767 </span> : : </a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,</span></a>
+<a name="769"><span class="lineNum"> 769 </span> : : const char *string)</a>
+<a name="770"><span class="lineNum"> 770 </span> : : {</a>
+<a name="771"><span class="lineNum"> 771 </span> :<span class="lineNoCov"> 0 : int length, len, idx = 0;</span></a>
+<a name="772"><span class="lineNum"> 772 </span> : : const char *list, *end;</a>
+<a name="773"><span class="lineNum"> 773 </span> : : </a>
+<a name="774"><span class="lineNum"> 774 </span> :<span class="lineNoCov"> 0 : list = fdt_getprop(fdt, nodeoffset, property, &amp;length);</span></a>
+<a name="775"><span class="lineNum"> 775 </span> :<span class="lineNoCov"> 0 : if (!list)</span></a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineNoCov"> 0 : return length;</span></a>
+<a name="777"><span class="lineNum"> 777 </span> : : </a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineNoCov"> 0 : len = strlen(string) + 1;</span></a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : end = list + length;</span></a>
+<a name="780"><span class="lineNum"> 780 </span> : : </a>
+<a name="781"><span class="lineNum"> 781 </span> :<span class="lineNoCov"> 0 : while (list &lt; end) {</span></a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineNoCov"> 0 : length = strnlen(list, end - list) + 1;</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : </a>
+<a name="784"><span class="lineNum"> 784 </span> : : /* Abort if the last string isn't properly NUL-terminated. */</a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : if (list + length &gt; end)</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADVALUE;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> : : </a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineNoCov"> 0 : if (length == len &amp;&amp; memcmp(list, string, length) == 0)</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineNoCov"> 0 : return idx;</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : </a>
+<a name="791"><span class="lineNum"> 791 </span> :<span class="lineNoCov"> 0 : list += length;</span></a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : idx++;</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : }</a>
+<a name="794"><span class="lineNum"> 794 </span> : : </a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOTFOUND;</span></a>
+<a name="796"><span class="lineNum"> 796 </span> : : }</a>
+<a name="797"><span class="lineNum"> 797 </span> : : </a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineNoCov"> 0 : const char *fdt_stringlist_get(const void *fdt, int nodeoffset,</span></a>
+<a name="799"><span class="lineNum"> 799 </span> : : const char *property, int idx,</a>
+<a name="800"><span class="lineNum"> 800 </span> : : int *lenp)</a>
+<a name="801"><span class="lineNum"> 801 </span> : : {</a>
+<a name="802"><span class="lineNum"> 802 </span> : : const char *list, *end;</a>
+<a name="803"><span class="lineNum"> 803 </span> : : int length;</a>
+<a name="804"><span class="lineNum"> 804 </span> : : </a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : list = fdt_getprop(fdt, nodeoffset, property, &amp;length);</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : if (!list) {</span></a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineNoCov"> 0 : *lenp = length;</span></a>
+<a name="809"><span class="lineNum"> 809 </span> : : </a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="811"><span class="lineNum"> 811 </span> : : }</a>
+<a name="812"><span class="lineNum"> 812 </span> : : </a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineNoCov"> 0 : end = list + length;</span></a>
+<a name="814"><span class="lineNum"> 814 </span> : : </a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineNoCov"> 0 : while (list &lt; end) {</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : length = strnlen(list, end - list) + 1;</span></a>
+<a name="817"><span class="lineNum"> 817 </span> : : </a>
+<a name="818"><span class="lineNum"> 818 </span> : : /* Abort if the last string isn't properly NUL-terminated. */</a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineNoCov"> 0 : if (list + length &gt; end) {</span></a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineNoCov"> 0 : *lenp = -FDT_ERR_BADVALUE;</span></a>
+<a name="822"><span class="lineNum"> 822 </span> : : </a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="824"><span class="lineNum"> 824 </span> : : }</a>
+<a name="825"><span class="lineNum"> 825 </span> : : </a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : if (idx == 0) {</span></a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="828"><span class="lineNum"> 828 </span> :<span class="lineNoCov"> 0 : *lenp = length - 1;</span></a>
+<a name="829"><span class="lineNum"> 829 </span> : : </a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : return list;</span></a>
+<a name="831"><span class="lineNum"> 831 </span> : : }</a>
+<a name="832"><span class="lineNum"> 832 </span> : : </a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineNoCov"> 0 : list += length;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineNoCov"> 0 : idx--;</span></a>
+<a name="835"><span class="lineNum"> 835 </span> : : }</a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineNoCov"> 0 : if (lenp)</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineNoCov"> 0 : *lenp = -FDT_ERR_NOTFOUND;</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : </a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="841"><span class="lineNum"> 841 </span> : : }</a>
+<a name="842"><span class="lineNum"> 842 </span> : : </a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineNoCov"> 0 : int fdt_node_check_compatible(const void *fdt, int nodeoffset,</span></a>
+<a name="844"><span class="lineNum"> 844 </span> : : const char *compatible)</a>
+<a name="845"><span class="lineNum"> 845 </span> : : {</a>
+<a name="846"><span class="lineNum"> 846 </span> : : const void *prop;</a>
+<a name="847"><span class="lineNum"> 847 </span> : : int len;</a>
+<a name="848"><span class="lineNum"> 848 </span> : : </a>
+<a name="849"><span class="lineNum"> 849 </span> :<span class="lineNoCov"> 0 : prop = fdt_getprop(fdt, nodeoffset, &quot;compatible&quot;, &amp;len);</span></a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineNoCov"> 0 : if (!prop)</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineNoCov"> 0 : return len;</span></a>
+<a name="852"><span class="lineNum"> 852 </span> : : </a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineNoCov"> 0 : return !fdt_stringlist_contains(prop, len, compatible);</span></a>
+<a name="854"><span class="lineNum"> 854 </span> : : }</a>
+<a name="855"><span class="lineNum"> 855 </span> : : </a>
+<a name="856"><span class="lineNum"> 856 </span> :<span class="lineNoCov"> 0 : int fdt_node_offset_by_compatible(const void *fdt, int startoffset,</span></a>
+<a name="857"><span class="lineNum"> 857 </span> : : const char *compatible)</a>
+<a name="858"><span class="lineNum"> 858 </span> : : {</a>
+<a name="859"><span class="lineNum"> 859 </span> : : int offset, err;</a>
+<a name="860"><span class="lineNum"> 860 </span> : : </a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : FDT_RO_PROBE(fdt);</span></a>
+<a name="862"><span class="lineNum"> 862 </span> : : </a>
+<a name="863"><span class="lineNum"> 863 </span> : : /* FIXME: The algorithm here is pretty horrible: we scan each</a>
+<a name="864"><span class="lineNum"> 864 </span> : : * property of a node in fdt_node_check_compatible(), then if</a>
+<a name="865"><span class="lineNum"> 865 </span> : : * that didn't find what we want, we scan over them again</a>
+<a name="866"><span class="lineNum"> 866 </span> : : * making our way to the next node. Still it's the easiest to</a>
+<a name="867"><span class="lineNum"> 867 </span> : : * implement approach; performance can come later. */</a>
+<a name="868"><span class="lineNum"> 868 </span> :<span class="lineNoCov"> 0 : for (offset = fdt_next_node(fdt, startoffset, NULL);</span></a>
+<a name="869"><span class="lineNum"> 869 </span> : : offset &gt;= 0;</a>
+<a name="870"><span class="lineNum"> 870 </span> :<span class="lineNoCov"> 0 : offset = fdt_next_node(fdt, offset, NULL)) {</span></a>
+<a name="871"><span class="lineNum"> 871 </span> :<span class="lineNoCov"> 0 : err = fdt_node_check_compatible(fdt, offset, compatible);</span></a>
+<a name="872"><span class="lineNum"> 872 </span> :<span class="lineNoCov"> 0 : if ((err &lt; 0) &amp;&amp; (err != -FDT_ERR_NOTFOUND))</span></a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineNoCov"> 0 : return err;</span></a>
+<a name="874"><span class="lineNum"> 874 </span> :<span class="lineNoCov"> 0 : else if (err == 0)</span></a>
+<a name="875"><span class="lineNum"> 875 </span> :<span class="lineNoCov"> 0 : return offset;</span></a>
+<a name="876"><span class="lineNum"> 876 </span> : : }</a>
+<a name="877"><span class="lineNum"> 877 </span> : : </a>
+<a name="878"><span class="lineNum"> 878 </span> :<span class="lineNoCov"> 0 : return offset; /* error from fdt_next_node() */</span></a>
+<a name="879"><span class="lineNum"> 879 </span> : : }</a>
+<a name="880"><span class="lineNum"> 880 </span> : : </a>
+<a name="881"><span class="lineNum"> 881 </span> :<span class="lineNoCov"> 0 : int fdt_check_full(const void *fdt, size_t bufsize)</span></a>
+<a name="882"><span class="lineNum"> 882 </span> : : {</a>
+<a name="883"><span class="lineNum"> 883 </span> : : int err;</a>
+<a name="884"><span class="lineNum"> 884 </span> : : int num_memrsv;</a>
+<a name="885"><span class="lineNum"> 885 </span> :<span class="lineNoCov"> 0 : int offset, nextoffset = 0;</span></a>
+<a name="886"><span class="lineNum"> 886 </span> : : uint32_t tag;</a>
+<a name="887"><span class="lineNum"> 887 </span> :<span class="lineNoCov"> 0 : unsigned depth = 0;</span></a>
+<a name="888"><span class="lineNum"> 888 </span> : : const void *prop;</a>
+<a name="889"><span class="lineNum"> 889 </span> : : const char *propname;</a>
+<a name="890"><span class="lineNum"> 890 </span> : : </a>
+<a name="891"><span class="lineNum"> 891 </span> :<span class="lineNoCov"> 0 : if (bufsize &lt; FDT_V1_SIZE)</span></a>
+<a name="892"><span class="lineNum"> 892 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="893"><span class="lineNum"> 893 </span> :<span class="lineNoCov"> 0 : err = fdt_check_header(fdt);</span></a>
+<a name="894"><span class="lineNum"> 894 </span> :<span class="lineNoCov"> 0 : if (err != 0)</span></a>
+<a name="895"><span class="lineNum"> 895 </span> :<span class="lineNoCov"> 0 : return err;</span></a>
+<a name="896"><span class="lineNum"> 896 </span> :<span class="lineNoCov"> 0 : if (bufsize &lt; fdt_totalsize(fdt))</span></a>
+<a name="897"><span class="lineNum"> 897 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_TRUNCATED;</span></a>
+<a name="898"><span class="lineNum"> 898 </span> : : </a>
+<a name="899"><span class="lineNum"> 899 </span> :<span class="lineNoCov"> 0 : num_memrsv = fdt_num_mem_rsv(fdt);</span></a>
+<a name="900"><span class="lineNum"> 900 </span> :<span class="lineNoCov"> 0 : if (num_memrsv &lt; 0)</span></a>
+<a name="901"><span class="lineNum"> 901 </span> :<span class="lineNoCov"> 0 : return num_memrsv;</span></a>
+<a name="902"><span class="lineNum"> 902 </span> : : </a>
+<a name="903"><span class="lineNum"> 903 </span> : : while (1) {</a>
+<a name="904"><span class="lineNum"> 904 </span> :<span class="lineNoCov"> 0 : offset = nextoffset;</span></a>
+<a name="905"><span class="lineNum"> 905 </span> :<span class="lineNoCov"> 0 : tag = fdt_next_tag(fdt, offset, &amp;nextoffset);</span></a>
+<a name="906"><span class="lineNum"> 906 </span> : : </a>
+<a name="907"><span class="lineNum"> 907 </span> :<span class="lineNoCov"> 0 : if (nextoffset &lt; 0)</span></a>
+<a name="908"><span class="lineNum"> 908 </span> :<span class="lineNoCov"> 0 : return nextoffset;</span></a>
+<a name="909"><span class="lineNum"> 909 </span> : : </a>
+<a name="910"><span class="lineNum"> 910 </span> :<span class="lineNoCov"> 0 : switch (tag) {</span></a>
+<a name="911"><span class="lineNum"> 911 </span> :<span class="lineNoCov"> 0 : case FDT_NOP:</span></a>
+<a name="912"><span class="lineNum"> 912 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="913"><span class="lineNum"> 913 </span> : : </a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineNoCov"> 0 : case FDT_END:</span></a>
+<a name="915"><span class="lineNum"> 915 </span> :<span class="lineNoCov"> 0 : if (depth != 0)</span></a>
+<a name="916"><span class="lineNum"> 916 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="917"><span class="lineNum"> 917 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="918"><span class="lineNum"> 918 </span> : : </a>
+<a name="919"><span class="lineNum"> 919 </span> :<span class="lineNoCov"> 0 : case FDT_BEGIN_NODE:</span></a>
+<a name="920"><span class="lineNum"> 920 </span> :<span class="lineNoCov"> 0 : depth++;</span></a>
+<a name="921"><span class="lineNum"> 921 </span> :<span class="lineNoCov"> 0 : if (depth &gt; INT_MAX)</span></a>
+<a name="922"><span class="lineNum"> 922 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="923"><span class="lineNum"> 923 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="924"><span class="lineNum"> 924 </span> : : </a>
+<a name="925"><span class="lineNum"> 925 </span> :<span class="lineNoCov"> 0 : case FDT_END_NODE:</span></a>
+<a name="926"><span class="lineNum"> 926 </span> :<span class="lineNoCov"> 0 : if (depth == 0)</span></a>
+<a name="927"><span class="lineNum"> 927 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTRUCTURE;</span></a>
+<a name="928"><span class="lineNum"> 928 </span> :<span class="lineNoCov"> 0 : depth--;</span></a>
+<a name="929"><span class="lineNum"> 929 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="930"><span class="lineNum"> 930 </span> : : </a>
+<a name="931"><span class="lineNum"> 931 </span> :<span class="lineNoCov"> 0 : case FDT_PROP:</span></a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineNoCov"> 0 : prop = fdt_getprop_by_offset(fdt, offset, &amp;propname,</span></a>
+<a name="933"><span class="lineNum"> 933 </span> : : &amp;err);</a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineNoCov"> 0 : if (!prop)</span></a>
+<a name="935"><span class="lineNum"> 935 </span> :<span class="lineNoCov"> 0 : return err;</span></a>
+<a name="936"><span class="lineNum"> 936 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="937"><span class="lineNum"> 937 </span> : : </a>
+<a name="938"><span class="lineNum"> 938 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_INTERNAL;</span></a>
+<a name="940"><span class="lineNum"> 940 </span> : : }</a>
+<a name="941"><span class="lineNum"> 941 </span> : : }</a>
+<a name="942"><span class="lineNum"> 942 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_strerror.c.func-sort-c.html b/coverage-report/libfdt/fdt_strerror.c.func-sort-c.html
new file mode 100644
index 0000000..60a871b
--- /dev/null
+++ b/coverage-report/libfdt/fdt_strerror.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_strerror.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_strerror.c<span style="font-size: 80%;"> (<a href="fdt_strerror.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="fdt_strerror.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_strerror.c.gcov.html#87">fdt_strerror</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_strerror.c.func.html b/coverage-report/libfdt/fdt_strerror.c.func.html
new file mode 100644
index 0000000..321cc3f
--- /dev/null
+++ b/coverage-report/libfdt/fdt_strerror.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_strerror.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_strerror.c<span style="font-size: 80%;"> (<a href="fdt_strerror.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="fdt_strerror.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_strerror.c.gcov.html#87">fdt_strerror</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_strerror.c.gcov.html b/coverage-report/libfdt/fdt_strerror.c.gcov.html
new file mode 100644
index 0000000..e6f6c6f
--- /dev/null
+++ b/coverage-report/libfdt/fdt_strerror.c.gcov.html
@@ -0,0 +1,188 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_strerror.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_strerror.c<span style="font-size: 80%;"> (source / <a href="fdt_strerror.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryLo">0.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /*</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * libfdt - Flat Device Tree manipulation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright (C) 2006 David Gibson, IBM Corporation.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * libfdt is dual licensed: you can use it either under the terms of</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * the GPL, or the BSD license, at your option.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * a) This library is free software; you can redistribute it and/or</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * modify it under the terms of the GNU General Public License as</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * published by the Free Software Foundation; either version 2 of the</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * License, or (at your option) any later version.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * This library is distributed in the hope that it will be useful,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * GNU General Public License for more details.</a>
+<a name="17"><span class="lineNum"> 17 </span> : : *</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * You should have received a copy of the GNU General Public</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * License along with this library; if not, write to the Free</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * MA 02110-1301 USA</a>
+<a name="22"><span class="lineNum"> 22 </span> : : *</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * Alternatively,</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * b) Redistribution and use in source and binary forms, with or</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * without modification, are permitted provided that the following</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * conditions are met:</a>
+<a name="28"><span class="lineNum"> 28 </span> : : *</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * 1. Redistributions of source code must retain the above</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * disclaimer.</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * 2. Redistributions in binary form must reproduce the above</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * disclaimer in the documentation and/or other materials</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * provided with the distribution.</a>
+<a name="36"><span class="lineNum"> 36 </span> : : *</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</a>
+<a name="50"><span class="lineNum"> 50 </span> : : */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : #include &quot;libfdt_env.h&quot;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : #include &lt;fdt.h&gt;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #include &lt;libfdt.h&gt;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : #include &quot;libfdt_internal.h&quot;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : struct fdt_errtabent {</a>
+<a name="59"><span class="lineNum"> 59 </span> : : const char *str;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : };</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> : : #define FDT_ERRTABENT(val) \</a>
+<a name="63"><span class="lineNum"> 63 </span> : : [(val)] = { .str = #val, }</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : static struct fdt_errtabent fdt_errtable[] = {</a>
+<a name="66"><span class="lineNum"> 66 </span> : : FDT_ERRTABENT(FDT_ERR_NOTFOUND),</a>
+<a name="67"><span class="lineNum"> 67 </span> : : FDT_ERRTABENT(FDT_ERR_EXISTS),</a>
+<a name="68"><span class="lineNum"> 68 </span> : : FDT_ERRTABENT(FDT_ERR_NOSPACE),</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : FDT_ERRTABENT(FDT_ERR_BADOFFSET),</a>
+<a name="71"><span class="lineNum"> 71 </span> : : FDT_ERRTABENT(FDT_ERR_BADPATH),</a>
+<a name="72"><span class="lineNum"> 72 </span> : : FDT_ERRTABENT(FDT_ERR_BADPHANDLE),</a>
+<a name="73"><span class="lineNum"> 73 </span> : : FDT_ERRTABENT(FDT_ERR_BADSTATE),</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : FDT_ERRTABENT(FDT_ERR_TRUNCATED),</a>
+<a name="76"><span class="lineNum"> 76 </span> : : FDT_ERRTABENT(FDT_ERR_BADMAGIC),</a>
+<a name="77"><span class="lineNum"> 77 </span> : : FDT_ERRTABENT(FDT_ERR_BADVERSION),</a>
+<a name="78"><span class="lineNum"> 78 </span> : : FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE),</a>
+<a name="79"><span class="lineNum"> 79 </span> : : FDT_ERRTABENT(FDT_ERR_BADLAYOUT),</a>
+<a name="80"><span class="lineNum"> 80 </span> : : FDT_ERRTABENT(FDT_ERR_INTERNAL),</a>
+<a name="81"><span class="lineNum"> 81 </span> : : FDT_ERRTABENT(FDT_ERR_BADNCELLS),</a>
+<a name="82"><span class="lineNum"> 82 </span> : : FDT_ERRTABENT(FDT_ERR_BADVALUE),</a>
+<a name="83"><span class="lineNum"> 83 </span> : : FDT_ERRTABENT(FDT_ERR_BADOVERLAY),</a>
+<a name="84"><span class="lineNum"> 84 </span> : : FDT_ERRTABENT(FDT_ERR_NOPHANDLES),</a>
+<a name="85"><span class="lineNum"> 85 </span> : : FDT_ERRTABENT(FDT_ERR_BADFLAGS),</a>
+<a name="86"><span class="lineNum"> 86 </span> : : };</a>
+<a name="87"><span class="lineNum"> 87 </span> : : #define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : const char *fdt_strerror(int errval)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : if (errval &gt; 0)</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : return &quot;&lt;valid offset/length&gt;&quot;;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : else if (errval == 0)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : return &quot;&lt;no error&gt;&quot;;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : else if (errval &gt; -FDT_ERRTABSIZE) {</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : const char *s = fdt_errtable[-errval].str;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : if (s)</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : return s;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : }</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : return &quot;&lt;unknown error&gt;&quot;;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_sw.c.func-sort-c.html b/coverage-report/libfdt/fdt_sw.c.func-sort-c.html
new file mode 100644
index 0000000..8962880
--- /dev/null
+++ b/coverage-report/libfdt/fdt_sw.c.func-sort-c.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_sw.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_sw.c<span style="font-size: 80%;"> (<a href="fdt_sw.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">124</td>
+ <td class="headerCovTableEntry">173</td>
+ <td class="headerCovTableEntryLo">71.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="fdt_sw.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#182">fdt_create</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#303">fdt_del_last_string_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#187">fdt_resize</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#148">fdt_create_with_flags</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#372">fdt_finish</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#243">fdt_finish_reservemap</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#223">fdt_add_reservemap_entry</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#78">fdt_sw_probe_memrsv_</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#285">fdt_add_string_</a></td>
+ <td class="coverFnHi">196</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#254">fdt_begin_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#271">fdt_end_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#311">fdt_find_add_string_</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#360">fdt_property</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#328">fdt_property_placeholder</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#122">sw_flags</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#133">fdt_grab_space_</a></td>
+ <td class="coverFnHi">3259</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#104">fdt_sw_probe_struct_</a></td>
+ <td class="coverFnHi">3259</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#56">fdt_sw_probe_</a></td>
+ <td class="coverFnHi">3267</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_sw.c.func.html b/coverage-report/libfdt/fdt_sw.c.func.html
new file mode 100644
index 0000000..f4be3a1
--- /dev/null
+++ b/coverage-report/libfdt/fdt_sw.c.func.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_sw.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_sw.c<span style="font-size: 80%;"> (<a href="fdt_sw.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">124</td>
+ <td class="headerCovTableEntry">173</td>
+ <td class="headerCovTableEntryLo">71.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="fdt_sw.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#223">fdt_add_reservemap_entry</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#285">fdt_add_string_</a></td>
+ <td class="coverFnHi">196</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#254">fdt_begin_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#182">fdt_create</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#148">fdt_create_with_flags</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#303">fdt_del_last_string_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#271">fdt_end_node</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#311">fdt_find_add_string_</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#372">fdt_finish</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#243">fdt_finish_reservemap</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#133">fdt_grab_space_</a></td>
+ <td class="coverFnHi">3259</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#360">fdt_property</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#328">fdt_property_placeholder</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#187">fdt_resize</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#56">fdt_sw_probe_</a></td>
+ <td class="coverFnHi">3267</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#78">fdt_sw_probe_memrsv_</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#104">fdt_sw_probe_struct_</a></td>
+ <td class="coverFnHi">3259</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fdt_sw.c.gcov.html#122">sw_flags</a></td>
+ <td class="coverFnHi">2785</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/fdt_sw.c.gcov.html b/coverage-report/libfdt/fdt_sw.c.gcov.html
new file mode 100644
index 0000000..2c1b34e
--- /dev/null
+++ b/coverage-report/libfdt/fdt_sw.c.gcov.html
@@ -0,0 +1,506 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/fdt_sw.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - fdt_sw.c<span style="font-size: 80%;"> (source / <a href="fdt_sw.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">124</td>
+ <td class="headerCovTableEntry">173</td>
+ <td class="headerCovTableEntryLo">71.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /*</a>
+<a name="2"><span class="lineNum"> 2 </span> : : * libfdt - Flat Device Tree manipulation</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Copyright (C) 2006 David Gibson, IBM Corporation.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * libfdt is dual licensed: you can use it either under the terms of</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * the GPL, or the BSD license, at your option.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * a) This library is free software; you can redistribute it and/or</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * modify it under the terms of the GNU General Public License as</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * published by the Free Software Foundation; either version 2 of the</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * License, or (at your option) any later version.</a>
+<a name="12"><span class="lineNum"> 12 </span> : : *</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * This library is distributed in the hope that it will be useful,</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * GNU General Public License for more details.</a>
+<a name="17"><span class="lineNum"> 17 </span> : : *</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * You should have received a copy of the GNU General Public</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * License along with this library; if not, write to the Free</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * MA 02110-1301 USA</a>
+<a name="22"><span class="lineNum"> 22 </span> : : *</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * Alternatively,</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * b) Redistribution and use in source and binary forms, with or</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * without modification, are permitted provided that the following</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * conditions are met:</a>
+<a name="28"><span class="lineNum"> 28 </span> : : *</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * 1. Redistributions of source code must retain the above</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * disclaimer.</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * 2. Redistributions in binary form must reproduce the above</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * disclaimer in the documentation and/or other materials</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * provided with the distribution.</a>
+<a name="36"><span class="lineNum"> 36 </span> : : *</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</a>
+<a name="50"><span class="lineNum"> 50 </span> : : */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : #include &quot;libfdt_env.h&quot;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : #include &lt;fdt.h&gt;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #include &lt;libfdt.h&gt;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : #include &quot;libfdt_internal.h&quot;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 3267 : static int fdt_sw_probe_(void *fdt)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 3267 : if (fdt_magic(fdt) == FDT_MAGIC)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTATE;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 3267 : else if (fdt_magic(fdt) != FDT_SW_MAGIC)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADMAGIC;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 3267 : return 0;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define FDT_SW_PROBE(fdt) \</a>
+<a name="68"><span class="lineNum"> 68 </span> : : { \</a>
+<a name="69"><span class="lineNum"> 69 </span> : : int err; \</a>
+<a name="70"><span class="lineNum"> 70 </span> : : if ((err = fdt_sw_probe_(fdt)) != 0) \</a>
+<a name="71"><span class="lineNum"> 71 </span> : : return err; \</a>
+<a name="72"><span class="lineNum"> 72 </span> : : }</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* 'memrsv' state: Initial state after fdt_create()</a>
+<a name="75"><span class="lineNum"> 75 </span> : : *</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * Allowed functions:</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * fdt_add_reservmap_entry()</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * fdt_finish_reservemap() [moves to 'struct' state]</a>
+<a name="79"><span class="lineNum"> 79 </span> : : */</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 8 : static int fdt_sw_probe_memrsv_(void *fdt)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : {</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 8 : int err = fdt_sw_probe_(fdt);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 8 : if (err)</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : return err;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 8 : if (fdt_off_dt_strings(fdt) != 0)</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTATE;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 8 : return 0;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : }</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : #define FDT_SW_PROBE_MEMRSV(fdt) \</a>
+<a name="92"><span class="lineNum"> 92 </span> : : { \</a>
+<a name="93"><span class="lineNum"> 93 </span> : : int err; \</a>
+<a name="94"><span class="lineNum"> 94 </span> : : if ((err = fdt_sw_probe_memrsv_(fdt)) != 0) \</a>
+<a name="95"><span class="lineNum"> 95 </span> : : return err; \</a>
+<a name="96"><span class="lineNum"> 96 </span> : : }</a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> : : /* 'struct' state: Enter this state after fdt_finish_reservemap()</a>
+<a name="99"><span class="lineNum"> 99 </span> : : *</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * Allowed functions:</a>
+<a name="101"><span class="lineNum"> 101 </span> : : * fdt_begin_node()</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * fdt_end_node()</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * fdt_property*()</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * fdt_finish() [moves to 'complete' state]</a>
+<a name="105"><span class="lineNum"> 105 </span> : : */</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 3259 : static int fdt_sw_probe_struct_(void *fdt)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 3259 : int err = fdt_sw_probe_(fdt);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 3259 : if (err)</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : return err;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 3259 : if (fdt_off_dt_strings(fdt) != fdt_totalsize(fdt))</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADSTATE;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 3259 : return 0;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : }</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : #define FDT_SW_PROBE_STRUCT(fdt) \</a>
+<a name="118"><span class="lineNum"> 118 </span> : : { \</a>
+<a name="119"><span class="lineNum"> 119 </span> : : int err; \</a>
+<a name="120"><span class="lineNum"> 120 </span> : : if ((err = fdt_sw_probe_struct_(fdt)) != 0) \</a>
+<a name="121"><span class="lineNum"> 121 </span> : : return err; \</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 2785 : static inline uint32_t sw_flags(void *fdt)</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : {</a>
+<a name="126"><span class="lineNum"> 126 </span> : : /* assert: (fdt_magic(fdt) == FDT_SW_MAGIC) */</a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 2785 : return fdt_last_comp_version(fdt);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : }</a>
+<a name="129"><span class="lineNum"> 129 </span> : : </a>
+<a name="130"><span class="lineNum"> 130 </span> : : /* 'complete' state: Enter this state after fdt_finish()</a>
+<a name="131"><span class="lineNum"> 131 </span> : : *</a>
+<a name="132"><span class="lineNum"> 132 </span> : : * Allowed functions: none</a>
+<a name="133"><span class="lineNum"> 133 </span> : : */</a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 3259 : static void *fdt_grab_space_(void *fdt, size_t len)</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : {</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 3259 : int offset = fdt_size_dt_struct(fdt);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : int spaceleft;</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 3259 : spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 3259 : - fdt_size_dt_strings(fdt);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 3259 : if ((offset + len &lt; offset) || (offset + len &gt; spaceleft))</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 3259 : fdt_set_size_dt_struct(fdt, offset + len);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 3259 : return fdt_offset_ptr_w_(fdt, offset);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 2 : int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags)</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : {</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 2 : const size_t hdrsize = FDT_ALIGN(sizeof(struct fdt_header),</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : sizeof(struct fdt_reserve_entry));</a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 2 : void *fdt = buf;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 2 : if (bufsize &lt; hdrsize)</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 2 : if (flags &amp; ~FDT_CREATE_FLAGS_ALL)</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_BADFLAGS;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 2 : memset(buf, 0, bufsize);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> : : /*</a>
+<a name="165"><span class="lineNum"> 165 </span> : : * magic and last_comp_version keep intermediate state during the fdt</a>
+<a name="166"><span class="lineNum"> 166 </span> : : * creation process, which is replaced with the proper FDT format by</a>
+<a name="167"><span class="lineNum"> 167 </span> : : * fdt_finish().</a>
+<a name="168"><span class="lineNum"> 168 </span> : : *</a>
+<a name="169"><span class="lineNum"> 169 </span> : : * flags should be accessed with sw_flags().</a>
+<a name="170"><span class="lineNum"> 170 </span> : : */</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 2 : fdt_set_magic(fdt, FDT_SW_MAGIC);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 2 : fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 2 : fdt_set_last_comp_version(fdt, flags);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 2 : fdt_set_totalsize(fdt, bufsize);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : </a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 2 : fdt_set_off_mem_rsvmap(fdt, hdrsize);</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 2 : fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 2 : fdt_set_off_dt_strings(fdt, 0);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : }</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineNoCov"> 0 : int fdt_create(void *buf, int bufsize)</span></a>
+<a name="185"><span class="lineNum"> 185 </span> : : {</a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : return fdt_create_with_flags(buf, bufsize, 0);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : }</a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : int fdt_resize(void *fdt, void *buf, int bufsize)</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : {</a>
+<a name="191"><span class="lineNum"> 191 </span> : : size_t headsize, tailsize;</a>
+<a name="192"><span class="lineNum"> 192 </span> : : char *oldtail, *newtail;</a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : FDT_SW_PROBE(fdt);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : tailsize = fdt_size_dt_strings(fdt);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : if ((headsize + tailsize) &gt; fdt_totalsize(fdt))</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_INTERNAL;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> : : </a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : if ((headsize + tailsize) &gt; bufsize)</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : newtail = (char *)buf + bufsize - tailsize;</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> : : /* Two cases to avoid clobbering data if the old and new</a>
+<a name="209"><span class="lineNum"> 209 </span> : : * buffers partially overlap */</a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : if (buf &lt;= fdt) {</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : memmove(buf, fdt, headsize);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineNoCov"> 0 : memmove(newtail, oldtail, tailsize);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : } else {</a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : memmove(newtail, oldtail, tailsize);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : memmove(buf, fdt, headsize);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : fdt_set_totalsize(buf, bufsize);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : if (fdt_off_dt_strings(buf))</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : fdt_set_off_dt_strings(buf, bufsize);</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : }</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 8 : int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : {</a>
+<a name="227"><span class="lineNum"> 227 </span> : : struct fdt_reserve_entry *re;</a>
+<a name="228"><span class="lineNum"> 228 </span> : : int offset;</a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 8 : FDT_SW_PROBE_MEMRSV(fdt);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : </a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 8 : offset = fdt_off_dt_struct(fdt);</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 8 : if ((offset + sizeof(*re)) &gt; fdt_totalsize(fdt))</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 8 : re = (struct fdt_reserve_entry *)((char *)fdt + offset);</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 8 : re-&gt;address = cpu_to_fdt64(addr);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 8 : re-&gt;size = cpu_to_fdt64(size);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 8 : fdt_set_off_dt_struct(fdt, offset + sizeof(*re));</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 8 : return 0;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : }</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 2 : int fdt_finish_reservemap(void *fdt)</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : {</a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 2 : int err = fdt_add_reservemap_entry(fdt, 0, 0);</span></a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 2 : if (err)</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : return err;</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 2 : fdt_set_off_dt_strings(fdt, fdt_totalsize(fdt));</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 236 : int fdt_begin_node(void *fdt, const char *name)</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> : : struct fdt_node_header *nh;</a>
+<a name="259"><span class="lineNum"> 259 </span> : : int namelen;</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 236 : FDT_SW_PROBE_STRUCT(fdt);</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : </a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 236 : namelen = strlen(name) + 1;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 236 : nh = fdt_grab_space_(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen));</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 236 : if (! nh)</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 236 : nh-&gt;tag = cpu_to_fdt32(FDT_BEGIN_NODE);</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 236 : memcpy(nh-&gt;name, name, namelen);</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 236 : return 0;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : }</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 236 : int fdt_end_node(void *fdt)</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : {</a>
+<a name="275"><span class="lineNum"> 275 </span> : : fdt32_t *en;</a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 236 : FDT_SW_PROBE_STRUCT(fdt);</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 236 : en = fdt_grab_space_(fdt, FDT_TAGSIZE);</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 236 : if (! en)</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 236 : *en = cpu_to_fdt32(FDT_END_NODE);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 236 : return 0;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 196 : static int fdt_add_string_(void *fdt, const char *s)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : {</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 196 : char *strtab = (char *)fdt + fdt_totalsize(fdt);</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 196 : int strtabsize = fdt_size_dt_strings(fdt);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 196 : int len = strlen(s) + 1;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> : : int struct_top, offset;</a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 196 : offset = -strtabsize - len;</span></a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 196 : struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 196 : if (fdt_totalsize(fdt) + offset &lt; struct_top)</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineNoCov"> 0 : return 0; /* no more room :( */</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 196 : memcpy(strtab + offset, s, len);</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 196 : fdt_set_size_dt_strings(fdt, strtabsize + len);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 196 : return offset;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : }</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> : : /* Must only be used to roll back in case of error */</a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : static void fdt_del_last_string_(void *fdt, const char *s)</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : {</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : int strtabsize = fdt_size_dt_strings(fdt);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : int len = strlen(s) + 1;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : fdt_set_size_dt_strings(fdt, strtabsize - len);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 2785 : static int fdt_find_add_string_(void *fdt, const char *s, int *allocated)</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : {</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 2785 : char *strtab = (char *)fdt + fdt_totalsize(fdt);</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 2785 : int strtabsize = fdt_size_dt_strings(fdt);</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : const char *p;</a>
+<a name="318"><span class="lineNum"> 318 </span> : : </a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 2785 : *allocated = 0;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 2785 : p = fdt_find_string_(strtab - strtabsize, strtabsize, s);</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 2785 : if (p)</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 2589 : return p - strtab;</span></a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 196 : *allocated = 1;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : </a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 196 : return fdt_add_string_(fdt, s);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : }</a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 2785 : int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : {</a>
+<a name="332"><span class="lineNum"> 332 </span> : : struct fdt_property *prop;</a>
+<a name="333"><span class="lineNum"> 333 </span> : : int nameoff;</a>
+<a name="334"><span class="lineNum"> 334 </span> : : int allocated;</a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 2785 : FDT_SW_PROBE_STRUCT(fdt);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : /* String de-duplication can be slow, _NO_NAME_DEDUP skips it */</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 2785 : if (sw_flags(fdt) &amp; FDT_CREATE_FLAG_NO_NAME_DEDUP) {</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : allocated = 1;</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : nameoff = fdt_add_string_(fdt, name);</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : } else {</a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 2785 : nameoff = fdt_find_add_string_(fdt, name, &amp;allocated);</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : }</a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 2785 : if (nameoff == 0)</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 2785 : prop = fdt_grab_space_(fdt, sizeof(*prop) + FDT_TAGALIGN(len));</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 2785 : if (! prop) {</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : if (allocated)</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : fdt_del_last_string_(fdt, name);</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : }</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 2785 : prop-&gt;tag = cpu_to_fdt32(FDT_PROP);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 2785 : prop-&gt;nameoff = cpu_to_fdt32(nameoff);</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 2785 : prop-&gt;len = cpu_to_fdt32(len);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 2785 : *valp = prop-&gt;data;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 2785 : return 0;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : }</a>
+<a name="361"><span class="lineNum"> 361 </span> : : </a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 2785 : int fdt_property(void *fdt, const char *name, const void *val, int len)</span></a>
+<a name="363"><span class="lineNum"> 363 </span> : : {</a>
+<a name="364"><span class="lineNum"> 364 </span> : : void *ptr;</a>
+<a name="365"><span class="lineNum"> 365 </span> : : int ret;</a>
+<a name="366"><span class="lineNum"> 366 </span> : : </a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 2785 : ret = fdt_property_placeholder(fdt, name, len, &amp;ptr);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 2785 : if (ret)</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : return ret;</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 2785 : memcpy(ptr, val, len);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 2785 : return 0;</span></a>
+<a name="372"><span class="lineNum"> 372 </span> : : }</a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 2 : int fdt_finish(void *fdt)</span></a>
+<a name="375"><span class="lineNum"> 375 </span> : : {</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 2 : char *p = (char *)fdt;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : fdt32_t *end;</a>
+<a name="378"><span class="lineNum"> 378 </span> : : int oldstroffset, newstroffset;</a>
+<a name="379"><span class="lineNum"> 379 </span> : : uint32_t tag;</a>
+<a name="380"><span class="lineNum"> 380 </span> : : int offset, nextoffset;</a>
+<a name="381"><span class="lineNum"> 381 </span> : : </a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 2 : FDT_SW_PROBE_STRUCT(fdt);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : </a>
+<a name="384"><span class="lineNum"> 384 </span> : : /* Add terminator */</a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 2 : end = fdt_grab_space_(fdt, sizeof(*end));</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 2 : if (! end)</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : return -FDT_ERR_NOSPACE;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineCov"> 2 : *end = cpu_to_fdt32(FDT_END);</span></a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> : : /* Relocate the string table */</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 2 : oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 2 : newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 2 : memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 2 : fdt_set_off_dt_strings(fdt, newstroffset);</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : </a>
+<a name="396"><span class="lineNum"> 396 </span> : : /* Walk the structure, correcting string offsets */</a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 2 : offset = 0;</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 3259 : while ((tag = fdt_next_tag(fdt, offset, &amp;nextoffset)) != FDT_END) {</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineCov"> 3257 : if (tag == FDT_PROP) {</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : struct fdt_property *prop =</a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 2785 : fdt_offset_ptr_w_(fdt, offset);</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : int nameoff;</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 2785 : nameoff = fdt32_to_cpu(prop-&gt;nameoff);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 2785 : nameoff += fdt_size_dt_strings(fdt);</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 2785 : prop-&gt;nameoff = cpu_to_fdt32(nameoff);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : }</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 3257 : offset = nextoffset;</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : }</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 2 : if (nextoffset &lt; 0)</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : return nextoffset;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> : : /* Finally, adjust the header */</a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 2 : fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> : : /* And fix up fields that were keeping intermediate state. */</a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 2 : fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 2 : fdt_set_magic(fdt, FDT_MAGIC);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : </a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/index-sort-b.html b/coverage-report/libfdt/index-sort-b.html
new file mode 100644
index 0000000..5da8282
--- /dev/null
+++ b/coverage-report/libfdt/index-sort-b.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libfdt</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">262</td>
+ <td class="headerCovTableEntry">845</td>
+ <td class="headerCovTableEntryLo">31.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.4%"><img src="../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">77 / 159</td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">9 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt.h.gcov.html">libfdt.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="68.8%"><img src="../snow.png" width=31 height=10 alt="68.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">68.8&nbsp;%</td>
+ <td class="coverNumLo">22 / 32</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_ro.c.gcov.html">fdt_ro.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=6 height=10 alt="5.9%"><img src="../snow.png" width=94 height=10 alt="5.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">5.9&nbsp;%</td>
+ <td class="coverNumLo">27 / 455</td>
+ <td class="coverPerLo">7.3&nbsp;%</td>
+ <td class="coverNumLo">3 / 41</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_env.h.gcov.html">libfdt_env.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_internal.h.gcov.html">libfdt_internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=50 height=10 alt="50.0%"><img src="../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">4 / 8</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_strerror.c.gcov.html">fdt_strerror.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 10</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_sw.c.gcov.html">fdt_sw.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=72 height=10 alt="71.7%"><img src="../snow.png" width=28 height=10 alt="71.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.7&nbsp;%</td>
+ <td class="coverNumLo">124 / 173</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">15 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/index-sort-f.html b/coverage-report/libfdt/index-sort-f.html
new file mode 100644
index 0000000..84b43c7
--- /dev/null
+++ b/coverage-report/libfdt/index-sort-f.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libfdt</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">262</td>
+ <td class="headerCovTableEntry">845</td>
+ <td class="headerCovTableEntryLo">31.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_strerror.c.gcov.html">fdt_strerror.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 10</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_ro.c.gcov.html">fdt_ro.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=6 height=10 alt="5.9%"><img src="../snow.png" width=94 height=10 alt="5.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">5.9&nbsp;%</td>
+ <td class="coverNumLo">27 / 455</td>
+ <td class="coverPerLo">7.3&nbsp;%</td>
+ <td class="coverNumLo">3 / 41</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.4%"><img src="../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">77 / 159</td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">9 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_internal.h.gcov.html">libfdt_internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=50 height=10 alt="50.0%"><img src="../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">4 / 8</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_sw.c.gcov.html">fdt_sw.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=72 height=10 alt="71.7%"><img src="../snow.png" width=28 height=10 alt="71.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.7&nbsp;%</td>
+ <td class="coverNumLo">124 / 173</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">15 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt.h.gcov.html">libfdt.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="68.8%"><img src="../snow.png" width=31 height=10 alt="68.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">68.8&nbsp;%</td>
+ <td class="coverNumLo">22 / 32</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_env.h.gcov.html">libfdt_env.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/index-sort-l.html b/coverage-report/libfdt/index-sort-l.html
new file mode 100644
index 0000000..c4a3081
--- /dev/null
+++ b/coverage-report/libfdt/index-sort-l.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libfdt</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">262</td>
+ <td class="headerCovTableEntry">845</td>
+ <td class="headerCovTableEntryLo">31.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_strerror.c.gcov.html">fdt_strerror.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 10</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_ro.c.gcov.html">fdt_ro.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=6 height=10 alt="5.9%"><img src="../snow.png" width=94 height=10 alt="5.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">5.9&nbsp;%</td>
+ <td class="coverNumLo">27 / 455</td>
+ <td class="coverPerLo">7.3&nbsp;%</td>
+ <td class="coverNumLo">3 / 41</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.4%"><img src="../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">77 / 159</td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">9 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_internal.h.gcov.html">libfdt_internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=50 height=10 alt="50.0%"><img src="../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">4 / 8</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt.h.gcov.html">libfdt.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="68.8%"><img src="../snow.png" width=31 height=10 alt="68.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">68.8&nbsp;%</td>
+ <td class="coverNumLo">22 / 32</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_sw.c.gcov.html">fdt_sw.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=72 height=10 alt="71.7%"><img src="../snow.png" width=28 height=10 alt="71.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.7&nbsp;%</td>
+ <td class="coverNumLo">124 / 173</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">15 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_env.h.gcov.html">libfdt_env.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/index.html b/coverage-report/libfdt/index.html
new file mode 100644
index 0000000..9c81267
--- /dev/null
+++ b/coverage-report/libfdt/index.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libfdt</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">262</td>
+ <td class="headerCovTableEntry">845</td>
+ <td class="headerCovTableEntryLo">31.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">46</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt.c.gcov.html">fdt.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.4%"><img src="../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">77 / 159</td>
+ <td class="coverPerLo">64.3&nbsp;%</td>
+ <td class="coverNumLo">9 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_ro.c.gcov.html">fdt_ro.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=6 height=10 alt="5.9%"><img src="../snow.png" width=94 height=10 alt="5.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">5.9&nbsp;%</td>
+ <td class="coverNumLo">27 / 455</td>
+ <td class="coverPerLo">7.3&nbsp;%</td>
+ <td class="coverNumLo">3 / 41</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_strerror.c.gcov.html">fdt_strerror.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../snow.png" width=100 height=10 alt="0.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 10</td>
+ <td class="coverPerLo">0.0&nbsp;%</td>
+ <td class="coverNumLo">0 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fdt_sw.c.gcov.html">fdt_sw.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=72 height=10 alt="71.7%"><img src="../snow.png" width=28 height=10 alt="71.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">71.7&nbsp;%</td>
+ <td class="coverNumLo">124 / 173</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">15 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt.h.gcov.html">libfdt.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=69 height=10 alt="68.8%"><img src="../snow.png" width=31 height=10 alt="68.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">68.8&nbsp;%</td>
+ <td class="coverNumLo">22 / 32</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_env.h.gcov.html">libfdt_env.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8 / 8</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libfdt_internal.h.gcov.html">libfdt_internal.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=50 height=10 alt="50.0%"><img src="../snow.png" width=50 height=10 alt="50.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">50.0&nbsp;%</td>
+ <td class="coverNumLo">4 / 8</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt.h.func-sort-c.html b/coverage-report/libfdt/libfdt.h.func-sort-c.html
new file mode 100644
index 0000000..e47273a
--- /dev/null
+++ b/coverage-report/libfdt/libfdt.h.func-sort-c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt.h<span style="font-size: 80%;"> (<a href="libfdt.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">68.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libfdt.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#190">fdt64_ld</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#300">fdt_set_off_mem_rsvmap</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#301">fdt_set_version</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#302">fdt_set_last_comp_version</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#296">fdt_set_magic</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#297">fdt_set_totalsize</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#299">fdt_set_off_dt_strings</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#298">fdt_set_off_dt_struct</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#313">fdt_header_size</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#304">fdt_set_size_dt_strings</a></td>
+ <td class="coverFnHi">196</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#1490">fdt_property_cell</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#1478">fdt_property_u32</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#305">fdt_set_size_dt_struct</a></td>
+ <td class="coverFnHi">3259</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#170">fdt32_ld</a></td>
+ <td class="coverFnHi">118942</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt.h.func.html b/coverage-report/libfdt/libfdt.h.func.html
new file mode 100644
index 0000000..bc6deeb
--- /dev/null
+++ b/coverage-report/libfdt/libfdt.h.func.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt.h<span style="font-size: 80%;"> (<a href="libfdt.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">68.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libfdt.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#170">fdt32_ld</a></td>
+ <td class="coverFnHi">118942</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#190">fdt64_ld</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#313">fdt_header_size</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#1490">fdt_property_cell</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#1478">fdt_property_u32</a></td>
+ <td class="coverFnHi">236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#302">fdt_set_last_comp_version</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#296">fdt_set_magic</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#299">fdt_set_off_dt_strings</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#298">fdt_set_off_dt_struct</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#300">fdt_set_off_mem_rsvmap</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#304">fdt_set_size_dt_strings</a></td>
+ <td class="coverFnHi">196</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#305">fdt_set_size_dt_struct</a></td>
+ <td class="coverFnHi">3259</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#297">fdt_set_totalsize</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt.h.gcov.html#301">fdt_set_version</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt.h.gcov.html b/coverage-report/libfdt/libfdt.h.gcov.html
new file mode 100644
index 0000000..6de54f2
--- /dev/null
+++ b/coverage-report/libfdt/libfdt.h.gcov.html
@@ -0,0 +1,2201 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt.h<span style="font-size: 80%;"> (source / <a href="libfdt.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">32</td>
+ <td class="headerCovTableEntryLo">68.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #ifndef LIBFDT_H</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #define LIBFDT_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : /*</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * libfdt - Flat Device Tree manipulation</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright (C) 2006 David Gibson, IBM Corporation.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : *</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * libfdt is dual licensed: you can use it either under the terms of</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * the GPL, or the BSD license, at your option.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : *</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * a) This library is free software; you can redistribute it and/or</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * modify it under the terms of the GNU General Public License as</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * published by the Free Software Foundation; either version 2 of the</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * License, or (at your option) any later version.</a>
+<a name="14"><span class="lineNum"> 14 </span> : : *</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * This library is distributed in the hope that it will be useful,</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * GNU General Public License for more details.</a>
+<a name="19"><span class="lineNum"> 19 </span> : : *</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * You should have received a copy of the GNU General Public</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * License along with this library; if not, write to the Free</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * MA 02110-1301 USA</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * Alternatively,</a>
+<a name="26"><span class="lineNum"> 26 </span> : : *</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * b) Redistribution and use in source and binary forms, with or</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * without modification, are permitted provided that the following</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * conditions are met:</a>
+<a name="30"><span class="lineNum"> 30 </span> : : *</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * 1. Redistributions of source code must retain the above</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * disclaimer.</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * 2. Redistributions in binary form must reproduce the above</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * disclaimer in the documentation and/or other materials</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * provided with the distribution.</a>
+<a name="38"><span class="lineNum"> 38 </span> : : *</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</a>
+<a name="52"><span class="lineNum"> 52 </span> : : */</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : #include &lt;libfdt_env.h&gt;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : #include &lt;fdt.h&gt;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> : : #define FDT_FIRST_SUPPORTED_VERSION 0x02</a>
+<a name="58"><span class="lineNum"> 58 </span> : : #define FDT_LAST_SUPPORTED_VERSION 0x11</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> : : /* Error codes: informative error codes */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : #define FDT_ERR_NOTFOUND 1</a>
+<a name="62"><span class="lineNum"> 62 </span> : : /* FDT_ERR_NOTFOUND: The requested node or property does not exist */</a>
+<a name="63"><span class="lineNum"> 63 </span> : : #define FDT_ERR_EXISTS 2</a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* FDT_ERR_EXISTS: Attempted to create a node or property which</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * already exists */</a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define FDT_ERR_NOSPACE 3</a>
+<a name="67"><span class="lineNum"> 67 </span> : : /* FDT_ERR_NOSPACE: Operation needed to expand the device</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * tree, but its buffer did not have sufficient space to</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * contain the expanded tree. Use fdt_open_into() to move the</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * device tree to a buffer with more space. */</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : /* Error codes: codes for bad parameters */</a>
+<a name="73"><span class="lineNum"> 73 </span> : : #define FDT_ERR_BADOFFSET 4</a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* FDT_ERR_BADOFFSET: Function was passed a structure block</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * offset which is out-of-bounds, or which points to an</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * unsuitable part of the structure for the operation. */</a>
+<a name="77"><span class="lineNum"> 77 </span> : : #define FDT_ERR_BADPATH 5</a>
+<a name="78"><span class="lineNum"> 78 </span> : : /* FDT_ERR_BADPATH: Function was passed a badly formatted path</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * (e.g. missing a leading / for a function which requires an</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * absolute path) */</a>
+<a name="81"><span class="lineNum"> 81 </span> : : #define FDT_ERR_BADPHANDLE 6</a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle.</a>
+<a name="83"><span class="lineNum"> 83 </span> : : * This can be caused either by an invalid phandle property</a>
+<a name="84"><span class="lineNum"> 84 </span> : : * length, or the phandle value was either 0 or -1, which are</a>
+<a name="85"><span class="lineNum"> 85 </span> : : * not permitted. */</a>
+<a name="86"><span class="lineNum"> 86 </span> : : #define FDT_ERR_BADSTATE 7</a>
+<a name="87"><span class="lineNum"> 87 </span> : : /* FDT_ERR_BADSTATE: Function was passed an incomplete device</a>
+<a name="88"><span class="lineNum"> 88 </span> : : * tree created by the sequential-write functions, which is</a>
+<a name="89"><span class="lineNum"> 89 </span> : : * not sufficiently complete for the requested operation. */</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : /* Error codes: codes for bad device tree blobs */</a>
+<a name="92"><span class="lineNum"> 92 </span> : : #define FDT_ERR_TRUNCATED 8</a>
+<a name="93"><span class="lineNum"> 93 </span> : : /* FDT_ERR_TRUNCATED: FDT or a sub-block is improperly</a>
+<a name="94"><span class="lineNum"> 94 </span> : : * terminated (overflows, goes outside allowed bounds, or</a>
+<a name="95"><span class="lineNum"> 95 </span> : : * isn't properly terminated). */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : #define FDT_ERR_BADMAGIC 9</a>
+<a name="97"><span class="lineNum"> 97 </span> : : /* FDT_ERR_BADMAGIC: Given &quot;device tree&quot; appears not to be a</a>
+<a name="98"><span class="lineNum"> 98 </span> : : * device tree at all - it is missing the flattened device</a>
+<a name="99"><span class="lineNum"> 99 </span> : : * tree magic number. */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : #define FDT_ERR_BADVERSION 10</a>
+<a name="101"><span class="lineNum"> 101 </span> : : /* FDT_ERR_BADVERSION: Given device tree has a version which</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * can't be handled by the requested operation. For</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * read-write functions, this may mean that fdt_open_into() is</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * required to convert the tree to the expected version. */</a>
+<a name="105"><span class="lineNum"> 105 </span> : : #define FDT_ERR_BADSTRUCTURE 11</a>
+<a name="106"><span class="lineNum"> 106 </span> : : /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt</a>
+<a name="107"><span class="lineNum"> 107 </span> : : * structure block or other serious error (e.g. misnested</a>
+<a name="108"><span class="lineNum"> 108 </span> : : * nodes, or subnodes preceding properties). */</a>
+<a name="109"><span class="lineNum"> 109 </span> : : #define FDT_ERR_BADLAYOUT 12</a>
+<a name="110"><span class="lineNum"> 110 </span> : : /* FDT_ERR_BADLAYOUT: For read-write functions, the given</a>
+<a name="111"><span class="lineNum"> 111 </span> : : * device tree has it's sub-blocks in an order that the</a>
+<a name="112"><span class="lineNum"> 112 </span> : : * function can't handle (memory reserve map, then structure,</a>
+<a name="113"><span class="lineNum"> 113 </span> : : * then strings). Use fdt_open_into() to reorganize the tree</a>
+<a name="114"><span class="lineNum"> 114 </span> : : * into a form suitable for the read-write operations. */</a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* &quot;Can't happen&quot; error indicating a bug in libfdt */</a>
+<a name="117"><span class="lineNum"> 117 </span> : : #define FDT_ERR_INTERNAL 13</a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.</a>
+<a name="119"><span class="lineNum"> 119 </span> : : * Should never be returned, if it is, it indicates a bug in</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * libfdt itself. */</a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : /* Errors in device tree content */</a>
+<a name="123"><span class="lineNum"> 123 </span> : : #define FDT_ERR_BADNCELLS 14</a>
+<a name="124"><span class="lineNum"> 124 </span> : : /* FDT_ERR_BADNCELLS: Device tree has a #address-cells, #size-cells</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * or similar property with a bad format or value */</a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> : : #define FDT_ERR_BADVALUE 15</a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* FDT_ERR_BADVALUE: Device tree has a property with an unexpected</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * value. For example: a property expected to contain a string list</a>
+<a name="130"><span class="lineNum"> 130 </span> : : * is not NUL-terminated within the length of its value. */</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : #define FDT_ERR_BADOVERLAY 16</a>
+<a name="133"><span class="lineNum"> 133 </span> : : /* FDT_ERR_BADOVERLAY: The device tree overlay, while</a>
+<a name="134"><span class="lineNum"> 134 </span> : : * correctly structured, cannot be applied due to some</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * unexpected or missing value, property or node. */</a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> : : #define FDT_ERR_NOPHANDLES 17</a>
+<a name="138"><span class="lineNum"> 138 </span> : : /* FDT_ERR_NOPHANDLES: The device tree doesn't have any</a>
+<a name="139"><span class="lineNum"> 139 </span> : : * phandle available anymore without causing an overflow */</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : #define FDT_ERR_BADFLAGS 18</a>
+<a name="142"><span class="lineNum"> 142 </span> : : /* FDT_ERR_BADFLAGS: The function was passed a flags field that</a>
+<a name="143"><span class="lineNum"> 143 </span> : : * contains invalid flags or an invalid combination of flags. */</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : #define FDT_ERR_MAX 18</a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> : : /* constants */</a>
+<a name="148"><span class="lineNum"> 148 </span> : : #define FDT_MAX_PHANDLE 0xfffffffe</a>
+<a name="149"><span class="lineNum"> 149 </span> : : /* Valid values for phandles range from 1 to 2^32-2. */</a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /**********************************************************************/</a>
+<a name="152"><span class="lineNum"> 152 </span> : : /* Low-level functions (you probably don't need these) */</a>
+<a name="153"><span class="lineNum"> 153 </span> : : /**********************************************************************/</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> : : #ifndef SWIG /* This function is not useful in Python */</a>
+<a name="156"><span class="lineNum"> 156 </span> : : const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);</a>
+<a name="157"><span class="lineNum"> 157 </span> : : #endif</a>
+<a name="158"><span class="lineNum"> 158 </span> : : static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)</a>
+<a name="159"><span class="lineNum"> 159 </span> : : {</a>
+<a name="160"><span class="lineNum"> 160 </span> : : return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);</a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);</a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /*</a>
+<a name="166"><span class="lineNum"> 166 </span> : : * Alignment helpers:</a>
+<a name="167"><span class="lineNum"> 167 </span> : : * These helpers access words from a device tree blob. They're</a>
+<a name="168"><span class="lineNum"> 168 </span> : : * built to work even with unaligned pointers on platforms (ike</a>
+<a name="169"><span class="lineNum"> 169 </span> : : * ARM) that don't like unaligned loads and stores</a>
+<a name="170"><span class="lineNum"> 170 </span> : : */</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 118942 : static inline uint32_t fdt32_ld(const fdt32_t *p)</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : {</a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 118942 : const uint8_t *bp = (const uint8_t *)p;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 118942 : return ((uint32_t)bp[0] &lt;&lt; 24)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 118942 : | ((uint32_t)bp[1] &lt;&lt; 16)</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 118942 : | ((uint32_t)bp[2] &lt;&lt; 8)</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 118942 : | bp[3];</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : }</a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> : : static inline void fdt32_st(void *property, uint32_t value)</a>
+<a name="183"><span class="lineNum"> 183 </span> : : {</a>
+<a name="184"><span class="lineNum"> 184 </span> : : uint8_t *bp = property;</a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> : : bp[0] = value &gt;&gt; 24;</a>
+<a name="187"><span class="lineNum"> 187 </span> : : bp[1] = (value &gt;&gt; 16) &amp; 0xff;</a>
+<a name="188"><span class="lineNum"> 188 </span> : : bp[2] = (value &gt;&gt; 8) &amp; 0xff;</a>
+<a name="189"><span class="lineNum"> 189 </span> : : bp[3] = value &amp; 0xff;</a>
+<a name="190"><span class="lineNum"> 190 </span> : : }</a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : static inline uint64_t fdt64_ld(const fdt64_t *p)</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : {</a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : const uint8_t *bp = (const uint8_t *)p;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : return ((uint64_t)bp[0] &lt;&lt; 56)</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : | ((uint64_t)bp[1] &lt;&lt; 48)</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : | ((uint64_t)bp[2] &lt;&lt; 40)</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : | ((uint64_t)bp[3] &lt;&lt; 32)</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : | ((uint64_t)bp[4] &lt;&lt; 24)</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : | ((uint64_t)bp[5] &lt;&lt; 16)</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : | ((uint64_t)bp[6] &lt;&lt; 8)</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : | bp[7];</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> : : static inline void fdt64_st(void *property, uint64_t value)</a>
+<a name="207"><span class="lineNum"> 207 </span> : : {</a>
+<a name="208"><span class="lineNum"> 208 </span> : : uint8_t *bp = property;</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> : : bp[0] = value &gt;&gt; 56;</a>
+<a name="211"><span class="lineNum"> 211 </span> : : bp[1] = (value &gt;&gt; 48) &amp; 0xff;</a>
+<a name="212"><span class="lineNum"> 212 </span> : : bp[2] = (value &gt;&gt; 40) &amp; 0xff;</a>
+<a name="213"><span class="lineNum"> 213 </span> : : bp[3] = (value &gt;&gt; 32) &amp; 0xff;</a>
+<a name="214"><span class="lineNum"> 214 </span> : : bp[4] = (value &gt;&gt; 24) &amp; 0xff;</a>
+<a name="215"><span class="lineNum"> 215 </span> : : bp[5] = (value &gt;&gt; 16) &amp; 0xff;</a>
+<a name="216"><span class="lineNum"> 216 </span> : : bp[6] = (value &gt;&gt; 8) &amp; 0xff;</a>
+<a name="217"><span class="lineNum"> 217 </span> : : bp[7] = value &amp; 0xff;</a>
+<a name="218"><span class="lineNum"> 218 </span> : : }</a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> : : /**********************************************************************/</a>
+<a name="221"><span class="lineNum"> 221 </span> : : /* Traversal functions */</a>
+<a name="222"><span class="lineNum"> 222 </span> : : /**********************************************************************/</a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> : : int fdt_next_node(const void *fdt, int offset, int *depth);</a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> : : /**</a>
+<a name="227"><span class="lineNum"> 227 </span> : : * fdt_first_subnode() - get offset of first direct subnode</a>
+<a name="228"><span class="lineNum"> 228 </span> : : *</a>
+<a name="229"><span class="lineNum"> 229 </span> : : * @fdt: FDT blob</a>
+<a name="230"><span class="lineNum"> 230 </span> : : * @offset: Offset of node to check</a>
+<a name="231"><span class="lineNum"> 231 </span> : : * @return offset of first subnode, or -FDT_ERR_NOTFOUND if there is none</a>
+<a name="232"><span class="lineNum"> 232 </span> : : */</a>
+<a name="233"><span class="lineNum"> 233 </span> : : int fdt_first_subnode(const void *fdt, int offset);</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> : : /**</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * fdt_next_subnode() - get offset of next direct subnode</a>
+<a name="237"><span class="lineNum"> 237 </span> : : *</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * After first calling fdt_first_subnode(), call this function repeatedly to</a>
+<a name="239"><span class="lineNum"> 239 </span> : : * get direct subnodes of a parent node.</a>
+<a name="240"><span class="lineNum"> 240 </span> : : *</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * @fdt: FDT blob</a>
+<a name="242"><span class="lineNum"> 242 </span> : : * @offset: Offset of previous subnode</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * @return offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more</a>
+<a name="244"><span class="lineNum"> 244 </span> : : * subnodes</a>
+<a name="245"><span class="lineNum"> 245 </span> : : */</a>
+<a name="246"><span class="lineNum"> 246 </span> : : int fdt_next_subnode(const void *fdt, int offset);</a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> : : /**</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * fdt_for_each_subnode - iterate over all subnodes of a parent</a>
+<a name="250"><span class="lineNum"> 250 </span> : : *</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * @node: child node (int, lvalue)</a>
+<a name="252"><span class="lineNum"> 252 </span> : : * @fdt: FDT blob (const void *)</a>
+<a name="253"><span class="lineNum"> 253 </span> : : * @parent: parent node (int)</a>
+<a name="254"><span class="lineNum"> 254 </span> : : *</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * This is actually a wrapper around a for loop and would be used like so:</a>
+<a name="256"><span class="lineNum"> 256 </span> : : *</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * fdt_for_each_subnode(node, fdt, parent) {</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * Use node</a>
+<a name="259"><span class="lineNum"> 259 </span> : : * ...</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * }</a>
+<a name="261"><span class="lineNum"> 261 </span> : : *</a>
+<a name="262"><span class="lineNum"> 262 </span> : : * if ((node &lt; 0) &amp;&amp; (node != -FDT_ERR_NOTFOUND)) {</a>
+<a name="263"><span class="lineNum"> 263 </span> : : * Error handling</a>
+<a name="264"><span class="lineNum"> 264 </span> : : * }</a>
+<a name="265"><span class="lineNum"> 265 </span> : : *</a>
+<a name="266"><span class="lineNum"> 266 </span> : : * Note that this is implemented as a macro and @node is used as</a>
+<a name="267"><span class="lineNum"> 267 </span> : : * iterator in the loop. The parent variable be constant or even a</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * literal.</a>
+<a name="269"><span class="lineNum"> 269 </span> : : *</a>
+<a name="270"><span class="lineNum"> 270 </span> : : */</a>
+<a name="271"><span class="lineNum"> 271 </span> : : #define fdt_for_each_subnode(node, fdt, parent) \</a>
+<a name="272"><span class="lineNum"> 272 </span> : : for (node = fdt_first_subnode(fdt, parent); \</a>
+<a name="273"><span class="lineNum"> 273 </span> : : node &gt;= 0; \</a>
+<a name="274"><span class="lineNum"> 274 </span> : : node = fdt_next_subnode(fdt, node))</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> : : /**********************************************************************/</a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* General functions */</a>
+<a name="278"><span class="lineNum"> 278 </span> : : /**********************************************************************/</a>
+<a name="279"><span class="lineNum"> 279 </span> : : #define fdt_get_header(fdt, field) \</a>
+<a name="280"><span class="lineNum"> 280 </span> : : (fdt32_ld(&amp;((const struct fdt_header *)(fdt))-&gt;field))</a>
+<a name="281"><span class="lineNum"> 281 </span> : : #define fdt_magic(fdt) (fdt_get_header(fdt, magic))</a>
+<a name="282"><span class="lineNum"> 282 </span> : : #define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize))</a>
+<a name="283"><span class="lineNum"> 283 </span> : : #define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct))</a>
+<a name="284"><span class="lineNum"> 284 </span> : : #define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings))</a>
+<a name="285"><span class="lineNum"> 285 </span> : : #define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap))</a>
+<a name="286"><span class="lineNum"> 286 </span> : : #define fdt_version(fdt) (fdt_get_header(fdt, version))</a>
+<a name="287"><span class="lineNum"> 287 </span> : : #define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version))</a>
+<a name="288"><span class="lineNum"> 288 </span> : : #define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys))</a>
+<a name="289"><span class="lineNum"> 289 </span> : : #define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings))</a>
+<a name="290"><span class="lineNum"> 290 </span> : : #define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct))</a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> : : #define fdt_set_hdr_(name) \</a>
+<a name="293"><span class="lineNum"> 293 </span> : : static inline void fdt_set_##name(void *fdt, uint32_t val) \</a>
+<a name="294"><span class="lineNum"> 294 </span> : : { \</a>
+<a name="295"><span class="lineNum"> 295 </span> : : struct fdt_header *fdth = (struct fdt_header *)fdt; \</a>
+<a name="296"><span class="lineNum"> 296 </span> : : fdth-&gt;name = cpu_to_fdt32(val); \</a>
+<a name="297"><span class="lineNum"> 297 </span> : : }</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 4 : fdt_set_hdr_(magic);</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 4 : fdt_set_hdr_(totalsize);</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 10 : fdt_set_hdr_(off_dt_struct);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 6 : fdt_set_hdr_(off_dt_strings);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 2 : fdt_set_hdr_(off_mem_rsvmap);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 2 : fdt_set_hdr_(version);</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 4 : fdt_set_hdr_(last_comp_version);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : fdt_set_hdr_(boot_cpuid_phys);</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 196 : fdt_set_hdr_(size_dt_strings);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 3259 : fdt_set_hdr_(size_dt_struct);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : #undef fdt_set_hdr_</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> : : /**</a>
+<a name="311"><span class="lineNum"> 311 </span> : : * fdt_header_size - return the size of the tree's header</a>
+<a name="312"><span class="lineNum"> 312 </span> : : * @fdt: pointer to a flattened device tree</a>
+<a name="313"><span class="lineNum"> 313 </span> : : */</a>
+<a name="314"><span class="lineNum"> 314 </span> : : size_t fdt_header_size_(uint32_t version);</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 11 : static inline size_t fdt_header_size(const void *fdt)</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : {</a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 11 : return fdt_header_size_(fdt_version(fdt));</span></a>
+<a name="318"><span class="lineNum"> 318 </span> : : }</a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> : : /**</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * fdt_check_header - sanity check a device tree header</a>
+<a name="322"><span class="lineNum"> 322 </span> : : </a>
+<a name="323"><span class="lineNum"> 323 </span> : : * @fdt: pointer to data which might be a flattened device tree</a>
+<a name="324"><span class="lineNum"> 324 </span> : : *</a>
+<a name="325"><span class="lineNum"> 325 </span> : : * fdt_check_header() checks that the given buffer contains what</a>
+<a name="326"><span class="lineNum"> 326 </span> : : * appears to be a flattened device tree, and that the header contains</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * valid information (to the extent that can be determined from the</a>
+<a name="328"><span class="lineNum"> 328 </span> : : * header alone).</a>
+<a name="329"><span class="lineNum"> 329 </span> : : *</a>
+<a name="330"><span class="lineNum"> 330 </span> : : * returns:</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * 0, if the buffer appears to contain a valid device tree</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * -FDT_ERR_TRUNCATED, standard meanings, as above</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> : : int fdt_check_header(const void *fdt);</a>
+<a name="338"><span class="lineNum"> 338 </span> : : </a>
+<a name="339"><span class="lineNum"> 339 </span> : : /**</a>
+<a name="340"><span class="lineNum"> 340 </span> : : * fdt_move - move a device tree around in memory</a>
+<a name="341"><span class="lineNum"> 341 </span> : : * @fdt: pointer to the device tree to move</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * @buf: pointer to memory where the device is to be moved</a>
+<a name="343"><span class="lineNum"> 343 </span> : : * @bufsize: size of the memory space at buf</a>
+<a name="344"><span class="lineNum"> 344 </span> : : *</a>
+<a name="345"><span class="lineNum"> 345 </span> : : * fdt_move() relocates, if possible, the device tree blob located at</a>
+<a name="346"><span class="lineNum"> 346 </span> : : * fdt to the buffer at buf of size bufsize. The buffer may overlap</a>
+<a name="347"><span class="lineNum"> 347 </span> : : * with the existing device tree blob at fdt. Therefore,</a>
+<a name="348"><span class="lineNum"> 348 </span> : : * fdt_move(fdt, fdt, fdt_totalsize(fdt))</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * should always succeed.</a>
+<a name="350"><span class="lineNum"> 350 </span> : : *</a>
+<a name="351"><span class="lineNum"> 351 </span> : : * returns:</a>
+<a name="352"><span class="lineNum"> 352 </span> : : * 0, on success</a>
+<a name="353"><span class="lineNum"> 353 </span> : : * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree</a>
+<a name="354"><span class="lineNum"> 354 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="355"><span class="lineNum"> 355 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="356"><span class="lineNum"> 356 </span> : : * -FDT_ERR_BADSTATE, standard meanings</a>
+<a name="357"><span class="lineNum"> 357 </span> : : */</a>
+<a name="358"><span class="lineNum"> 358 </span> : : int fdt_move(const void *fdt, void *buf, int bufsize);</a>
+<a name="359"><span class="lineNum"> 359 </span> : : </a>
+<a name="360"><span class="lineNum"> 360 </span> : : /**********************************************************************/</a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Read-only functions */</a>
+<a name="362"><span class="lineNum"> 362 </span> : : /**********************************************************************/</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> : : int fdt_check_full(const void *fdt, size_t bufsize);</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> : : /**</a>
+<a name="367"><span class="lineNum"> 367 </span> : : * fdt_get_string - retrieve a string from the strings block of a device tree</a>
+<a name="368"><span class="lineNum"> 368 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="369"><span class="lineNum"> 369 </span> : : * @stroffset: offset of the string within the strings block (native endian)</a>
+<a name="370"><span class="lineNum"> 370 </span> : : * @lenp: optional pointer to return the string's length</a>
+<a name="371"><span class="lineNum"> 371 </span> : : *</a>
+<a name="372"><span class="lineNum"> 372 </span> : : * fdt_get_string() retrieves a pointer to a single string from the</a>
+<a name="373"><span class="lineNum"> 373 </span> : : * strings block of the device tree blob at fdt, and optionally also</a>
+<a name="374"><span class="lineNum"> 374 </span> : : * returns the string's length in *lenp.</a>
+<a name="375"><span class="lineNum"> 375 </span> : : *</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * returns:</a>
+<a name="377"><span class="lineNum"> 377 </span> : : * a pointer to the string, on success</a>
+<a name="378"><span class="lineNum"> 378 </span> : : * NULL, if stroffset is out of bounds, or doesn't point to a valid string</a>
+<a name="379"><span class="lineNum"> 379 </span> : : */</a>
+<a name="380"><span class="lineNum"> 380 </span> : : const char *fdt_get_string(const void *fdt, int stroffset, int *lenp);</a>
+<a name="381"><span class="lineNum"> 381 </span> : : </a>
+<a name="382"><span class="lineNum"> 382 </span> : : /**</a>
+<a name="383"><span class="lineNum"> 383 </span> : : * fdt_string - retrieve a string from the strings block of a device tree</a>
+<a name="384"><span class="lineNum"> 384 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="385"><span class="lineNum"> 385 </span> : : * @stroffset: offset of the string within the strings block (native endian)</a>
+<a name="386"><span class="lineNum"> 386 </span> : : *</a>
+<a name="387"><span class="lineNum"> 387 </span> : : * fdt_string() retrieves a pointer to a single string from the</a>
+<a name="388"><span class="lineNum"> 388 </span> : : * strings block of the device tree blob at fdt.</a>
+<a name="389"><span class="lineNum"> 389 </span> : : *</a>
+<a name="390"><span class="lineNum"> 390 </span> : : * returns:</a>
+<a name="391"><span class="lineNum"> 391 </span> : : * a pointer to the string, on success</a>
+<a name="392"><span class="lineNum"> 392 </span> : : * NULL, if stroffset is out of bounds, or doesn't point to a valid string</a>
+<a name="393"><span class="lineNum"> 393 </span> : : */</a>
+<a name="394"><span class="lineNum"> 394 </span> : : const char *fdt_string(const void *fdt, int stroffset);</a>
+<a name="395"><span class="lineNum"> 395 </span> : : </a>
+<a name="396"><span class="lineNum"> 396 </span> : : /**</a>
+<a name="397"><span class="lineNum"> 397 </span> : : * fdt_find_max_phandle - find and return the highest phandle in a tree</a>
+<a name="398"><span class="lineNum"> 398 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="399"><span class="lineNum"> 399 </span> : : * @phandle: return location for the highest phandle value found in the tree</a>
+<a name="400"><span class="lineNum"> 400 </span> : : *</a>
+<a name="401"><span class="lineNum"> 401 </span> : : * fdt_find_max_phandle() finds the highest phandle value in the given device</a>
+<a name="402"><span class="lineNum"> 402 </span> : : * tree. The value returned in @phandle is only valid if the function returns</a>
+<a name="403"><span class="lineNum"> 403 </span> : : * success.</a>
+<a name="404"><span class="lineNum"> 404 </span> : : *</a>
+<a name="405"><span class="lineNum"> 405 </span> : : * returns:</a>
+<a name="406"><span class="lineNum"> 406 </span> : : * 0 on success or a negative error code on failure</a>
+<a name="407"><span class="lineNum"> 407 </span> : : */</a>
+<a name="408"><span class="lineNum"> 408 </span> : : int fdt_find_max_phandle(const void *fdt, uint32_t *phandle);</a>
+<a name="409"><span class="lineNum"> 409 </span> : : </a>
+<a name="410"><span class="lineNum"> 410 </span> : : /**</a>
+<a name="411"><span class="lineNum"> 411 </span> : : * fdt_get_max_phandle - retrieves the highest phandle in a tree</a>
+<a name="412"><span class="lineNum"> 412 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="413"><span class="lineNum"> 413 </span> : : *</a>
+<a name="414"><span class="lineNum"> 414 </span> : : * fdt_get_max_phandle retrieves the highest phandle in the given</a>
+<a name="415"><span class="lineNum"> 415 </span> : : * device tree. This will ignore badly formatted phandles, or phandles</a>
+<a name="416"><span class="lineNum"> 416 </span> : : * with a value of 0 or -1.</a>
+<a name="417"><span class="lineNum"> 417 </span> : : *</a>
+<a name="418"><span class="lineNum"> 418 </span> : : * This function is deprecated in favour of fdt_find_max_phandle().</a>
+<a name="419"><span class="lineNum"> 419 </span> : : *</a>
+<a name="420"><span class="lineNum"> 420 </span> : : * returns:</a>
+<a name="421"><span class="lineNum"> 421 </span> : : * the highest phandle on success</a>
+<a name="422"><span class="lineNum"> 422 </span> : : * 0, if no phandle was found in the device tree</a>
+<a name="423"><span class="lineNum"> 423 </span> : : * -1, if an error occurred</a>
+<a name="424"><span class="lineNum"> 424 </span> : : */</a>
+<a name="425"><span class="lineNum"> 425 </span> : : static inline uint32_t fdt_get_max_phandle(const void *fdt)</a>
+<a name="426"><span class="lineNum"> 426 </span> : : {</a>
+<a name="427"><span class="lineNum"> 427 </span> : : uint32_t phandle;</a>
+<a name="428"><span class="lineNum"> 428 </span> : : int err;</a>
+<a name="429"><span class="lineNum"> 429 </span> : : </a>
+<a name="430"><span class="lineNum"> 430 </span> : : err = fdt_find_max_phandle(fdt, &amp;phandle);</a>
+<a name="431"><span class="lineNum"> 431 </span> : : if (err &lt; 0)</a>
+<a name="432"><span class="lineNum"> 432 </span> : : return (uint32_t)-1;</a>
+<a name="433"><span class="lineNum"> 433 </span> : : </a>
+<a name="434"><span class="lineNum"> 434 </span> : : return phandle;</a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> : : /**</a>
+<a name="438"><span class="lineNum"> 438 </span> : : * fdt_generate_phandle - return a new, unused phandle for a device tree blob</a>
+<a name="439"><span class="lineNum"> 439 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="440"><span class="lineNum"> 440 </span> : : * @phandle: return location for the new phandle</a>
+<a name="441"><span class="lineNum"> 441 </span> : : *</a>
+<a name="442"><span class="lineNum"> 442 </span> : : * Walks the device tree blob and looks for the highest phandle value. On</a>
+<a name="443"><span class="lineNum"> 443 </span> : : * success, the new, unused phandle value (one higher than the previously</a>
+<a name="444"><span class="lineNum"> 444 </span> : : * highest phandle value in the device tree blob) will be returned in the</a>
+<a name="445"><span class="lineNum"> 445 </span> : : * @phandle parameter.</a>
+<a name="446"><span class="lineNum"> 446 </span> : : *</a>
+<a name="447"><span class="lineNum"> 447 </span> : : * Returns:</a>
+<a name="448"><span class="lineNum"> 448 </span> : : * 0 on success or a negative error-code on failure</a>
+<a name="449"><span class="lineNum"> 449 </span> : : */</a>
+<a name="450"><span class="lineNum"> 450 </span> : : int fdt_generate_phandle(const void *fdt, uint32_t *phandle);</a>
+<a name="451"><span class="lineNum"> 451 </span> : : </a>
+<a name="452"><span class="lineNum"> 452 </span> : : /**</a>
+<a name="453"><span class="lineNum"> 453 </span> : : * fdt_num_mem_rsv - retrieve the number of memory reserve map entries</a>
+<a name="454"><span class="lineNum"> 454 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="455"><span class="lineNum"> 455 </span> : : *</a>
+<a name="456"><span class="lineNum"> 456 </span> : : * Returns the number of entries in the device tree blob's memory</a>
+<a name="457"><span class="lineNum"> 457 </span> : : * reservation map. This does not include the terminating 0,0 entry</a>
+<a name="458"><span class="lineNum"> 458 </span> : : * or any other (0,0) entries reserved for expansion.</a>
+<a name="459"><span class="lineNum"> 459 </span> : : *</a>
+<a name="460"><span class="lineNum"> 460 </span> : : * returns:</a>
+<a name="461"><span class="lineNum"> 461 </span> : : * the number of entries</a>
+<a name="462"><span class="lineNum"> 462 </span> : : */</a>
+<a name="463"><span class="lineNum"> 463 </span> : : int fdt_num_mem_rsv(const void *fdt);</a>
+<a name="464"><span class="lineNum"> 464 </span> : : </a>
+<a name="465"><span class="lineNum"> 465 </span> : : /**</a>
+<a name="466"><span class="lineNum"> 466 </span> : : * fdt_get_mem_rsv - retrieve one memory reserve map entry</a>
+<a name="467"><span class="lineNum"> 467 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="468"><span class="lineNum"> 468 </span> : : * @address, @size: pointers to 64-bit variables</a>
+<a name="469"><span class="lineNum"> 469 </span> : : *</a>
+<a name="470"><span class="lineNum"> 470 </span> : : * On success, *address and *size will contain the address and size of</a>
+<a name="471"><span class="lineNum"> 471 </span> : : * the n-th reserve map entry from the device tree blob, in</a>
+<a name="472"><span class="lineNum"> 472 </span> : : * native-endian format.</a>
+<a name="473"><span class="lineNum"> 473 </span> : : *</a>
+<a name="474"><span class="lineNum"> 474 </span> : : * returns:</a>
+<a name="475"><span class="lineNum"> 475 </span> : : * 0, on success</a>
+<a name="476"><span class="lineNum"> 476 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="477"><span class="lineNum"> 477 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="478"><span class="lineNum"> 478 </span> : : * -FDT_ERR_BADSTATE, standard meanings</a>
+<a name="479"><span class="lineNum"> 479 </span> : : */</a>
+<a name="480"><span class="lineNum"> 480 </span> : : int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> : : /**</a>
+<a name="483"><span class="lineNum"> 483 </span> : : * fdt_subnode_offset_namelen - find a subnode based on substring</a>
+<a name="484"><span class="lineNum"> 484 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="485"><span class="lineNum"> 485 </span> : : * @parentoffset: structure block offset of a node</a>
+<a name="486"><span class="lineNum"> 486 </span> : : * @name: name of the subnode to locate</a>
+<a name="487"><span class="lineNum"> 487 </span> : : * @namelen: number of characters of name to consider</a>
+<a name="488"><span class="lineNum"> 488 </span> : : *</a>
+<a name="489"><span class="lineNum"> 489 </span> : : * Identical to fdt_subnode_offset(), but only examine the first</a>
+<a name="490"><span class="lineNum"> 490 </span> : : * namelen characters of name for matching the subnode name. This is</a>
+<a name="491"><span class="lineNum"> 491 </span> : : * useful for finding subnodes based on a portion of a larger string,</a>
+<a name="492"><span class="lineNum"> 492 </span> : : * such as a full path.</a>
+<a name="493"><span class="lineNum"> 493 </span> : : */</a>
+<a name="494"><span class="lineNum"> 494 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="495"><span class="lineNum"> 495 </span> : : int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,</a>
+<a name="496"><span class="lineNum"> 496 </span> : : const char *name, int namelen);</a>
+<a name="497"><span class="lineNum"> 497 </span> : : #endif</a>
+<a name="498"><span class="lineNum"> 498 </span> : : /**</a>
+<a name="499"><span class="lineNum"> 499 </span> : : * fdt_subnode_offset - find a subnode of a given node</a>
+<a name="500"><span class="lineNum"> 500 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="501"><span class="lineNum"> 501 </span> : : * @parentoffset: structure block offset of a node</a>
+<a name="502"><span class="lineNum"> 502 </span> : : * @name: name of the subnode to locate</a>
+<a name="503"><span class="lineNum"> 503 </span> : : *</a>
+<a name="504"><span class="lineNum"> 504 </span> : : * fdt_subnode_offset() finds a subnode of the node at structure block</a>
+<a name="505"><span class="lineNum"> 505 </span> : : * offset parentoffset with the given name. name may include a unit</a>
+<a name="506"><span class="lineNum"> 506 </span> : : * address, in which case fdt_subnode_offset() will find the subnode</a>
+<a name="507"><span class="lineNum"> 507 </span> : : * with that unit address, or the unit address may be omitted, in</a>
+<a name="508"><span class="lineNum"> 508 </span> : : * which case fdt_subnode_offset() will find an arbitrary subnode</a>
+<a name="509"><span class="lineNum"> 509 </span> : : * whose name excluding unit address matches the given name.</a>
+<a name="510"><span class="lineNum"> 510 </span> : : *</a>
+<a name="511"><span class="lineNum"> 511 </span> : : * returns:</a>
+<a name="512"><span class="lineNum"> 512 </span> : : * structure block offset of the requested subnode (&gt;=0), on success</a>
+<a name="513"><span class="lineNum"> 513 </span> : : * -FDT_ERR_NOTFOUND, if the requested subnode does not exist</a>
+<a name="514"><span class="lineNum"> 514 </span> : : * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE</a>
+<a name="515"><span class="lineNum"> 515 </span> : : * tag</a>
+<a name="516"><span class="lineNum"> 516 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="517"><span class="lineNum"> 517 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="518"><span class="lineNum"> 518 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="519"><span class="lineNum"> 519 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="520"><span class="lineNum"> 520 </span> : : * -FDT_ERR_TRUNCATED, standard meanings.</a>
+<a name="521"><span class="lineNum"> 521 </span> : : */</a>
+<a name="522"><span class="lineNum"> 522 </span> : : int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);</a>
+<a name="523"><span class="lineNum"> 523 </span> : : </a>
+<a name="524"><span class="lineNum"> 524 </span> : : /**</a>
+<a name="525"><span class="lineNum"> 525 </span> : : * fdt_path_offset_namelen - find a tree node by its full path</a>
+<a name="526"><span class="lineNum"> 526 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="527"><span class="lineNum"> 527 </span> : : * @path: full path of the node to locate</a>
+<a name="528"><span class="lineNum"> 528 </span> : : * @namelen: number of characters of path to consider</a>
+<a name="529"><span class="lineNum"> 529 </span> : : *</a>
+<a name="530"><span class="lineNum"> 530 </span> : : * Identical to fdt_path_offset(), but only consider the first namelen</a>
+<a name="531"><span class="lineNum"> 531 </span> : : * characters of path as the path name.</a>
+<a name="532"><span class="lineNum"> 532 </span> : : */</a>
+<a name="533"><span class="lineNum"> 533 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="534"><span class="lineNum"> 534 </span> : : int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);</a>
+<a name="535"><span class="lineNum"> 535 </span> : : #endif</a>
+<a name="536"><span class="lineNum"> 536 </span> : : </a>
+<a name="537"><span class="lineNum"> 537 </span> : : /**</a>
+<a name="538"><span class="lineNum"> 538 </span> : : * fdt_path_offset - find a tree node by its full path</a>
+<a name="539"><span class="lineNum"> 539 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="540"><span class="lineNum"> 540 </span> : : * @path: full path of the node to locate</a>
+<a name="541"><span class="lineNum"> 541 </span> : : *</a>
+<a name="542"><span class="lineNum"> 542 </span> : : * fdt_path_offset() finds a node of a given path in the device tree.</a>
+<a name="543"><span class="lineNum"> 543 </span> : : * Each path component may omit the unit address portion, but the</a>
+<a name="544"><span class="lineNum"> 544 </span> : : * results of this are undefined if any such path component is</a>
+<a name="545"><span class="lineNum"> 545 </span> : : * ambiguous (that is if there are multiple nodes at the relevant</a>
+<a name="546"><span class="lineNum"> 546 </span> : : * level matching the given component, differentiated only by unit</a>
+<a name="547"><span class="lineNum"> 547 </span> : : * address).</a>
+<a name="548"><span class="lineNum"> 548 </span> : : *</a>
+<a name="549"><span class="lineNum"> 549 </span> : : * returns:</a>
+<a name="550"><span class="lineNum"> 550 </span> : : * structure block offset of the node with the requested path (&gt;=0), on</a>
+<a name="551"><span class="lineNum"> 551 </span> : : * success</a>
+<a name="552"><span class="lineNum"> 552 </span> : : * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid</a>
+<a name="553"><span class="lineNum"> 553 </span> : : * -FDT_ERR_NOTFOUND, if the requested node does not exist</a>
+<a name="554"><span class="lineNum"> 554 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="555"><span class="lineNum"> 555 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="556"><span class="lineNum"> 556 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="557"><span class="lineNum"> 557 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="558"><span class="lineNum"> 558 </span> : : * -FDT_ERR_TRUNCATED, standard meanings.</a>
+<a name="559"><span class="lineNum"> 559 </span> : : */</a>
+<a name="560"><span class="lineNum"> 560 </span> : : int fdt_path_offset(const void *fdt, const char *path);</a>
+<a name="561"><span class="lineNum"> 561 </span> : : </a>
+<a name="562"><span class="lineNum"> 562 </span> : : /**</a>
+<a name="563"><span class="lineNum"> 563 </span> : : * fdt_get_name - retrieve the name of a given node</a>
+<a name="564"><span class="lineNum"> 564 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="565"><span class="lineNum"> 565 </span> : : * @nodeoffset: structure block offset of the starting node</a>
+<a name="566"><span class="lineNum"> 566 </span> : : * @lenp: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="567"><span class="lineNum"> 567 </span> : : *</a>
+<a name="568"><span class="lineNum"> 568 </span> : : * fdt_get_name() retrieves the name (including unit address) of the</a>
+<a name="569"><span class="lineNum"> 569 </span> : : * device tree node at structure block offset nodeoffset. If lenp is</a>
+<a name="570"><span class="lineNum"> 570 </span> : : * non-NULL, the length of this name is also returned, in the integer</a>
+<a name="571"><span class="lineNum"> 571 </span> : : * pointed to by lenp.</a>
+<a name="572"><span class="lineNum"> 572 </span> : : *</a>
+<a name="573"><span class="lineNum"> 573 </span> : : * returns:</a>
+<a name="574"><span class="lineNum"> 574 </span> : : * pointer to the node's name, on success</a>
+<a name="575"><span class="lineNum"> 575 </span> : : * If lenp is non-NULL, *lenp contains the length of that name</a>
+<a name="576"><span class="lineNum"> 576 </span> : : * (&gt;=0)</a>
+<a name="577"><span class="lineNum"> 577 </span> : : * NULL, on error</a>
+<a name="578"><span class="lineNum"> 578 </span> : : * if lenp is non-NULL *lenp contains an error code (&lt;0):</a>
+<a name="579"><span class="lineNum"> 579 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE</a>
+<a name="580"><span class="lineNum"> 580 </span> : : * tag</a>
+<a name="581"><span class="lineNum"> 581 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="582"><span class="lineNum"> 582 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="583"><span class="lineNum"> 583 </span> : : * -FDT_ERR_BADSTATE, standard meanings</a>
+<a name="584"><span class="lineNum"> 584 </span> : : */</a>
+<a name="585"><span class="lineNum"> 585 </span> : : const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);</a>
+<a name="586"><span class="lineNum"> 586 </span> : : </a>
+<a name="587"><span class="lineNum"> 587 </span> : : /**</a>
+<a name="588"><span class="lineNum"> 588 </span> : : * fdt_first_property_offset - find the offset of a node's first property</a>
+<a name="589"><span class="lineNum"> 589 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="590"><span class="lineNum"> 590 </span> : : * @nodeoffset: structure block offset of a node</a>
+<a name="591"><span class="lineNum"> 591 </span> : : *</a>
+<a name="592"><span class="lineNum"> 592 </span> : : * fdt_first_property_offset() finds the first property of the node at</a>
+<a name="593"><span class="lineNum"> 593 </span> : : * the given structure block offset.</a>
+<a name="594"><span class="lineNum"> 594 </span> : : *</a>
+<a name="595"><span class="lineNum"> 595 </span> : : * returns:</a>
+<a name="596"><span class="lineNum"> 596 </span> : : * structure block offset of the property (&gt;=0), on success</a>
+<a name="597"><span class="lineNum"> 597 </span> : : * -FDT_ERR_NOTFOUND, if the requested node has no properties</a>
+<a name="598"><span class="lineNum"> 598 </span> : : * -FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_BEGIN_NODE tag</a>
+<a name="599"><span class="lineNum"> 599 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="600"><span class="lineNum"> 600 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="601"><span class="lineNum"> 601 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="602"><span class="lineNum"> 602 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="603"><span class="lineNum"> 603 </span> : : * -FDT_ERR_TRUNCATED, standard meanings.</a>
+<a name="604"><span class="lineNum"> 604 </span> : : */</a>
+<a name="605"><span class="lineNum"> 605 </span> : : int fdt_first_property_offset(const void *fdt, int nodeoffset);</a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> : : /**</a>
+<a name="608"><span class="lineNum"> 608 </span> : : * fdt_next_property_offset - step through a node's properties</a>
+<a name="609"><span class="lineNum"> 609 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="610"><span class="lineNum"> 610 </span> : : * @offset: structure block offset of a property</a>
+<a name="611"><span class="lineNum"> 611 </span> : : *</a>
+<a name="612"><span class="lineNum"> 612 </span> : : * fdt_next_property_offset() finds the property immediately after the</a>
+<a name="613"><span class="lineNum"> 613 </span> : : * one at the given structure block offset. This will be a property</a>
+<a name="614"><span class="lineNum"> 614 </span> : : * of the same node as the given property.</a>
+<a name="615"><span class="lineNum"> 615 </span> : : *</a>
+<a name="616"><span class="lineNum"> 616 </span> : : * returns:</a>
+<a name="617"><span class="lineNum"> 617 </span> : : * structure block offset of the next property (&gt;=0), on success</a>
+<a name="618"><span class="lineNum"> 618 </span> : : * -FDT_ERR_NOTFOUND, if the given property is the last in its node</a>
+<a name="619"><span class="lineNum"> 619 </span> : : * -FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_PROP tag</a>
+<a name="620"><span class="lineNum"> 620 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="621"><span class="lineNum"> 621 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="622"><span class="lineNum"> 622 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="623"><span class="lineNum"> 623 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="624"><span class="lineNum"> 624 </span> : : * -FDT_ERR_TRUNCATED, standard meanings.</a>
+<a name="625"><span class="lineNum"> 625 </span> : : */</a>
+<a name="626"><span class="lineNum"> 626 </span> : : int fdt_next_property_offset(const void *fdt, int offset);</a>
+<a name="627"><span class="lineNum"> 627 </span> : : </a>
+<a name="628"><span class="lineNum"> 628 </span> : : /**</a>
+<a name="629"><span class="lineNum"> 629 </span> : : * fdt_for_each_property_offset - iterate over all properties of a node</a>
+<a name="630"><span class="lineNum"> 630 </span> : : *</a>
+<a name="631"><span class="lineNum"> 631 </span> : : * @property_offset: property offset (int, lvalue)</a>
+<a name="632"><span class="lineNum"> 632 </span> : : * @fdt: FDT blob (const void *)</a>
+<a name="633"><span class="lineNum"> 633 </span> : : * @node: node offset (int)</a>
+<a name="634"><span class="lineNum"> 634 </span> : : *</a>
+<a name="635"><span class="lineNum"> 635 </span> : : * This is actually a wrapper around a for loop and would be used like so:</a>
+<a name="636"><span class="lineNum"> 636 </span> : : *</a>
+<a name="637"><span class="lineNum"> 637 </span> : : * fdt_for_each_property_offset(property, fdt, node) {</a>
+<a name="638"><span class="lineNum"> 638 </span> : : * Use property</a>
+<a name="639"><span class="lineNum"> 639 </span> : : * ...</a>
+<a name="640"><span class="lineNum"> 640 </span> : : * }</a>
+<a name="641"><span class="lineNum"> 641 </span> : : *</a>
+<a name="642"><span class="lineNum"> 642 </span> : : * if ((property &lt; 0) &amp;&amp; (property != -FDT_ERR_NOTFOUND)) {</a>
+<a name="643"><span class="lineNum"> 643 </span> : : * Error handling</a>
+<a name="644"><span class="lineNum"> 644 </span> : : * }</a>
+<a name="645"><span class="lineNum"> 645 </span> : : *</a>
+<a name="646"><span class="lineNum"> 646 </span> : : * Note that this is implemented as a macro and property is used as</a>
+<a name="647"><span class="lineNum"> 647 </span> : : * iterator in the loop. The node variable can be constant or even a</a>
+<a name="648"><span class="lineNum"> 648 </span> : : * literal.</a>
+<a name="649"><span class="lineNum"> 649 </span> : : */</a>
+<a name="650"><span class="lineNum"> 650 </span> : : #define fdt_for_each_property_offset(property, fdt, node) \</a>
+<a name="651"><span class="lineNum"> 651 </span> : : for (property = fdt_first_property_offset(fdt, node); \</a>
+<a name="652"><span class="lineNum"> 652 </span> : : property &gt;= 0; \</a>
+<a name="653"><span class="lineNum"> 653 </span> : : property = fdt_next_property_offset(fdt, property))</a>
+<a name="654"><span class="lineNum"> 654 </span> : : </a>
+<a name="655"><span class="lineNum"> 655 </span> : : /**</a>
+<a name="656"><span class="lineNum"> 656 </span> : : * fdt_get_property_by_offset - retrieve the property at a given offset</a>
+<a name="657"><span class="lineNum"> 657 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="658"><span class="lineNum"> 658 </span> : : * @offset: offset of the property to retrieve</a>
+<a name="659"><span class="lineNum"> 659 </span> : : * @lenp: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="660"><span class="lineNum"> 660 </span> : : *</a>
+<a name="661"><span class="lineNum"> 661 </span> : : * fdt_get_property_by_offset() retrieves a pointer to the</a>
+<a name="662"><span class="lineNum"> 662 </span> : : * fdt_property structure within the device tree blob at the given</a>
+<a name="663"><span class="lineNum"> 663 </span> : : * offset. If lenp is non-NULL, the length of the property value is</a>
+<a name="664"><span class="lineNum"> 664 </span> : : * also returned, in the integer pointed to by lenp.</a>
+<a name="665"><span class="lineNum"> 665 </span> : : *</a>
+<a name="666"><span class="lineNum"> 666 </span> : : * Note that this code only works on device tree versions &gt;= 16. fdt_getprop()</a>
+<a name="667"><span class="lineNum"> 667 </span> : : * works on all versions.</a>
+<a name="668"><span class="lineNum"> 668 </span> : : *</a>
+<a name="669"><span class="lineNum"> 669 </span> : : * returns:</a>
+<a name="670"><span class="lineNum"> 670 </span> : : * pointer to the structure representing the property</a>
+<a name="671"><span class="lineNum"> 671 </span> : : * if lenp is non-NULL, *lenp contains the length of the property</a>
+<a name="672"><span class="lineNum"> 672 </span> : : * value (&gt;=0)</a>
+<a name="673"><span class="lineNum"> 673 </span> : : * NULL, on error</a>
+<a name="674"><span class="lineNum"> 674 </span> : : * if lenp is non-NULL, *lenp contains an error code (&lt;0):</a>
+<a name="675"><span class="lineNum"> 675 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag</a>
+<a name="676"><span class="lineNum"> 676 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="677"><span class="lineNum"> 677 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="678"><span class="lineNum"> 678 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="679"><span class="lineNum"> 679 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="680"><span class="lineNum"> 680 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="681"><span class="lineNum"> 681 </span> : : */</a>
+<a name="682"><span class="lineNum"> 682 </span> : : const struct fdt_property *fdt_get_property_by_offset(const void *fdt,</a>
+<a name="683"><span class="lineNum"> 683 </span> : : int offset,</a>
+<a name="684"><span class="lineNum"> 684 </span> : : int *lenp);</a>
+<a name="685"><span class="lineNum"> 685 </span> : : </a>
+<a name="686"><span class="lineNum"> 686 </span> : : /**</a>
+<a name="687"><span class="lineNum"> 687 </span> : : * fdt_get_property_namelen - find a property based on substring</a>
+<a name="688"><span class="lineNum"> 688 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="689"><span class="lineNum"> 689 </span> : : * @nodeoffset: offset of the node whose property to find</a>
+<a name="690"><span class="lineNum"> 690 </span> : : * @name: name of the property to find</a>
+<a name="691"><span class="lineNum"> 691 </span> : : * @namelen: number of characters of name to consider</a>
+<a name="692"><span class="lineNum"> 692 </span> : : * @lenp: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="693"><span class="lineNum"> 693 </span> : : *</a>
+<a name="694"><span class="lineNum"> 694 </span> : : * Identical to fdt_get_property(), but only examine the first namelen</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * characters of name for matching the property name.</a>
+<a name="696"><span class="lineNum"> 696 </span> : : */</a>
+<a name="697"><span class="lineNum"> 697 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="698"><span class="lineNum"> 698 </span> : : const struct fdt_property *fdt_get_property_namelen(const void *fdt,</a>
+<a name="699"><span class="lineNum"> 699 </span> : : int nodeoffset,</a>
+<a name="700"><span class="lineNum"> 700 </span> : : const char *name,</a>
+<a name="701"><span class="lineNum"> 701 </span> : : int namelen, int *lenp);</a>
+<a name="702"><span class="lineNum"> 702 </span> : : #endif</a>
+<a name="703"><span class="lineNum"> 703 </span> : : </a>
+<a name="704"><span class="lineNum"> 704 </span> : : /**</a>
+<a name="705"><span class="lineNum"> 705 </span> : : * fdt_get_property - find a given property in a given node</a>
+<a name="706"><span class="lineNum"> 706 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="707"><span class="lineNum"> 707 </span> : : * @nodeoffset: offset of the node whose property to find</a>
+<a name="708"><span class="lineNum"> 708 </span> : : * @name: name of the property to find</a>
+<a name="709"><span class="lineNum"> 709 </span> : : * @lenp: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="710"><span class="lineNum"> 710 </span> : : *</a>
+<a name="711"><span class="lineNum"> 711 </span> : : * fdt_get_property() retrieves a pointer to the fdt_property</a>
+<a name="712"><span class="lineNum"> 712 </span> : : * structure within the device tree blob corresponding to the property</a>
+<a name="713"><span class="lineNum"> 713 </span> : : * named 'name' of the node at offset nodeoffset. If lenp is</a>
+<a name="714"><span class="lineNum"> 714 </span> : : * non-NULL, the length of the property value is also returned, in the</a>
+<a name="715"><span class="lineNum"> 715 </span> : : * integer pointed to by lenp.</a>
+<a name="716"><span class="lineNum"> 716 </span> : : *</a>
+<a name="717"><span class="lineNum"> 717 </span> : : * returns:</a>
+<a name="718"><span class="lineNum"> 718 </span> : : * pointer to the structure representing the property</a>
+<a name="719"><span class="lineNum"> 719 </span> : : * if lenp is non-NULL, *lenp contains the length of the property</a>
+<a name="720"><span class="lineNum"> 720 </span> : : * value (&gt;=0)</a>
+<a name="721"><span class="lineNum"> 721 </span> : : * NULL, on error</a>
+<a name="722"><span class="lineNum"> 722 </span> : : * if lenp is non-NULL, *lenp contains an error code (&lt;0):</a>
+<a name="723"><span class="lineNum"> 723 </span> : : * -FDT_ERR_NOTFOUND, node does not have named property</a>
+<a name="724"><span class="lineNum"> 724 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE</a>
+<a name="725"><span class="lineNum"> 725 </span> : : * tag</a>
+<a name="726"><span class="lineNum"> 726 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="727"><span class="lineNum"> 727 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="728"><span class="lineNum"> 728 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="729"><span class="lineNum"> 729 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="730"><span class="lineNum"> 730 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="731"><span class="lineNum"> 731 </span> : : */</a>
+<a name="732"><span class="lineNum"> 732 </span> : : const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,</a>
+<a name="733"><span class="lineNum"> 733 </span> : : const char *name, int *lenp);</a>
+<a name="734"><span class="lineNum"> 734 </span> : : static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,</a>
+<a name="735"><span class="lineNum"> 735 </span> : : const char *name,</a>
+<a name="736"><span class="lineNum"> 736 </span> : : int *lenp)</a>
+<a name="737"><span class="lineNum"> 737 </span> : : {</a>
+<a name="738"><span class="lineNum"> 738 </span> : : return (struct fdt_property *)(uintptr_t)</a>
+<a name="739"><span class="lineNum"> 739 </span> : : fdt_get_property(fdt, nodeoffset, name, lenp);</a>
+<a name="740"><span class="lineNum"> 740 </span> : : }</a>
+<a name="741"><span class="lineNum"> 741 </span> : : </a>
+<a name="742"><span class="lineNum"> 742 </span> : : /**</a>
+<a name="743"><span class="lineNum"> 743 </span> : : * fdt_getprop_by_offset - retrieve the value of a property at a given offset</a>
+<a name="744"><span class="lineNum"> 744 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="745"><span class="lineNum"> 745 </span> : : * @offset: offset of the property to read</a>
+<a name="746"><span class="lineNum"> 746 </span> : : * @namep: pointer to a string variable (will be overwritten) or NULL</a>
+<a name="747"><span class="lineNum"> 747 </span> : : * @lenp: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="748"><span class="lineNum"> 748 </span> : : *</a>
+<a name="749"><span class="lineNum"> 749 </span> : : * fdt_getprop_by_offset() retrieves a pointer to the value of the</a>
+<a name="750"><span class="lineNum"> 750 </span> : : * property at structure block offset 'offset' (this will be a pointer</a>
+<a name="751"><span class="lineNum"> 751 </span> : : * to within the device blob itself, not a copy of the value). If</a>
+<a name="752"><span class="lineNum"> 752 </span> : : * lenp is non-NULL, the length of the property value is also</a>
+<a name="753"><span class="lineNum"> 753 </span> : : * returned, in the integer pointed to by lenp. If namep is non-NULL,</a>
+<a name="754"><span class="lineNum"> 754 </span> : : * the property's namne will also be returned in the char * pointed to</a>
+<a name="755"><span class="lineNum"> 755 </span> : : * by namep (this will be a pointer to within the device tree's string</a>
+<a name="756"><span class="lineNum"> 756 </span> : : * block, not a new copy of the name).</a>
+<a name="757"><span class="lineNum"> 757 </span> : : *</a>
+<a name="758"><span class="lineNum"> 758 </span> : : * returns:</a>
+<a name="759"><span class="lineNum"> 759 </span> : : * pointer to the property's value</a>
+<a name="760"><span class="lineNum"> 760 </span> : : * if lenp is non-NULL, *lenp contains the length of the property</a>
+<a name="761"><span class="lineNum"> 761 </span> : : * value (&gt;=0)</a>
+<a name="762"><span class="lineNum"> 762 </span> : : * if namep is non-NULL *namep contiains a pointer to the property</a>
+<a name="763"><span class="lineNum"> 763 </span> : : * name.</a>
+<a name="764"><span class="lineNum"> 764 </span> : : * NULL, on error</a>
+<a name="765"><span class="lineNum"> 765 </span> : : * if lenp is non-NULL, *lenp contains an error code (&lt;0):</a>
+<a name="766"><span class="lineNum"> 766 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag</a>
+<a name="767"><span class="lineNum"> 767 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="768"><span class="lineNum"> 768 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="769"><span class="lineNum"> 769 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="770"><span class="lineNum"> 770 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="771"><span class="lineNum"> 771 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="772"><span class="lineNum"> 772 </span> : : */</a>
+<a name="773"><span class="lineNum"> 773 </span> : : #ifndef SWIG /* This function is not useful in Python */</a>
+<a name="774"><span class="lineNum"> 774 </span> : : const void *fdt_getprop_by_offset(const void *fdt, int offset,</a>
+<a name="775"><span class="lineNum"> 775 </span> : : const char **namep, int *lenp);</a>
+<a name="776"><span class="lineNum"> 776 </span> : : #endif</a>
+<a name="777"><span class="lineNum"> 777 </span> : : </a>
+<a name="778"><span class="lineNum"> 778 </span> : : /**</a>
+<a name="779"><span class="lineNum"> 779 </span> : : * fdt_getprop_namelen - get property value based on substring</a>
+<a name="780"><span class="lineNum"> 780 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="781"><span class="lineNum"> 781 </span> : : * @nodeoffset: offset of the node whose property to find</a>
+<a name="782"><span class="lineNum"> 782 </span> : : * @name: name of the property to find</a>
+<a name="783"><span class="lineNum"> 783 </span> : : * @namelen: number of characters of name to consider</a>
+<a name="784"><span class="lineNum"> 784 </span> : : * @lenp: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="785"><span class="lineNum"> 785 </span> : : *</a>
+<a name="786"><span class="lineNum"> 786 </span> : : * Identical to fdt_getprop(), but only examine the first namelen</a>
+<a name="787"><span class="lineNum"> 787 </span> : : * characters of name for matching the property name.</a>
+<a name="788"><span class="lineNum"> 788 </span> : : */</a>
+<a name="789"><span class="lineNum"> 789 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="790"><span class="lineNum"> 790 </span> : : const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,</a>
+<a name="791"><span class="lineNum"> 791 </span> : : const char *name, int namelen, int *lenp);</a>
+<a name="792"><span class="lineNum"> 792 </span> : : static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset,</a>
+<a name="793"><span class="lineNum"> 793 </span> : : const char *name, int namelen,</a>
+<a name="794"><span class="lineNum"> 794 </span> : : int *lenp)</a>
+<a name="795"><span class="lineNum"> 795 </span> : : {</a>
+<a name="796"><span class="lineNum"> 796 </span> : : return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name,</a>
+<a name="797"><span class="lineNum"> 797 </span> : : namelen, lenp);</a>
+<a name="798"><span class="lineNum"> 798 </span> : : }</a>
+<a name="799"><span class="lineNum"> 799 </span> : : #endif</a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> : : /**</a>
+<a name="802"><span class="lineNum"> 802 </span> : : * fdt_getprop - retrieve the value of a given property</a>
+<a name="803"><span class="lineNum"> 803 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="804"><span class="lineNum"> 804 </span> : : * @nodeoffset: offset of the node whose property to find</a>
+<a name="805"><span class="lineNum"> 805 </span> : : * @name: name of the property to find</a>
+<a name="806"><span class="lineNum"> 806 </span> : : * @lenp: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="807"><span class="lineNum"> 807 </span> : : *</a>
+<a name="808"><span class="lineNum"> 808 </span> : : * fdt_getprop() retrieves a pointer to the value of the property</a>
+<a name="809"><span class="lineNum"> 809 </span> : : * named 'name' of the node at offset nodeoffset (this will be a</a>
+<a name="810"><span class="lineNum"> 810 </span> : : * pointer to within the device blob itself, not a copy of the value).</a>
+<a name="811"><span class="lineNum"> 811 </span> : : * If lenp is non-NULL, the length of the property value is also</a>
+<a name="812"><span class="lineNum"> 812 </span> : : * returned, in the integer pointed to by lenp.</a>
+<a name="813"><span class="lineNum"> 813 </span> : : *</a>
+<a name="814"><span class="lineNum"> 814 </span> : : * returns:</a>
+<a name="815"><span class="lineNum"> 815 </span> : : * pointer to the property's value</a>
+<a name="816"><span class="lineNum"> 816 </span> : : * if lenp is non-NULL, *lenp contains the length of the property</a>
+<a name="817"><span class="lineNum"> 817 </span> : : * value (&gt;=0)</a>
+<a name="818"><span class="lineNum"> 818 </span> : : * NULL, on error</a>
+<a name="819"><span class="lineNum"> 819 </span> : : * if lenp is non-NULL, *lenp contains an error code (&lt;0):</a>
+<a name="820"><span class="lineNum"> 820 </span> : : * -FDT_ERR_NOTFOUND, node does not have named property</a>
+<a name="821"><span class="lineNum"> 821 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE</a>
+<a name="822"><span class="lineNum"> 822 </span> : : * tag</a>
+<a name="823"><span class="lineNum"> 823 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="824"><span class="lineNum"> 824 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="825"><span class="lineNum"> 825 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="826"><span class="lineNum"> 826 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="827"><span class="lineNum"> 827 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="828"><span class="lineNum"> 828 </span> : : */</a>
+<a name="829"><span class="lineNum"> 829 </span> : : const void *fdt_getprop(const void *fdt, int nodeoffset,</a>
+<a name="830"><span class="lineNum"> 830 </span> : : const char *name, int *lenp);</a>
+<a name="831"><span class="lineNum"> 831 </span> : : static inline void *fdt_getprop_w(void *fdt, int nodeoffset,</a>
+<a name="832"><span class="lineNum"> 832 </span> : : const char *name, int *lenp)</a>
+<a name="833"><span class="lineNum"> 833 </span> : : {</a>
+<a name="834"><span class="lineNum"> 834 </span> : : return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp);</a>
+<a name="835"><span class="lineNum"> 835 </span> : : }</a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> : : /**</a>
+<a name="838"><span class="lineNum"> 838 </span> : : * fdt_get_phandle - retrieve the phandle of a given node</a>
+<a name="839"><span class="lineNum"> 839 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="840"><span class="lineNum"> 840 </span> : : * @nodeoffset: structure block offset of the node</a>
+<a name="841"><span class="lineNum"> 841 </span> : : *</a>
+<a name="842"><span class="lineNum"> 842 </span> : : * fdt_get_phandle() retrieves the phandle of the device tree node at</a>
+<a name="843"><span class="lineNum"> 843 </span> : : * structure block offset nodeoffset.</a>
+<a name="844"><span class="lineNum"> 844 </span> : : *</a>
+<a name="845"><span class="lineNum"> 845 </span> : : * returns:</a>
+<a name="846"><span class="lineNum"> 846 </span> : : * the phandle of the node at nodeoffset, on success (!= 0, != -1)</a>
+<a name="847"><span class="lineNum"> 847 </span> : : * 0, if the node has no phandle, or another error occurs</a>
+<a name="848"><span class="lineNum"> 848 </span> : : */</a>
+<a name="849"><span class="lineNum"> 849 </span> : : uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);</a>
+<a name="850"><span class="lineNum"> 850 </span> : : </a>
+<a name="851"><span class="lineNum"> 851 </span> : : /**</a>
+<a name="852"><span class="lineNum"> 852 </span> : : * fdt_get_alias_namelen - get alias based on substring</a>
+<a name="853"><span class="lineNum"> 853 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="854"><span class="lineNum"> 854 </span> : : * @name: name of the alias th look up</a>
+<a name="855"><span class="lineNum"> 855 </span> : : * @namelen: number of characters of name to consider</a>
+<a name="856"><span class="lineNum"> 856 </span> : : *</a>
+<a name="857"><span class="lineNum"> 857 </span> : : * Identical to fdt_get_alias(), but only examine the first namelen</a>
+<a name="858"><span class="lineNum"> 858 </span> : : * characters of name for matching the alias name.</a>
+<a name="859"><span class="lineNum"> 859 </span> : : */</a>
+<a name="860"><span class="lineNum"> 860 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="861"><span class="lineNum"> 861 </span> : : const char *fdt_get_alias_namelen(const void *fdt,</a>
+<a name="862"><span class="lineNum"> 862 </span> : : const char *name, int namelen);</a>
+<a name="863"><span class="lineNum"> 863 </span> : : #endif</a>
+<a name="864"><span class="lineNum"> 864 </span> : : </a>
+<a name="865"><span class="lineNum"> 865 </span> : : /**</a>
+<a name="866"><span class="lineNum"> 866 </span> : : * fdt_get_alias - retrieve the path referenced by a given alias</a>
+<a name="867"><span class="lineNum"> 867 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="868"><span class="lineNum"> 868 </span> : : * @name: name of the alias th look up</a>
+<a name="869"><span class="lineNum"> 869 </span> : : *</a>
+<a name="870"><span class="lineNum"> 870 </span> : : * fdt_get_alias() retrieves the value of a given alias. That is, the</a>
+<a name="871"><span class="lineNum"> 871 </span> : : * value of the property named 'name' in the node /aliases.</a>
+<a name="872"><span class="lineNum"> 872 </span> : : *</a>
+<a name="873"><span class="lineNum"> 873 </span> : : * returns:</a>
+<a name="874"><span class="lineNum"> 874 </span> : : * a pointer to the expansion of the alias named 'name', if it exists</a>
+<a name="875"><span class="lineNum"> 875 </span> : : * NULL, if the given alias or the /aliases node does not exist</a>
+<a name="876"><span class="lineNum"> 876 </span> : : */</a>
+<a name="877"><span class="lineNum"> 877 </span> : : const char *fdt_get_alias(const void *fdt, const char *name);</a>
+<a name="878"><span class="lineNum"> 878 </span> : : </a>
+<a name="879"><span class="lineNum"> 879 </span> : : /**</a>
+<a name="880"><span class="lineNum"> 880 </span> : : * fdt_get_path - determine the full path of a node</a>
+<a name="881"><span class="lineNum"> 881 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="882"><span class="lineNum"> 882 </span> : : * @nodeoffset: offset of the node whose path to find</a>
+<a name="883"><span class="lineNum"> 883 </span> : : * @buf: character buffer to contain the returned path (will be overwritten)</a>
+<a name="884"><span class="lineNum"> 884 </span> : : * @buflen: size of the character buffer at buf</a>
+<a name="885"><span class="lineNum"> 885 </span> : : *</a>
+<a name="886"><span class="lineNum"> 886 </span> : : * fdt_get_path() computes the full path of the node at offset</a>
+<a name="887"><span class="lineNum"> 887 </span> : : * nodeoffset, and records that path in the buffer at buf.</a>
+<a name="888"><span class="lineNum"> 888 </span> : : *</a>
+<a name="889"><span class="lineNum"> 889 </span> : : * NOTE: This function is expensive, as it must scan the device tree</a>
+<a name="890"><span class="lineNum"> 890 </span> : : * structure from the start to nodeoffset.</a>
+<a name="891"><span class="lineNum"> 891 </span> : : *</a>
+<a name="892"><span class="lineNum"> 892 </span> : : * returns:</a>
+<a name="893"><span class="lineNum"> 893 </span> : : * 0, on success</a>
+<a name="894"><span class="lineNum"> 894 </span> : : * buf contains the absolute path of the node at</a>
+<a name="895"><span class="lineNum"> 895 </span> : : * nodeoffset, as a NUL-terminated string.</a>
+<a name="896"><span class="lineNum"> 896 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag</a>
+<a name="897"><span class="lineNum"> 897 </span> : : * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)</a>
+<a name="898"><span class="lineNum"> 898 </span> : : * characters and will not fit in the given buffer.</a>
+<a name="899"><span class="lineNum"> 899 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="900"><span class="lineNum"> 900 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="901"><span class="lineNum"> 901 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="902"><span class="lineNum"> 902 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="903"><span class="lineNum"> 903 </span> : : */</a>
+<a name="904"><span class="lineNum"> 904 </span> : : int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);</a>
+<a name="905"><span class="lineNum"> 905 </span> : : </a>
+<a name="906"><span class="lineNum"> 906 </span> : : /**</a>
+<a name="907"><span class="lineNum"> 907 </span> : : * fdt_supernode_atdepth_offset - find a specific ancestor of a node</a>
+<a name="908"><span class="lineNum"> 908 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="909"><span class="lineNum"> 909 </span> : : * @nodeoffset: offset of the node whose parent to find</a>
+<a name="910"><span class="lineNum"> 910 </span> : : * @supernodedepth: depth of the ancestor to find</a>
+<a name="911"><span class="lineNum"> 911 </span> : : * @nodedepth: pointer to an integer variable (will be overwritten) or NULL</a>
+<a name="912"><span class="lineNum"> 912 </span> : : *</a>
+<a name="913"><span class="lineNum"> 913 </span> : : * fdt_supernode_atdepth_offset() finds an ancestor of the given node</a>
+<a name="914"><span class="lineNum"> 914 </span> : : * at a specific depth from the root (where the root itself has depth</a>
+<a name="915"><span class="lineNum"> 915 </span> : : * 0, its immediate subnodes depth 1 and so forth). So</a>
+<a name="916"><span class="lineNum"> 916 </span> : : * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);</a>
+<a name="917"><span class="lineNum"> 917 </span> : : * will always return 0, the offset of the root node. If the node at</a>
+<a name="918"><span class="lineNum"> 918 </span> : : * nodeoffset has depth D, then:</a>
+<a name="919"><span class="lineNum"> 919 </span> : : * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);</a>
+<a name="920"><span class="lineNum"> 920 </span> : : * will return nodeoffset itself.</a>
+<a name="921"><span class="lineNum"> 921 </span> : : *</a>
+<a name="922"><span class="lineNum"> 922 </span> : : * NOTE: This function is expensive, as it must scan the device tree</a>
+<a name="923"><span class="lineNum"> 923 </span> : : * structure from the start to nodeoffset.</a>
+<a name="924"><span class="lineNum"> 924 </span> : : *</a>
+<a name="925"><span class="lineNum"> 925 </span> : : * returns:</a>
+<a name="926"><span class="lineNum"> 926 </span> : : * structure block offset of the node at node offset's ancestor</a>
+<a name="927"><span class="lineNum"> 927 </span> : : * of depth supernodedepth (&gt;=0), on success</a>
+<a name="928"><span class="lineNum"> 928 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag</a>
+<a name="929"><span class="lineNum"> 929 </span> : : * -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of</a>
+<a name="930"><span class="lineNum"> 930 </span> : : * nodeoffset</a>
+<a name="931"><span class="lineNum"> 931 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="932"><span class="lineNum"> 932 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="933"><span class="lineNum"> 933 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="934"><span class="lineNum"> 934 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="935"><span class="lineNum"> 935 </span> : : */</a>
+<a name="936"><span class="lineNum"> 936 </span> : : int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,</a>
+<a name="937"><span class="lineNum"> 937 </span> : : int supernodedepth, int *nodedepth);</a>
+<a name="938"><span class="lineNum"> 938 </span> : : </a>
+<a name="939"><span class="lineNum"> 939 </span> : : /**</a>
+<a name="940"><span class="lineNum"> 940 </span> : : * fdt_node_depth - find the depth of a given node</a>
+<a name="941"><span class="lineNum"> 941 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="942"><span class="lineNum"> 942 </span> : : * @nodeoffset: offset of the node whose parent to find</a>
+<a name="943"><span class="lineNum"> 943 </span> : : *</a>
+<a name="944"><span class="lineNum"> 944 </span> : : * fdt_node_depth() finds the depth of a given node. The root node</a>
+<a name="945"><span class="lineNum"> 945 </span> : : * has depth 0, its immediate subnodes depth 1 and so forth.</a>
+<a name="946"><span class="lineNum"> 946 </span> : : *</a>
+<a name="947"><span class="lineNum"> 947 </span> : : * NOTE: This function is expensive, as it must scan the device tree</a>
+<a name="948"><span class="lineNum"> 948 </span> : : * structure from the start to nodeoffset.</a>
+<a name="949"><span class="lineNum"> 949 </span> : : *</a>
+<a name="950"><span class="lineNum"> 950 </span> : : * returns:</a>
+<a name="951"><span class="lineNum"> 951 </span> : : * depth of the node at nodeoffset (&gt;=0), on success</a>
+<a name="952"><span class="lineNum"> 952 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag</a>
+<a name="953"><span class="lineNum"> 953 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="954"><span class="lineNum"> 954 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="955"><span class="lineNum"> 955 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="956"><span class="lineNum"> 956 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="957"><span class="lineNum"> 957 </span> : : */</a>
+<a name="958"><span class="lineNum"> 958 </span> : : int fdt_node_depth(const void *fdt, int nodeoffset);</a>
+<a name="959"><span class="lineNum"> 959 </span> : : </a>
+<a name="960"><span class="lineNum"> 960 </span> : : /**</a>
+<a name="961"><span class="lineNum"> 961 </span> : : * fdt_parent_offset - find the parent of a given node</a>
+<a name="962"><span class="lineNum"> 962 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="963"><span class="lineNum"> 963 </span> : : * @nodeoffset: offset of the node whose parent to find</a>
+<a name="964"><span class="lineNum"> 964 </span> : : *</a>
+<a name="965"><span class="lineNum"> 965 </span> : : * fdt_parent_offset() locates the parent node of a given node (that</a>
+<a name="966"><span class="lineNum"> 966 </span> : : * is, it finds the offset of the node which contains the node at</a>
+<a name="967"><span class="lineNum"> 967 </span> : : * nodeoffset as a subnode).</a>
+<a name="968"><span class="lineNum"> 968 </span> : : *</a>
+<a name="969"><span class="lineNum"> 969 </span> : : * NOTE: This function is expensive, as it must scan the device tree</a>
+<a name="970"><span class="lineNum"> 970 </span> : : * structure from the start to nodeoffset, *twice*.</a>
+<a name="971"><span class="lineNum"> 971 </span> : : *</a>
+<a name="972"><span class="lineNum"> 972 </span> : : * returns:</a>
+<a name="973"><span class="lineNum"> 973 </span> : : * structure block offset of the parent of the node at nodeoffset</a>
+<a name="974"><span class="lineNum"> 974 </span> : : * (&gt;=0), on success</a>
+<a name="975"><span class="lineNum"> 975 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag</a>
+<a name="976"><span class="lineNum"> 976 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="977"><span class="lineNum"> 977 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="978"><span class="lineNum"> 978 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="979"><span class="lineNum"> 979 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="980"><span class="lineNum"> 980 </span> : : */</a>
+<a name="981"><span class="lineNum"> 981 </span> : : int fdt_parent_offset(const void *fdt, int nodeoffset);</a>
+<a name="982"><span class="lineNum"> 982 </span> : : </a>
+<a name="983"><span class="lineNum"> 983 </span> : : /**</a>
+<a name="984"><span class="lineNum"> 984 </span> : : * fdt_node_offset_by_prop_value - find nodes with a given property value</a>
+<a name="985"><span class="lineNum"> 985 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="986"><span class="lineNum"> 986 </span> : : * @startoffset: only find nodes after this offset</a>
+<a name="987"><span class="lineNum"> 987 </span> : : * @propname: property name to check</a>
+<a name="988"><span class="lineNum"> 988 </span> : : * @propval: property value to search for</a>
+<a name="989"><span class="lineNum"> 989 </span> : : * @proplen: length of the value in propval</a>
+<a name="990"><span class="lineNum"> 990 </span> : : *</a>
+<a name="991"><span class="lineNum"> 991 </span> : : * fdt_node_offset_by_prop_value() returns the offset of the first</a>
+<a name="992"><span class="lineNum"> 992 </span> : : * node after startoffset, which has a property named propname whose</a>
+<a name="993"><span class="lineNum"> 993 </span> : : * value is of length proplen and has value equal to propval; or if</a>
+<a name="994"><span class="lineNum"> 994 </span> : : * startoffset is -1, the very first such node in the tree.</a>
+<a name="995"><span class="lineNum"> 995 </span> : : *</a>
+<a name="996"><span class="lineNum"> 996 </span> : : * To iterate through all nodes matching the criterion, the following</a>
+<a name="997"><span class="lineNum"> 997 </span> : : * idiom can be used:</a>
+<a name="998"><span class="lineNum"> 998 </span> : : * offset = fdt_node_offset_by_prop_value(fdt, -1, propname,</a>
+<a name="999"><span class="lineNum"> 999 </span> : : * propval, proplen);</a>
+<a name="1000"><span class="lineNum"> 1000 </span> : : * while (offset != -FDT_ERR_NOTFOUND) {</a>
+<a name="1001"><span class="lineNum"> 1001 </span> : : * // other code here</a>
+<a name="1002"><span class="lineNum"> 1002 </span> : : * offset = fdt_node_offset_by_prop_value(fdt, offset, propname,</a>
+<a name="1003"><span class="lineNum"> 1003 </span> : : * propval, proplen);</a>
+<a name="1004"><span class="lineNum"> 1004 </span> : : * }</a>
+<a name="1005"><span class="lineNum"> 1005 </span> : : *</a>
+<a name="1006"><span class="lineNum"> 1006 </span> : : * Note the -1 in the first call to the function, if 0 is used here</a>
+<a name="1007"><span class="lineNum"> 1007 </span> : : * instead, the function will never locate the root node, even if it</a>
+<a name="1008"><span class="lineNum"> 1008 </span> : : * matches the criterion.</a>
+<a name="1009"><span class="lineNum"> 1009 </span> : : *</a>
+<a name="1010"><span class="lineNum"> 1010 </span> : : * returns:</a>
+<a name="1011"><span class="lineNum"> 1011 </span> : : * structure block offset of the located node (&gt;= 0, &gt;startoffset),</a>
+<a name="1012"><span class="lineNum"> 1012 </span> : : * on success</a>
+<a name="1013"><span class="lineNum"> 1013 </span> : : * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the</a>
+<a name="1014"><span class="lineNum"> 1014 </span> : : * tree after startoffset</a>
+<a name="1015"><span class="lineNum"> 1015 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag</a>
+<a name="1016"><span class="lineNum"> 1016 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1017"><span class="lineNum"> 1017 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1018"><span class="lineNum"> 1018 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1019"><span class="lineNum"> 1019 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="1020"><span class="lineNum"> 1020 </span> : : */</a>
+<a name="1021"><span class="lineNum"> 1021 </span> : : int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,</a>
+<a name="1022"><span class="lineNum"> 1022 </span> : : const char *propname,</a>
+<a name="1023"><span class="lineNum"> 1023 </span> : : const void *propval, int proplen);</a>
+<a name="1024"><span class="lineNum"> 1024 </span> : : </a>
+<a name="1025"><span class="lineNum"> 1025 </span> : : /**</a>
+<a name="1026"><span class="lineNum"> 1026 </span> : : * fdt_node_offset_by_phandle - find the node with a given phandle</a>
+<a name="1027"><span class="lineNum"> 1027 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1028"><span class="lineNum"> 1028 </span> : : * @phandle: phandle value</a>
+<a name="1029"><span class="lineNum"> 1029 </span> : : *</a>
+<a name="1030"><span class="lineNum"> 1030 </span> : : * fdt_node_offset_by_phandle() returns the offset of the node</a>
+<a name="1031"><span class="lineNum"> 1031 </span> : : * which has the given phandle value. If there is more than one node</a>
+<a name="1032"><span class="lineNum"> 1032 </span> : : * in the tree with the given phandle (an invalid tree), results are</a>
+<a name="1033"><span class="lineNum"> 1033 </span> : : * undefined.</a>
+<a name="1034"><span class="lineNum"> 1034 </span> : : *</a>
+<a name="1035"><span class="lineNum"> 1035 </span> : : * returns:</a>
+<a name="1036"><span class="lineNum"> 1036 </span> : : * structure block offset of the located node (&gt;= 0), on success</a>
+<a name="1037"><span class="lineNum"> 1037 </span> : : * -FDT_ERR_NOTFOUND, no node with that phandle exists</a>
+<a name="1038"><span class="lineNum"> 1038 </span> : : * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)</a>
+<a name="1039"><span class="lineNum"> 1039 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1040"><span class="lineNum"> 1040 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1041"><span class="lineNum"> 1041 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1042"><span class="lineNum"> 1042 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="1043"><span class="lineNum"> 1043 </span> : : */</a>
+<a name="1044"><span class="lineNum"> 1044 </span> : : int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);</a>
+<a name="1045"><span class="lineNum"> 1045 </span> : : </a>
+<a name="1046"><span class="lineNum"> 1046 </span> : : /**</a>
+<a name="1047"><span class="lineNum"> 1047 </span> : : * fdt_node_check_compatible: check a node's compatible property</a>
+<a name="1048"><span class="lineNum"> 1048 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1049"><span class="lineNum"> 1049 </span> : : * @nodeoffset: offset of a tree node</a>
+<a name="1050"><span class="lineNum"> 1050 </span> : : * @compatible: string to match against</a>
+<a name="1051"><span class="lineNum"> 1051 </span> : : *</a>
+<a name="1052"><span class="lineNum"> 1052 </span> : : *</a>
+<a name="1053"><span class="lineNum"> 1053 </span> : : * fdt_node_check_compatible() returns 0 if the given node contains a</a>
+<a name="1054"><span class="lineNum"> 1054 </span> : : * 'compatible' property with the given string as one of its elements,</a>
+<a name="1055"><span class="lineNum"> 1055 </span> : : * it returns non-zero otherwise, or on error.</a>
+<a name="1056"><span class="lineNum"> 1056 </span> : : *</a>
+<a name="1057"><span class="lineNum"> 1057 </span> : : * returns:</a>
+<a name="1058"><span class="lineNum"> 1058 </span> : : * 0, if the node has a 'compatible' property listing the given string</a>
+<a name="1059"><span class="lineNum"> 1059 </span> : : * 1, if the node has a 'compatible' property, but it does not list</a>
+<a name="1060"><span class="lineNum"> 1060 </span> : : * the given string</a>
+<a name="1061"><span class="lineNum"> 1061 </span> : : * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property</a>
+<a name="1062"><span class="lineNum"> 1062 </span> : : * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag</a>
+<a name="1063"><span class="lineNum"> 1063 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1064"><span class="lineNum"> 1064 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1065"><span class="lineNum"> 1065 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1066"><span class="lineNum"> 1066 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="1067"><span class="lineNum"> 1067 </span> : : */</a>
+<a name="1068"><span class="lineNum"> 1068 </span> : : int fdt_node_check_compatible(const void *fdt, int nodeoffset,</a>
+<a name="1069"><span class="lineNum"> 1069 </span> : : const char *compatible);</a>
+<a name="1070"><span class="lineNum"> 1070 </span> : : </a>
+<a name="1071"><span class="lineNum"> 1071 </span> : : /**</a>
+<a name="1072"><span class="lineNum"> 1072 </span> : : * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value</a>
+<a name="1073"><span class="lineNum"> 1073 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1074"><span class="lineNum"> 1074 </span> : : * @startoffset: only find nodes after this offset</a>
+<a name="1075"><span class="lineNum"> 1075 </span> : : * @compatible: 'compatible' string to match against</a>
+<a name="1076"><span class="lineNum"> 1076 </span> : : *</a>
+<a name="1077"><span class="lineNum"> 1077 </span> : : * fdt_node_offset_by_compatible() returns the offset of the first</a>
+<a name="1078"><span class="lineNum"> 1078 </span> : : * node after startoffset, which has a 'compatible' property which</a>
+<a name="1079"><span class="lineNum"> 1079 </span> : : * lists the given compatible string; or if startoffset is -1, the</a>
+<a name="1080"><span class="lineNum"> 1080 </span> : : * very first such node in the tree.</a>
+<a name="1081"><span class="lineNum"> 1081 </span> : : *</a>
+<a name="1082"><span class="lineNum"> 1082 </span> : : * To iterate through all nodes matching the criterion, the following</a>
+<a name="1083"><span class="lineNum"> 1083 </span> : : * idiom can be used:</a>
+<a name="1084"><span class="lineNum"> 1084 </span> : : * offset = fdt_node_offset_by_compatible(fdt, -1, compatible);</a>
+<a name="1085"><span class="lineNum"> 1085 </span> : : * while (offset != -FDT_ERR_NOTFOUND) {</a>
+<a name="1086"><span class="lineNum"> 1086 </span> : : * // other code here</a>
+<a name="1087"><span class="lineNum"> 1087 </span> : : * offset = fdt_node_offset_by_compatible(fdt, offset, compatible);</a>
+<a name="1088"><span class="lineNum"> 1088 </span> : : * }</a>
+<a name="1089"><span class="lineNum"> 1089 </span> : : *</a>
+<a name="1090"><span class="lineNum"> 1090 </span> : : * Note the -1 in the first call to the function, if 0 is used here</a>
+<a name="1091"><span class="lineNum"> 1091 </span> : : * instead, the function will never locate the root node, even if it</a>
+<a name="1092"><span class="lineNum"> 1092 </span> : : * matches the criterion.</a>
+<a name="1093"><span class="lineNum"> 1093 </span> : : *</a>
+<a name="1094"><span class="lineNum"> 1094 </span> : : * returns:</a>
+<a name="1095"><span class="lineNum"> 1095 </span> : : * structure block offset of the located node (&gt;= 0, &gt;startoffset),</a>
+<a name="1096"><span class="lineNum"> 1096 </span> : : * on success</a>
+<a name="1097"><span class="lineNum"> 1097 </span> : : * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the</a>
+<a name="1098"><span class="lineNum"> 1098 </span> : : * tree after startoffset</a>
+<a name="1099"><span class="lineNum"> 1099 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag</a>
+<a name="1100"><span class="lineNum"> 1100 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1101"><span class="lineNum"> 1101 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1102"><span class="lineNum"> 1102 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1103"><span class="lineNum"> 1103 </span> : : * -FDT_ERR_BADSTRUCTURE, standard meanings</a>
+<a name="1104"><span class="lineNum"> 1104 </span> : : */</a>
+<a name="1105"><span class="lineNum"> 1105 </span> : : int fdt_node_offset_by_compatible(const void *fdt, int startoffset,</a>
+<a name="1106"><span class="lineNum"> 1106 </span> : : const char *compatible);</a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : </a>
+<a name="1108"><span class="lineNum"> 1108 </span> : : /**</a>
+<a name="1109"><span class="lineNum"> 1109 </span> : : * fdt_stringlist_contains - check a string list property for a string</a>
+<a name="1110"><span class="lineNum"> 1110 </span> : : * @strlist: Property containing a list of strings to check</a>
+<a name="1111"><span class="lineNum"> 1111 </span> : : * @listlen: Length of property</a>
+<a name="1112"><span class="lineNum"> 1112 </span> : : * @str: String to search for</a>
+<a name="1113"><span class="lineNum"> 1113 </span> : : *</a>
+<a name="1114"><span class="lineNum"> 1114 </span> : : * This is a utility function provided for convenience. The list contains</a>
+<a name="1115"><span class="lineNum"> 1115 </span> : : * one or more strings, each terminated by \0, as is found in a device tree</a>
+<a name="1116"><span class="lineNum"> 1116 </span> : : * &quot;compatible&quot; property.</a>
+<a name="1117"><span class="lineNum"> 1117 </span> : : *</a>
+<a name="1118"><span class="lineNum"> 1118 </span> : : * @return: 1 if the string is found in the list, 0 not found, or invalid list</a>
+<a name="1119"><span class="lineNum"> 1119 </span> : : */</a>
+<a name="1120"><span class="lineNum"> 1120 </span> : : int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);</a>
+<a name="1121"><span class="lineNum"> 1121 </span> : : </a>
+<a name="1122"><span class="lineNum"> 1122 </span> : : /**</a>
+<a name="1123"><span class="lineNum"> 1123 </span> : : * fdt_stringlist_count - count the number of strings in a string list</a>
+<a name="1124"><span class="lineNum"> 1124 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1125"><span class="lineNum"> 1125 </span> : : * @nodeoffset: offset of a tree node</a>
+<a name="1126"><span class="lineNum"> 1126 </span> : : * @property: name of the property containing the string list</a>
+<a name="1127"><span class="lineNum"> 1127 </span> : : * @return:</a>
+<a name="1128"><span class="lineNum"> 1128 </span> : : * the number of strings in the given property</a>
+<a name="1129"><span class="lineNum"> 1129 </span> : : * -FDT_ERR_BADVALUE if the property value is not NUL-terminated</a>
+<a name="1130"><span class="lineNum"> 1130 </span> : : * -FDT_ERR_NOTFOUND if the property does not exist</a>
+<a name="1131"><span class="lineNum"> 1131 </span> : : */</a>
+<a name="1132"><span class="lineNum"> 1132 </span> : : int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property);</a>
+<a name="1133"><span class="lineNum"> 1133 </span> : : </a>
+<a name="1134"><span class="lineNum"> 1134 </span> : : /**</a>
+<a name="1135"><span class="lineNum"> 1135 </span> : : * fdt_stringlist_search - find a string in a string list and return its index</a>
+<a name="1136"><span class="lineNum"> 1136 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1137"><span class="lineNum"> 1137 </span> : : * @nodeoffset: offset of a tree node</a>
+<a name="1138"><span class="lineNum"> 1138 </span> : : * @property: name of the property containing the string list</a>
+<a name="1139"><span class="lineNum"> 1139 </span> : : * @string: string to look up in the string list</a>
+<a name="1140"><span class="lineNum"> 1140 </span> : : *</a>
+<a name="1141"><span class="lineNum"> 1141 </span> : : * Note that it is possible for this function to succeed on property values</a>
+<a name="1142"><span class="lineNum"> 1142 </span> : : * that are not NUL-terminated. That's because the function will stop after</a>
+<a name="1143"><span class="lineNum"> 1143 </span> : : * finding the first occurrence of @string. This can for example happen with</a>
+<a name="1144"><span class="lineNum"> 1144 </span> : : * small-valued cell properties, such as #address-cells, when searching for</a>
+<a name="1145"><span class="lineNum"> 1145 </span> : : * the empty string.</a>
+<a name="1146"><span class="lineNum"> 1146 </span> : : *</a>
+<a name="1147"><span class="lineNum"> 1147 </span> : : * @return:</a>
+<a name="1148"><span class="lineNum"> 1148 </span> : : * the index of the string in the list of strings</a>
+<a name="1149"><span class="lineNum"> 1149 </span> : : * -FDT_ERR_BADVALUE if the property value is not NUL-terminated</a>
+<a name="1150"><span class="lineNum"> 1150 </span> : : * -FDT_ERR_NOTFOUND if the property does not exist or does not contain</a>
+<a name="1151"><span class="lineNum"> 1151 </span> : : * the given string</a>
+<a name="1152"><span class="lineNum"> 1152 </span> : : */</a>
+<a name="1153"><span class="lineNum"> 1153 </span> : : int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,</a>
+<a name="1154"><span class="lineNum"> 1154 </span> : : const char *string);</a>
+<a name="1155"><span class="lineNum"> 1155 </span> : : </a>
+<a name="1156"><span class="lineNum"> 1156 </span> : : /**</a>
+<a name="1157"><span class="lineNum"> 1157 </span> : : * fdt_stringlist_get() - obtain the string at a given index in a string list</a>
+<a name="1158"><span class="lineNum"> 1158 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1159"><span class="lineNum"> 1159 </span> : : * @nodeoffset: offset of a tree node</a>
+<a name="1160"><span class="lineNum"> 1160 </span> : : * @property: name of the property containing the string list</a>
+<a name="1161"><span class="lineNum"> 1161 </span> : : * @index: index of the string to return</a>
+<a name="1162"><span class="lineNum"> 1162 </span> : : * @lenp: return location for the string length or an error code on failure</a>
+<a name="1163"><span class="lineNum"> 1163 </span> : : *</a>
+<a name="1164"><span class="lineNum"> 1164 </span> : : * Note that this will successfully extract strings from properties with</a>
+<a name="1165"><span class="lineNum"> 1165 </span> : : * non-NUL-terminated values. For example on small-valued cell properties</a>
+<a name="1166"><span class="lineNum"> 1166 </span> : : * this function will return the empty string.</a>
+<a name="1167"><span class="lineNum"> 1167 </span> : : *</a>
+<a name="1168"><span class="lineNum"> 1168 </span> : : * If non-NULL, the length of the string (on success) or a negative error-code</a>
+<a name="1169"><span class="lineNum"> 1169 </span> : : * (on failure) will be stored in the integer pointer to by lenp.</a>
+<a name="1170"><span class="lineNum"> 1170 </span> : : *</a>
+<a name="1171"><span class="lineNum"> 1171 </span> : : * @return:</a>
+<a name="1172"><span class="lineNum"> 1172 </span> : : * A pointer to the string at the given index in the string list or NULL on</a>
+<a name="1173"><span class="lineNum"> 1173 </span> : : * failure. On success the length of the string will be stored in the memory</a>
+<a name="1174"><span class="lineNum"> 1174 </span> : : * location pointed to by the lenp parameter, if non-NULL. On failure one of</a>
+<a name="1175"><span class="lineNum"> 1175 </span> : : * the following negative error codes will be returned in the lenp parameter</a>
+<a name="1176"><span class="lineNum"> 1176 </span> : : * (if non-NULL):</a>
+<a name="1177"><span class="lineNum"> 1177 </span> : : * -FDT_ERR_BADVALUE if the property value is not NUL-terminated</a>
+<a name="1178"><span class="lineNum"> 1178 </span> : : * -FDT_ERR_NOTFOUND if the property does not exist</a>
+<a name="1179"><span class="lineNum"> 1179 </span> : : */</a>
+<a name="1180"><span class="lineNum"> 1180 </span> : : const char *fdt_stringlist_get(const void *fdt, int nodeoffset,</a>
+<a name="1181"><span class="lineNum"> 1181 </span> : : const char *property, int index,</a>
+<a name="1182"><span class="lineNum"> 1182 </span> : : int *lenp);</a>
+<a name="1183"><span class="lineNum"> 1183 </span> : : </a>
+<a name="1184"><span class="lineNum"> 1184 </span> : : /**********************************************************************/</a>
+<a name="1185"><span class="lineNum"> 1185 </span> : : /* Read-only functions (addressing related) */</a>
+<a name="1186"><span class="lineNum"> 1186 </span> : : /**********************************************************************/</a>
+<a name="1187"><span class="lineNum"> 1187 </span> : : </a>
+<a name="1188"><span class="lineNum"> 1188 </span> : : /**</a>
+<a name="1189"><span class="lineNum"> 1189 </span> : : * FDT_MAX_NCELLS - maximum value for #address-cells and #size-cells</a>
+<a name="1190"><span class="lineNum"> 1190 </span> : : *</a>
+<a name="1191"><span class="lineNum"> 1191 </span> : : * This is the maximum value for #address-cells, #size-cells and</a>
+<a name="1192"><span class="lineNum"> 1192 </span> : : * similar properties that will be processed by libfdt. IEE1275</a>
+<a name="1193"><span class="lineNum"> 1193 </span> : : * requires that OF implementations handle values up to 4.</a>
+<a name="1194"><span class="lineNum"> 1194 </span> : : * Implementations may support larger values, but in practice higher</a>
+<a name="1195"><span class="lineNum"> 1195 </span> : : * values aren't used.</a>
+<a name="1196"><span class="lineNum"> 1196 </span> : : */</a>
+<a name="1197"><span class="lineNum"> 1197 </span> : : #define FDT_MAX_NCELLS 4</a>
+<a name="1198"><span class="lineNum"> 1198 </span> : : </a>
+<a name="1199"><span class="lineNum"> 1199 </span> : : /**</a>
+<a name="1200"><span class="lineNum"> 1200 </span> : : * fdt_address_cells - retrieve address size for a bus represented in the tree</a>
+<a name="1201"><span class="lineNum"> 1201 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1202"><span class="lineNum"> 1202 </span> : : * @nodeoffset: offset of the node to find the address size for</a>
+<a name="1203"><span class="lineNum"> 1203 </span> : : *</a>
+<a name="1204"><span class="lineNum"> 1204 </span> : : * When the node has a valid #address-cells property, returns its value.</a>
+<a name="1205"><span class="lineNum"> 1205 </span> : : *</a>
+<a name="1206"><span class="lineNum"> 1206 </span> : : * returns:</a>
+<a name="1207"><span class="lineNum"> 1207 </span> : : * 0 &lt;= n &lt; FDT_MAX_NCELLS, on success</a>
+<a name="1208"><span class="lineNum"> 1208 </span> : : * 2, if the node has no #address-cells property</a>
+<a name="1209"><span class="lineNum"> 1209 </span> : : * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid</a>
+<a name="1210"><span class="lineNum"> 1210 </span> : : * #address-cells property</a>
+<a name="1211"><span class="lineNum"> 1211 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1212"><span class="lineNum"> 1212 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1213"><span class="lineNum"> 1213 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1214"><span class="lineNum"> 1214 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1215"><span class="lineNum"> 1215 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1216"><span class="lineNum"> 1216 </span> : : */</a>
+<a name="1217"><span class="lineNum"> 1217 </span> : : int fdt_address_cells(const void *fdt, int nodeoffset);</a>
+<a name="1218"><span class="lineNum"> 1218 </span> : : </a>
+<a name="1219"><span class="lineNum"> 1219 </span> : : /**</a>
+<a name="1220"><span class="lineNum"> 1220 </span> : : * fdt_size_cells - retrieve address range size for a bus represented in the</a>
+<a name="1221"><span class="lineNum"> 1221 </span> : : * tree</a>
+<a name="1222"><span class="lineNum"> 1222 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1223"><span class="lineNum"> 1223 </span> : : * @nodeoffset: offset of the node to find the address range size for</a>
+<a name="1224"><span class="lineNum"> 1224 </span> : : *</a>
+<a name="1225"><span class="lineNum"> 1225 </span> : : * When the node has a valid #size-cells property, returns its value.</a>
+<a name="1226"><span class="lineNum"> 1226 </span> : : *</a>
+<a name="1227"><span class="lineNum"> 1227 </span> : : * returns:</a>
+<a name="1228"><span class="lineNum"> 1228 </span> : : * 0 &lt;= n &lt; FDT_MAX_NCELLS, on success</a>
+<a name="1229"><span class="lineNum"> 1229 </span> : : * 1, if the node has no #size-cells property</a>
+<a name="1230"><span class="lineNum"> 1230 </span> : : * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid</a>
+<a name="1231"><span class="lineNum"> 1231 </span> : : * #size-cells property</a>
+<a name="1232"><span class="lineNum"> 1232 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1233"><span class="lineNum"> 1233 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1234"><span class="lineNum"> 1234 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1235"><span class="lineNum"> 1235 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1236"><span class="lineNum"> 1236 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1237"><span class="lineNum"> 1237 </span> : : */</a>
+<a name="1238"><span class="lineNum"> 1238 </span> : : int fdt_size_cells(const void *fdt, int nodeoffset);</a>
+<a name="1239"><span class="lineNum"> 1239 </span> : : </a>
+<a name="1240"><span class="lineNum"> 1240 </span> : : </a>
+<a name="1241"><span class="lineNum"> 1241 </span> : : /**********************************************************************/</a>
+<a name="1242"><span class="lineNum"> 1242 </span> : : /* Write-in-place functions */</a>
+<a name="1243"><span class="lineNum"> 1243 </span> : : /**********************************************************************/</a>
+<a name="1244"><span class="lineNum"> 1244 </span> : : </a>
+<a name="1245"><span class="lineNum"> 1245 </span> : : /**</a>
+<a name="1246"><span class="lineNum"> 1246 </span> : : * fdt_setprop_inplace_namelen_partial - change a property's value,</a>
+<a name="1247"><span class="lineNum"> 1247 </span> : : * but not its size</a>
+<a name="1248"><span class="lineNum"> 1248 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1249"><span class="lineNum"> 1249 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1250"><span class="lineNum"> 1250 </span> : : * @name: name of the property to change</a>
+<a name="1251"><span class="lineNum"> 1251 </span> : : * @namelen: number of characters of name to consider</a>
+<a name="1252"><span class="lineNum"> 1252 </span> : : * @idx: index of the property to change in the array</a>
+<a name="1253"><span class="lineNum"> 1253 </span> : : * @val: pointer to data to replace the property value with</a>
+<a name="1254"><span class="lineNum"> 1254 </span> : : * @len: length of the property value</a>
+<a name="1255"><span class="lineNum"> 1255 </span> : : *</a>
+<a name="1256"><span class="lineNum"> 1256 </span> : : * Identical to fdt_setprop_inplace(), but modifies the given property</a>
+<a name="1257"><span class="lineNum"> 1257 </span> : : * starting from the given index, and using only the first characters</a>
+<a name="1258"><span class="lineNum"> 1258 </span> : : * of the name. It is useful when you want to manipulate only one value of</a>
+<a name="1259"><span class="lineNum"> 1259 </span> : : * an array and you have a string that doesn't end with \0.</a>
+<a name="1260"><span class="lineNum"> 1260 </span> : : */</a>
+<a name="1261"><span class="lineNum"> 1261 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="1262"><span class="lineNum"> 1262 </span> : : int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,</a>
+<a name="1263"><span class="lineNum"> 1263 </span> : : const char *name, int namelen,</a>
+<a name="1264"><span class="lineNum"> 1264 </span> : : uint32_t idx, const void *val,</a>
+<a name="1265"><span class="lineNum"> 1265 </span> : : int len);</a>
+<a name="1266"><span class="lineNum"> 1266 </span> : : #endif</a>
+<a name="1267"><span class="lineNum"> 1267 </span> : : </a>
+<a name="1268"><span class="lineNum"> 1268 </span> : : /**</a>
+<a name="1269"><span class="lineNum"> 1269 </span> : : * fdt_setprop_inplace - change a property's value, but not its size</a>
+<a name="1270"><span class="lineNum"> 1270 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1271"><span class="lineNum"> 1271 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1272"><span class="lineNum"> 1272 </span> : : * @name: name of the property to change</a>
+<a name="1273"><span class="lineNum"> 1273 </span> : : * @val: pointer to data to replace the property value with</a>
+<a name="1274"><span class="lineNum"> 1274 </span> : : * @len: length of the property value</a>
+<a name="1275"><span class="lineNum"> 1275 </span> : : *</a>
+<a name="1276"><span class="lineNum"> 1276 </span> : : * fdt_setprop_inplace() replaces the value of a given property with</a>
+<a name="1277"><span class="lineNum"> 1277 </span> : : * the data in val, of length len. This function cannot change the</a>
+<a name="1278"><span class="lineNum"> 1278 </span> : : * size of a property, and so will only work if len is equal to the</a>
+<a name="1279"><span class="lineNum"> 1279 </span> : : * current length of the property.</a>
+<a name="1280"><span class="lineNum"> 1280 </span> : : *</a>
+<a name="1281"><span class="lineNum"> 1281 </span> : : * This function will alter only the bytes in the blob which contain</a>
+<a name="1282"><span class="lineNum"> 1282 </span> : : * the given property value, and will not alter or move any other part</a>
+<a name="1283"><span class="lineNum"> 1283 </span> : : * of the tree.</a>
+<a name="1284"><span class="lineNum"> 1284 </span> : : *</a>
+<a name="1285"><span class="lineNum"> 1285 </span> : : * returns:</a>
+<a name="1286"><span class="lineNum"> 1286 </span> : : * 0, on success</a>
+<a name="1287"><span class="lineNum"> 1287 </span> : : * -FDT_ERR_NOSPACE, if len is not equal to the property's current length</a>
+<a name="1288"><span class="lineNum"> 1288 </span> : : * -FDT_ERR_NOTFOUND, node does not have the named property</a>
+<a name="1289"><span class="lineNum"> 1289 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1290"><span class="lineNum"> 1290 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1291"><span class="lineNum"> 1291 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1292"><span class="lineNum"> 1292 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1293"><span class="lineNum"> 1293 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1294"><span class="lineNum"> 1294 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1295"><span class="lineNum"> 1295 </span> : : */</a>
+<a name="1296"><span class="lineNum"> 1296 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="1297"><span class="lineNum"> 1297 </span> : : int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,</a>
+<a name="1298"><span class="lineNum"> 1298 </span> : : const void *val, int len);</a>
+<a name="1299"><span class="lineNum"> 1299 </span> : : #endif</a>
+<a name="1300"><span class="lineNum"> 1300 </span> : : </a>
+<a name="1301"><span class="lineNum"> 1301 </span> : : /**</a>
+<a name="1302"><span class="lineNum"> 1302 </span> : : * fdt_setprop_inplace_u32 - change the value of a 32-bit integer property</a>
+<a name="1303"><span class="lineNum"> 1303 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1304"><span class="lineNum"> 1304 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1305"><span class="lineNum"> 1305 </span> : : * @name: name of the property to change</a>
+<a name="1306"><span class="lineNum"> 1306 </span> : : * @val: 32-bit integer value to replace the property with</a>
+<a name="1307"><span class="lineNum"> 1307 </span> : : *</a>
+<a name="1308"><span class="lineNum"> 1308 </span> : : * fdt_setprop_inplace_u32() replaces the value of a given property</a>
+<a name="1309"><span class="lineNum"> 1309 </span> : : * with the 32-bit integer value in val, converting val to big-endian</a>
+<a name="1310"><span class="lineNum"> 1310 </span> : : * if necessary. This function cannot change the size of a property,</a>
+<a name="1311"><span class="lineNum"> 1311 </span> : : * and so will only work if the property already exists and has length</a>
+<a name="1312"><span class="lineNum"> 1312 </span> : : * 4.</a>
+<a name="1313"><span class="lineNum"> 1313 </span> : : *</a>
+<a name="1314"><span class="lineNum"> 1314 </span> : : * This function will alter only the bytes in the blob which contain</a>
+<a name="1315"><span class="lineNum"> 1315 </span> : : * the given property value, and will not alter or move any other part</a>
+<a name="1316"><span class="lineNum"> 1316 </span> : : * of the tree.</a>
+<a name="1317"><span class="lineNum"> 1317 </span> : : *</a>
+<a name="1318"><span class="lineNum"> 1318 </span> : : * returns:</a>
+<a name="1319"><span class="lineNum"> 1319 </span> : : * 0, on success</a>
+<a name="1320"><span class="lineNum"> 1320 </span> : : * -FDT_ERR_NOSPACE, if the property's length is not equal to 4</a>
+<a name="1321"><span class="lineNum"> 1321 </span> : : * -FDT_ERR_NOTFOUND, node does not have the named property</a>
+<a name="1322"><span class="lineNum"> 1322 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1323"><span class="lineNum"> 1323 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1324"><span class="lineNum"> 1324 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1325"><span class="lineNum"> 1325 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1326"><span class="lineNum"> 1326 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1327"><span class="lineNum"> 1327 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1328"><span class="lineNum"> 1328 </span> : : */</a>
+<a name="1329"><span class="lineNum"> 1329 </span> : : static inline int fdt_setprop_inplace_u32(void *fdt, int nodeoffset,</a>
+<a name="1330"><span class="lineNum"> 1330 </span> : : const char *name, uint32_t val)</a>
+<a name="1331"><span class="lineNum"> 1331 </span> : : {</a>
+<a name="1332"><span class="lineNum"> 1332 </span> : : fdt32_t tmp = cpu_to_fdt32(val);</a>
+<a name="1333"><span class="lineNum"> 1333 </span> : : return fdt_setprop_inplace(fdt, nodeoffset, name, &amp;tmp, sizeof(tmp));</a>
+<a name="1334"><span class="lineNum"> 1334 </span> : : }</a>
+<a name="1335"><span class="lineNum"> 1335 </span> : : </a>
+<a name="1336"><span class="lineNum"> 1336 </span> : : /**</a>
+<a name="1337"><span class="lineNum"> 1337 </span> : : * fdt_setprop_inplace_u64 - change the value of a 64-bit integer property</a>
+<a name="1338"><span class="lineNum"> 1338 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1339"><span class="lineNum"> 1339 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1340"><span class="lineNum"> 1340 </span> : : * @name: name of the property to change</a>
+<a name="1341"><span class="lineNum"> 1341 </span> : : * @val: 64-bit integer value to replace the property with</a>
+<a name="1342"><span class="lineNum"> 1342 </span> : : *</a>
+<a name="1343"><span class="lineNum"> 1343 </span> : : * fdt_setprop_inplace_u64() replaces the value of a given property</a>
+<a name="1344"><span class="lineNum"> 1344 </span> : : * with the 64-bit integer value in val, converting val to big-endian</a>
+<a name="1345"><span class="lineNum"> 1345 </span> : : * if necessary. This function cannot change the size of a property,</a>
+<a name="1346"><span class="lineNum"> 1346 </span> : : * and so will only work if the property already exists and has length</a>
+<a name="1347"><span class="lineNum"> 1347 </span> : : * 8.</a>
+<a name="1348"><span class="lineNum"> 1348 </span> : : *</a>
+<a name="1349"><span class="lineNum"> 1349 </span> : : * This function will alter only the bytes in the blob which contain</a>
+<a name="1350"><span class="lineNum"> 1350 </span> : : * the given property value, and will not alter or move any other part</a>
+<a name="1351"><span class="lineNum"> 1351 </span> : : * of the tree.</a>
+<a name="1352"><span class="lineNum"> 1352 </span> : : *</a>
+<a name="1353"><span class="lineNum"> 1353 </span> : : * returns:</a>
+<a name="1354"><span class="lineNum"> 1354 </span> : : * 0, on success</a>
+<a name="1355"><span class="lineNum"> 1355 </span> : : * -FDT_ERR_NOSPACE, if the property's length is not equal to 8</a>
+<a name="1356"><span class="lineNum"> 1356 </span> : : * -FDT_ERR_NOTFOUND, node does not have the named property</a>
+<a name="1357"><span class="lineNum"> 1357 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1358"><span class="lineNum"> 1358 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1359"><span class="lineNum"> 1359 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1360"><span class="lineNum"> 1360 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1361"><span class="lineNum"> 1361 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1362"><span class="lineNum"> 1362 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1363"><span class="lineNum"> 1363 </span> : : */</a>
+<a name="1364"><span class="lineNum"> 1364 </span> : : static inline int fdt_setprop_inplace_u64(void *fdt, int nodeoffset,</a>
+<a name="1365"><span class="lineNum"> 1365 </span> : : const char *name, uint64_t val)</a>
+<a name="1366"><span class="lineNum"> 1366 </span> : : {</a>
+<a name="1367"><span class="lineNum"> 1367 </span> : : fdt64_t tmp = cpu_to_fdt64(val);</a>
+<a name="1368"><span class="lineNum"> 1368 </span> : : return fdt_setprop_inplace(fdt, nodeoffset, name, &amp;tmp, sizeof(tmp));</a>
+<a name="1369"><span class="lineNum"> 1369 </span> : : }</a>
+<a name="1370"><span class="lineNum"> 1370 </span> : : </a>
+<a name="1371"><span class="lineNum"> 1371 </span> : : /**</a>
+<a name="1372"><span class="lineNum"> 1372 </span> : : * fdt_setprop_inplace_cell - change the value of a single-cell property</a>
+<a name="1373"><span class="lineNum"> 1373 </span> : : *</a>
+<a name="1374"><span class="lineNum"> 1374 </span> : : * This is an alternative name for fdt_setprop_inplace_u32()</a>
+<a name="1375"><span class="lineNum"> 1375 </span> : : */</a>
+<a name="1376"><span class="lineNum"> 1376 </span> : : static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,</a>
+<a name="1377"><span class="lineNum"> 1377 </span> : : const char *name, uint32_t val)</a>
+<a name="1378"><span class="lineNum"> 1378 </span> : : {</a>
+<a name="1379"><span class="lineNum"> 1379 </span> : : return fdt_setprop_inplace_u32(fdt, nodeoffset, name, val);</a>
+<a name="1380"><span class="lineNum"> 1380 </span> : : }</a>
+<a name="1381"><span class="lineNum"> 1381 </span> : : </a>
+<a name="1382"><span class="lineNum"> 1382 </span> : : /**</a>
+<a name="1383"><span class="lineNum"> 1383 </span> : : * fdt_nop_property - replace a property with nop tags</a>
+<a name="1384"><span class="lineNum"> 1384 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1385"><span class="lineNum"> 1385 </span> : : * @nodeoffset: offset of the node whose property to nop</a>
+<a name="1386"><span class="lineNum"> 1386 </span> : : * @name: name of the property to nop</a>
+<a name="1387"><span class="lineNum"> 1387 </span> : : *</a>
+<a name="1388"><span class="lineNum"> 1388 </span> : : * fdt_nop_property() will replace a given property's representation</a>
+<a name="1389"><span class="lineNum"> 1389 </span> : : * in the blob with FDT_NOP tags, effectively removing it from the</a>
+<a name="1390"><span class="lineNum"> 1390 </span> : : * tree.</a>
+<a name="1391"><span class="lineNum"> 1391 </span> : : *</a>
+<a name="1392"><span class="lineNum"> 1392 </span> : : * This function will alter only the bytes in the blob which contain</a>
+<a name="1393"><span class="lineNum"> 1393 </span> : : * the property, and will not alter or move any other part of the</a>
+<a name="1394"><span class="lineNum"> 1394 </span> : : * tree.</a>
+<a name="1395"><span class="lineNum"> 1395 </span> : : *</a>
+<a name="1396"><span class="lineNum"> 1396 </span> : : * returns:</a>
+<a name="1397"><span class="lineNum"> 1397 </span> : : * 0, on success</a>
+<a name="1398"><span class="lineNum"> 1398 </span> : : * -FDT_ERR_NOTFOUND, node does not have the named property</a>
+<a name="1399"><span class="lineNum"> 1399 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1400"><span class="lineNum"> 1400 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1401"><span class="lineNum"> 1401 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1402"><span class="lineNum"> 1402 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1403"><span class="lineNum"> 1403 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1404"><span class="lineNum"> 1404 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1405"><span class="lineNum"> 1405 </span> : : */</a>
+<a name="1406"><span class="lineNum"> 1406 </span> : : int fdt_nop_property(void *fdt, int nodeoffset, const char *name);</a>
+<a name="1407"><span class="lineNum"> 1407 </span> : : </a>
+<a name="1408"><span class="lineNum"> 1408 </span> : : /**</a>
+<a name="1409"><span class="lineNum"> 1409 </span> : : * fdt_nop_node - replace a node (subtree) with nop tags</a>
+<a name="1410"><span class="lineNum"> 1410 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1411"><span class="lineNum"> 1411 </span> : : * @nodeoffset: offset of the node to nop</a>
+<a name="1412"><span class="lineNum"> 1412 </span> : : *</a>
+<a name="1413"><span class="lineNum"> 1413 </span> : : * fdt_nop_node() will replace a given node's representation in the</a>
+<a name="1414"><span class="lineNum"> 1414 </span> : : * blob, including all its subnodes, if any, with FDT_NOP tags,</a>
+<a name="1415"><span class="lineNum"> 1415 </span> : : * effectively removing it from the tree.</a>
+<a name="1416"><span class="lineNum"> 1416 </span> : : *</a>
+<a name="1417"><span class="lineNum"> 1417 </span> : : * This function will alter only the bytes in the blob which contain</a>
+<a name="1418"><span class="lineNum"> 1418 </span> : : * the node and its properties and subnodes, and will not alter or</a>
+<a name="1419"><span class="lineNum"> 1419 </span> : : * move any other part of the tree.</a>
+<a name="1420"><span class="lineNum"> 1420 </span> : : *</a>
+<a name="1421"><span class="lineNum"> 1421 </span> : : * returns:</a>
+<a name="1422"><span class="lineNum"> 1422 </span> : : * 0, on success</a>
+<a name="1423"><span class="lineNum"> 1423 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1424"><span class="lineNum"> 1424 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1425"><span class="lineNum"> 1425 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1426"><span class="lineNum"> 1426 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1427"><span class="lineNum"> 1427 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1428"><span class="lineNum"> 1428 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1429"><span class="lineNum"> 1429 </span> : : */</a>
+<a name="1430"><span class="lineNum"> 1430 </span> : : int fdt_nop_node(void *fdt, int nodeoffset);</a>
+<a name="1431"><span class="lineNum"> 1431 </span> : : </a>
+<a name="1432"><span class="lineNum"> 1432 </span> : : /**********************************************************************/</a>
+<a name="1433"><span class="lineNum"> 1433 </span> : : /* Sequential write functions */</a>
+<a name="1434"><span class="lineNum"> 1434 </span> : : /**********************************************************************/</a>
+<a name="1435"><span class="lineNum"> 1435 </span> : : </a>
+<a name="1436"><span class="lineNum"> 1436 </span> : : /* fdt_create_with_flags flags */</a>
+<a name="1437"><span class="lineNum"> 1437 </span> : : #define FDT_CREATE_FLAG_NO_NAME_DEDUP 0x1</a>
+<a name="1438"><span class="lineNum"> 1438 </span> : : /* FDT_CREATE_FLAG_NO_NAME_DEDUP: Do not try to de-duplicate property</a>
+<a name="1439"><span class="lineNum"> 1439 </span> : : * names in the fdt. This can result in faster creation times, but</a>
+<a name="1440"><span class="lineNum"> 1440 </span> : : * a larger fdt. */</a>
+<a name="1441"><span class="lineNum"> 1441 </span> : : </a>
+<a name="1442"><span class="lineNum"> 1442 </span> : : #define FDT_CREATE_FLAGS_ALL (FDT_CREATE_FLAG_NO_NAME_DEDUP)</a>
+<a name="1443"><span class="lineNum"> 1443 </span> : : </a>
+<a name="1444"><span class="lineNum"> 1444 </span> : : /**</a>
+<a name="1445"><span class="lineNum"> 1445 </span> : : * fdt_create_with_flags - begin creation of a new fdt</a>
+<a name="1446"><span class="lineNum"> 1446 </span> : : * @fdt: pointer to memory allocated where fdt will be created</a>
+<a name="1447"><span class="lineNum"> 1447 </span> : : * @bufsize: size of the memory space at fdt</a>
+<a name="1448"><span class="lineNum"> 1448 </span> : : * @flags: a valid combination of FDT_CREATE_FLAG_ flags, or 0.</a>
+<a name="1449"><span class="lineNum"> 1449 </span> : : *</a>
+<a name="1450"><span class="lineNum"> 1450 </span> : : * fdt_create_with_flags() begins the process of creating a new fdt with</a>
+<a name="1451"><span class="lineNum"> 1451 </span> : : * the sequential write interface.</a>
+<a name="1452"><span class="lineNum"> 1452 </span> : : *</a>
+<a name="1453"><span class="lineNum"> 1453 </span> : : * fdt creation process must end with fdt_finished() to produce a valid fdt.</a>
+<a name="1454"><span class="lineNum"> 1454 </span> : : *</a>
+<a name="1455"><span class="lineNum"> 1455 </span> : : * returns:</a>
+<a name="1456"><span class="lineNum"> 1456 </span> : : * 0, on success</a>
+<a name="1457"><span class="lineNum"> 1457 </span> : : * -FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt</a>
+<a name="1458"><span class="lineNum"> 1458 </span> : : * -FDT_ERR_BADFLAGS, flags is not valid</a>
+<a name="1459"><span class="lineNum"> 1459 </span> : : */</a>
+<a name="1460"><span class="lineNum"> 1460 </span> : : int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags);</a>
+<a name="1461"><span class="lineNum"> 1461 </span> : : </a>
+<a name="1462"><span class="lineNum"> 1462 </span> : : /**</a>
+<a name="1463"><span class="lineNum"> 1463 </span> : : * fdt_create - begin creation of a new fdt</a>
+<a name="1464"><span class="lineNum"> 1464 </span> : : * @fdt: pointer to memory allocated where fdt will be created</a>
+<a name="1465"><span class="lineNum"> 1465 </span> : : * @bufsize: size of the memory space at fdt</a>
+<a name="1466"><span class="lineNum"> 1466 </span> : : *</a>
+<a name="1467"><span class="lineNum"> 1467 </span> : : * fdt_create() is equivalent to fdt_create_with_flags() with flags=0.</a>
+<a name="1468"><span class="lineNum"> 1468 </span> : : *</a>
+<a name="1469"><span class="lineNum"> 1469 </span> : : * returns:</a>
+<a name="1470"><span class="lineNum"> 1470 </span> : : * 0, on success</a>
+<a name="1471"><span class="lineNum"> 1471 </span> : : * -FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt</a>
+<a name="1472"><span class="lineNum"> 1472 </span> : : */</a>
+<a name="1473"><span class="lineNum"> 1473 </span> : : int fdt_create(void *buf, int bufsize);</a>
+<a name="1474"><span class="lineNum"> 1474 </span> : : </a>
+<a name="1475"><span class="lineNum"> 1475 </span> : : int fdt_resize(void *fdt, void *buf, int bufsize);</a>
+<a name="1476"><span class="lineNum"> 1476 </span> : : int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);</a>
+<a name="1477"><span class="lineNum"> 1477 </span> : : int fdt_finish_reservemap(void *fdt);</a>
+<a name="1478"><span class="lineNum"> 1478 </span> : : int fdt_begin_node(void *fdt, const char *name);</a>
+<a name="1479"><span class="lineNum"> 1479 </span> : : int fdt_property(void *fdt, const char *name, const void *val, int len);</a>
+<a name="1480"><span class="lineNum"> 1480 </span> :<span class="lineCov"> 236 : static inline int fdt_property_u32(void *fdt, const char *name, uint32_t val)</span></a>
+<a name="1481"><span class="lineNum"> 1481 </span> : : {</a>
+<a name="1482"><span class="lineNum"> 1482 </span> :<span class="lineCov"> 236 : fdt32_t tmp = cpu_to_fdt32(val);</span></a>
+<a name="1483"><span class="lineNum"> 1483 </span> :<span class="lineCov"> 236 : return fdt_property(fdt, name, &amp;tmp, sizeof(tmp));</span></a>
+<a name="1484"><span class="lineNum"> 1484 </span> : : }</a>
+<a name="1485"><span class="lineNum"> 1485 </span> : : static inline int fdt_property_u64(void *fdt, const char *name, uint64_t val)</a>
+<a name="1486"><span class="lineNum"> 1486 </span> : : {</a>
+<a name="1487"><span class="lineNum"> 1487 </span> : : fdt64_t tmp = cpu_to_fdt64(val);</a>
+<a name="1488"><span class="lineNum"> 1488 </span> : : return fdt_property(fdt, name, &amp;tmp, sizeof(tmp));</a>
+<a name="1489"><span class="lineNum"> 1489 </span> : : }</a>
+<a name="1490"><span class="lineNum"> 1490 </span> : : </a>
+<a name="1491"><span class="lineNum"> 1491 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="1492"><span class="lineNum"> 1492 </span> :<span class="lineCov"> 236 : static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)</span></a>
+<a name="1493"><span class="lineNum"> 1493 </span> : : {</a>
+<a name="1494"><span class="lineNum"> 1494 </span> :<span class="lineCov"> 236 : return fdt_property_u32(fdt, name, val);</span></a>
+<a name="1495"><span class="lineNum"> 1495 </span> : : }</a>
+<a name="1496"><span class="lineNum"> 1496 </span> : : #endif</a>
+<a name="1497"><span class="lineNum"> 1497 </span> : : </a>
+<a name="1498"><span class="lineNum"> 1498 </span> : : /**</a>
+<a name="1499"><span class="lineNum"> 1499 </span> : : * fdt_property_placeholder - add a new property and return a ptr to its value</a>
+<a name="1500"><span class="lineNum"> 1500 </span> : : *</a>
+<a name="1501"><span class="lineNum"> 1501 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1502"><span class="lineNum"> 1502 </span> : : * @name: name of property to add</a>
+<a name="1503"><span class="lineNum"> 1503 </span> : : * @len: length of property value in bytes</a>
+<a name="1504"><span class="lineNum"> 1504 </span> : : * @valp: returns a pointer to where where the value should be placed</a>
+<a name="1505"><span class="lineNum"> 1505 </span> : : *</a>
+<a name="1506"><span class="lineNum"> 1506 </span> : : * returns:</a>
+<a name="1507"><span class="lineNum"> 1507 </span> : : * 0, on success</a>
+<a name="1508"><span class="lineNum"> 1508 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1509"><span class="lineNum"> 1509 </span> : : * -FDT_ERR_NOSPACE, standard meanings</a>
+<a name="1510"><span class="lineNum"> 1510 </span> : : */</a>
+<a name="1511"><span class="lineNum"> 1511 </span> : : int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp);</a>
+<a name="1512"><span class="lineNum"> 1512 </span> : : </a>
+<a name="1513"><span class="lineNum"> 1513 </span> : : #define fdt_property_string(fdt, name, str) \</a>
+<a name="1514"><span class="lineNum"> 1514 </span> : : fdt_property(fdt, name, str, strlen(str)+1)</a>
+<a name="1515"><span class="lineNum"> 1515 </span> : : int fdt_end_node(void *fdt);</a>
+<a name="1516"><span class="lineNum"> 1516 </span> : : int fdt_finish(void *fdt);</a>
+<a name="1517"><span class="lineNum"> 1517 </span> : : </a>
+<a name="1518"><span class="lineNum"> 1518 </span> : : /**********************************************************************/</a>
+<a name="1519"><span class="lineNum"> 1519 </span> : : /* Read-write functions */</a>
+<a name="1520"><span class="lineNum"> 1520 </span> : : /**********************************************************************/</a>
+<a name="1521"><span class="lineNum"> 1521 </span> : : </a>
+<a name="1522"><span class="lineNum"> 1522 </span> : : int fdt_create_empty_tree(void *buf, int bufsize);</a>
+<a name="1523"><span class="lineNum"> 1523 </span> : : int fdt_open_into(const void *fdt, void *buf, int bufsize);</a>
+<a name="1524"><span class="lineNum"> 1524 </span> : : int fdt_pack(void *fdt);</a>
+<a name="1525"><span class="lineNum"> 1525 </span> : : </a>
+<a name="1526"><span class="lineNum"> 1526 </span> : : /**</a>
+<a name="1527"><span class="lineNum"> 1527 </span> : : * fdt_add_mem_rsv - add one memory reserve map entry</a>
+<a name="1528"><span class="lineNum"> 1528 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1529"><span class="lineNum"> 1529 </span> : : * @address, @size: 64-bit values (native endian)</a>
+<a name="1530"><span class="lineNum"> 1530 </span> : : *</a>
+<a name="1531"><span class="lineNum"> 1531 </span> : : * Adds a reserve map entry to the given blob reserving a region at</a>
+<a name="1532"><span class="lineNum"> 1532 </span> : : * address address of length size.</a>
+<a name="1533"><span class="lineNum"> 1533 </span> : : *</a>
+<a name="1534"><span class="lineNum"> 1534 </span> : : * This function will insert data into the reserve map and will</a>
+<a name="1535"><span class="lineNum"> 1535 </span> : : * therefore change the indexes of some entries in the table.</a>
+<a name="1536"><span class="lineNum"> 1536 </span> : : *</a>
+<a name="1537"><span class="lineNum"> 1537 </span> : : * returns:</a>
+<a name="1538"><span class="lineNum"> 1538 </span> : : * 0, on success</a>
+<a name="1539"><span class="lineNum"> 1539 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1540"><span class="lineNum"> 1540 </span> : : * contain the new reservation entry</a>
+<a name="1541"><span class="lineNum"> 1541 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1542"><span class="lineNum"> 1542 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1543"><span class="lineNum"> 1543 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1544"><span class="lineNum"> 1544 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1545"><span class="lineNum"> 1545 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1546"><span class="lineNum"> 1546 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1547"><span class="lineNum"> 1547 </span> : : */</a>
+<a name="1548"><span class="lineNum"> 1548 </span> : : int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);</a>
+<a name="1549"><span class="lineNum"> 1549 </span> : : </a>
+<a name="1550"><span class="lineNum"> 1550 </span> : : /**</a>
+<a name="1551"><span class="lineNum"> 1551 </span> : : * fdt_del_mem_rsv - remove a memory reserve map entry</a>
+<a name="1552"><span class="lineNum"> 1552 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1553"><span class="lineNum"> 1553 </span> : : * @n: entry to remove</a>
+<a name="1554"><span class="lineNum"> 1554 </span> : : *</a>
+<a name="1555"><span class="lineNum"> 1555 </span> : : * fdt_del_mem_rsv() removes the n-th memory reserve map entry from</a>
+<a name="1556"><span class="lineNum"> 1556 </span> : : * the blob.</a>
+<a name="1557"><span class="lineNum"> 1557 </span> : : *</a>
+<a name="1558"><span class="lineNum"> 1558 </span> : : * This function will delete data from the reservation table and will</a>
+<a name="1559"><span class="lineNum"> 1559 </span> : : * therefore change the indexes of some entries in the table.</a>
+<a name="1560"><span class="lineNum"> 1560 </span> : : *</a>
+<a name="1561"><span class="lineNum"> 1561 </span> : : * returns:</a>
+<a name="1562"><span class="lineNum"> 1562 </span> : : * 0, on success</a>
+<a name="1563"><span class="lineNum"> 1563 </span> : : * -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there</a>
+<a name="1564"><span class="lineNum"> 1564 </span> : : * are less than n+1 reserve map entries)</a>
+<a name="1565"><span class="lineNum"> 1565 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1566"><span class="lineNum"> 1566 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1567"><span class="lineNum"> 1567 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1568"><span class="lineNum"> 1568 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1569"><span class="lineNum"> 1569 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1570"><span class="lineNum"> 1570 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1571"><span class="lineNum"> 1571 </span> : : */</a>
+<a name="1572"><span class="lineNum"> 1572 </span> : : int fdt_del_mem_rsv(void *fdt, int n);</a>
+<a name="1573"><span class="lineNum"> 1573 </span> : : </a>
+<a name="1574"><span class="lineNum"> 1574 </span> : : /**</a>
+<a name="1575"><span class="lineNum"> 1575 </span> : : * fdt_set_name - change the name of a given node</a>
+<a name="1576"><span class="lineNum"> 1576 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1577"><span class="lineNum"> 1577 </span> : : * @nodeoffset: structure block offset of a node</a>
+<a name="1578"><span class="lineNum"> 1578 </span> : : * @name: name to give the node</a>
+<a name="1579"><span class="lineNum"> 1579 </span> : : *</a>
+<a name="1580"><span class="lineNum"> 1580 </span> : : * fdt_set_name() replaces the name (including unit address, if any)</a>
+<a name="1581"><span class="lineNum"> 1581 </span> : : * of the given node with the given string. NOTE: this function can't</a>
+<a name="1582"><span class="lineNum"> 1582 </span> : : * efficiently check if the new name is unique amongst the given</a>
+<a name="1583"><span class="lineNum"> 1583 </span> : : * node's siblings; results are undefined if this function is invoked</a>
+<a name="1584"><span class="lineNum"> 1584 </span> : : * with a name equal to one of the given node's siblings.</a>
+<a name="1585"><span class="lineNum"> 1585 </span> : : *</a>
+<a name="1586"><span class="lineNum"> 1586 </span> : : * This function may insert or delete data from the blob, and will</a>
+<a name="1587"><span class="lineNum"> 1587 </span> : : * therefore change the offsets of some existing nodes.</a>
+<a name="1588"><span class="lineNum"> 1588 </span> : : *</a>
+<a name="1589"><span class="lineNum"> 1589 </span> : : * returns:</a>
+<a name="1590"><span class="lineNum"> 1590 </span> : : * 0, on success</a>
+<a name="1591"><span class="lineNum"> 1591 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob</a>
+<a name="1592"><span class="lineNum"> 1592 </span> : : * to contain the new name</a>
+<a name="1593"><span class="lineNum"> 1593 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1594"><span class="lineNum"> 1594 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1595"><span class="lineNum"> 1595 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1596"><span class="lineNum"> 1596 </span> : : * -FDT_ERR_BADSTATE, standard meanings</a>
+<a name="1597"><span class="lineNum"> 1597 </span> : : */</a>
+<a name="1598"><span class="lineNum"> 1598 </span> : : int fdt_set_name(void *fdt, int nodeoffset, const char *name);</a>
+<a name="1599"><span class="lineNum"> 1599 </span> : : </a>
+<a name="1600"><span class="lineNum"> 1600 </span> : : /**</a>
+<a name="1601"><span class="lineNum"> 1601 </span> : : * fdt_setprop - create or change a property</a>
+<a name="1602"><span class="lineNum"> 1602 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1603"><span class="lineNum"> 1603 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1604"><span class="lineNum"> 1604 </span> : : * @name: name of the property to change</a>
+<a name="1605"><span class="lineNum"> 1605 </span> : : * @val: pointer to data to set the property value to</a>
+<a name="1606"><span class="lineNum"> 1606 </span> : : * @len: length of the property value</a>
+<a name="1607"><span class="lineNum"> 1607 </span> : : *</a>
+<a name="1608"><span class="lineNum"> 1608 </span> : : * fdt_setprop() sets the value of the named property in the given</a>
+<a name="1609"><span class="lineNum"> 1609 </span> : : * node to the given value and length, creating the property if it</a>
+<a name="1610"><span class="lineNum"> 1610 </span> : : * does not already exist.</a>
+<a name="1611"><span class="lineNum"> 1611 </span> : : *</a>
+<a name="1612"><span class="lineNum"> 1612 </span> : : * This function may insert or delete data from the blob, and will</a>
+<a name="1613"><span class="lineNum"> 1613 </span> : : * therefore change the offsets of some existing nodes.</a>
+<a name="1614"><span class="lineNum"> 1614 </span> : : *</a>
+<a name="1615"><span class="lineNum"> 1615 </span> : : * returns:</a>
+<a name="1616"><span class="lineNum"> 1616 </span> : : * 0, on success</a>
+<a name="1617"><span class="lineNum"> 1617 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1618"><span class="lineNum"> 1618 </span> : : * contain the new property value</a>
+<a name="1619"><span class="lineNum"> 1619 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1620"><span class="lineNum"> 1620 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1621"><span class="lineNum"> 1621 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1622"><span class="lineNum"> 1622 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1623"><span class="lineNum"> 1623 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1624"><span class="lineNum"> 1624 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1625"><span class="lineNum"> 1625 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1626"><span class="lineNum"> 1626 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1627"><span class="lineNum"> 1627 </span> : : */</a>
+<a name="1628"><span class="lineNum"> 1628 </span> : : int fdt_setprop(void *fdt, int nodeoffset, const char *name,</a>
+<a name="1629"><span class="lineNum"> 1629 </span> : : const void *val, int len);</a>
+<a name="1630"><span class="lineNum"> 1630 </span> : : </a>
+<a name="1631"><span class="lineNum"> 1631 </span> : : /**</a>
+<a name="1632"><span class="lineNum"> 1632 </span> : : * fdt_setprop_placeholder - allocate space for a property</a>
+<a name="1633"><span class="lineNum"> 1633 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1634"><span class="lineNum"> 1634 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1635"><span class="lineNum"> 1635 </span> : : * @name: name of the property to change</a>
+<a name="1636"><span class="lineNum"> 1636 </span> : : * @len: length of the property value</a>
+<a name="1637"><span class="lineNum"> 1637 </span> : : * @prop_data: return pointer to property data</a>
+<a name="1638"><span class="lineNum"> 1638 </span> : : *</a>
+<a name="1639"><span class="lineNum"> 1639 </span> : : * fdt_setprop_placeholer() allocates the named property in the given node.</a>
+<a name="1640"><span class="lineNum"> 1640 </span> : : * If the property exists it is resized. In either case a pointer to the</a>
+<a name="1641"><span class="lineNum"> 1641 </span> : : * property data is returned.</a>
+<a name="1642"><span class="lineNum"> 1642 </span> : : *</a>
+<a name="1643"><span class="lineNum"> 1643 </span> : : * This function may insert or delete data from the blob, and will</a>
+<a name="1644"><span class="lineNum"> 1644 </span> : : * therefore change the offsets of some existing nodes.</a>
+<a name="1645"><span class="lineNum"> 1645 </span> : : *</a>
+<a name="1646"><span class="lineNum"> 1646 </span> : : * returns:</a>
+<a name="1647"><span class="lineNum"> 1647 </span> : : * 0, on success</a>
+<a name="1648"><span class="lineNum"> 1648 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1649"><span class="lineNum"> 1649 </span> : : * contain the new property value</a>
+<a name="1650"><span class="lineNum"> 1650 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1651"><span class="lineNum"> 1651 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1652"><span class="lineNum"> 1652 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1653"><span class="lineNum"> 1653 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1654"><span class="lineNum"> 1654 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1655"><span class="lineNum"> 1655 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1656"><span class="lineNum"> 1656 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1657"><span class="lineNum"> 1657 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1658"><span class="lineNum"> 1658 </span> : : */</a>
+<a name="1659"><span class="lineNum"> 1659 </span> : : int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,</a>
+<a name="1660"><span class="lineNum"> 1660 </span> : : int len, void **prop_data);</a>
+<a name="1661"><span class="lineNum"> 1661 </span> : : </a>
+<a name="1662"><span class="lineNum"> 1662 </span> : : /**</a>
+<a name="1663"><span class="lineNum"> 1663 </span> : : * fdt_setprop_u32 - set a property to a 32-bit integer</a>
+<a name="1664"><span class="lineNum"> 1664 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1665"><span class="lineNum"> 1665 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1666"><span class="lineNum"> 1666 </span> : : * @name: name of the property to change</a>
+<a name="1667"><span class="lineNum"> 1667 </span> : : * @val: 32-bit integer value for the property (native endian)</a>
+<a name="1668"><span class="lineNum"> 1668 </span> : : *</a>
+<a name="1669"><span class="lineNum"> 1669 </span> : : * fdt_setprop_u32() sets the value of the named property in the given</a>
+<a name="1670"><span class="lineNum"> 1670 </span> : : * node to the given 32-bit integer value (converting to big-endian if</a>
+<a name="1671"><span class="lineNum"> 1671 </span> : : * necessary), or creates a new property with that value if it does</a>
+<a name="1672"><span class="lineNum"> 1672 </span> : : * not already exist.</a>
+<a name="1673"><span class="lineNum"> 1673 </span> : : *</a>
+<a name="1674"><span class="lineNum"> 1674 </span> : : * This function may insert or delete data from the blob, and will</a>
+<a name="1675"><span class="lineNum"> 1675 </span> : : * therefore change the offsets of some existing nodes.</a>
+<a name="1676"><span class="lineNum"> 1676 </span> : : *</a>
+<a name="1677"><span class="lineNum"> 1677 </span> : : * returns:</a>
+<a name="1678"><span class="lineNum"> 1678 </span> : : * 0, on success</a>
+<a name="1679"><span class="lineNum"> 1679 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1680"><span class="lineNum"> 1680 </span> : : * contain the new property value</a>
+<a name="1681"><span class="lineNum"> 1681 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1682"><span class="lineNum"> 1682 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1683"><span class="lineNum"> 1683 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1684"><span class="lineNum"> 1684 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1685"><span class="lineNum"> 1685 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1686"><span class="lineNum"> 1686 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1687"><span class="lineNum"> 1687 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1688"><span class="lineNum"> 1688 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1689"><span class="lineNum"> 1689 </span> : : */</a>
+<a name="1690"><span class="lineNum"> 1690 </span> : : static inline int fdt_setprop_u32(void *fdt, int nodeoffset, const char *name,</a>
+<a name="1691"><span class="lineNum"> 1691 </span> : : uint32_t val)</a>
+<a name="1692"><span class="lineNum"> 1692 </span> : : {</a>
+<a name="1693"><span class="lineNum"> 1693 </span> : : fdt32_t tmp = cpu_to_fdt32(val);</a>
+<a name="1694"><span class="lineNum"> 1694 </span> : : return fdt_setprop(fdt, nodeoffset, name, &amp;tmp, sizeof(tmp));</a>
+<a name="1695"><span class="lineNum"> 1695 </span> : : }</a>
+<a name="1696"><span class="lineNum"> 1696 </span> : : </a>
+<a name="1697"><span class="lineNum"> 1697 </span> : : /**</a>
+<a name="1698"><span class="lineNum"> 1698 </span> : : * fdt_setprop_u64 - set a property to a 64-bit integer</a>
+<a name="1699"><span class="lineNum"> 1699 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1700"><span class="lineNum"> 1700 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1701"><span class="lineNum"> 1701 </span> : : * @name: name of the property to change</a>
+<a name="1702"><span class="lineNum"> 1702 </span> : : * @val: 64-bit integer value for the property (native endian)</a>
+<a name="1703"><span class="lineNum"> 1703 </span> : : *</a>
+<a name="1704"><span class="lineNum"> 1704 </span> : : * fdt_setprop_u64() sets the value of the named property in the given</a>
+<a name="1705"><span class="lineNum"> 1705 </span> : : * node to the given 64-bit integer value (converting to big-endian if</a>
+<a name="1706"><span class="lineNum"> 1706 </span> : : * necessary), or creates a new property with that value if it does</a>
+<a name="1707"><span class="lineNum"> 1707 </span> : : * not already exist.</a>
+<a name="1708"><span class="lineNum"> 1708 </span> : : *</a>
+<a name="1709"><span class="lineNum"> 1709 </span> : : * This function may insert or delete data from the blob, and will</a>
+<a name="1710"><span class="lineNum"> 1710 </span> : : * therefore change the offsets of some existing nodes.</a>
+<a name="1711"><span class="lineNum"> 1711 </span> : : *</a>
+<a name="1712"><span class="lineNum"> 1712 </span> : : * returns:</a>
+<a name="1713"><span class="lineNum"> 1713 </span> : : * 0, on success</a>
+<a name="1714"><span class="lineNum"> 1714 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1715"><span class="lineNum"> 1715 </span> : : * contain the new property value</a>
+<a name="1716"><span class="lineNum"> 1716 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1717"><span class="lineNum"> 1717 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1718"><span class="lineNum"> 1718 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1719"><span class="lineNum"> 1719 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1720"><span class="lineNum"> 1720 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1721"><span class="lineNum"> 1721 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1722"><span class="lineNum"> 1722 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1723"><span class="lineNum"> 1723 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1724"><span class="lineNum"> 1724 </span> : : */</a>
+<a name="1725"><span class="lineNum"> 1725 </span> : : static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *name,</a>
+<a name="1726"><span class="lineNum"> 1726 </span> : : uint64_t val)</a>
+<a name="1727"><span class="lineNum"> 1727 </span> : : {</a>
+<a name="1728"><span class="lineNum"> 1728 </span> : : fdt64_t tmp = cpu_to_fdt64(val);</a>
+<a name="1729"><span class="lineNum"> 1729 </span> : : return fdt_setprop(fdt, nodeoffset, name, &amp;tmp, sizeof(tmp));</a>
+<a name="1730"><span class="lineNum"> 1730 </span> : : }</a>
+<a name="1731"><span class="lineNum"> 1731 </span> : : </a>
+<a name="1732"><span class="lineNum"> 1732 </span> : : /**</a>
+<a name="1733"><span class="lineNum"> 1733 </span> : : * fdt_setprop_cell - set a property to a single cell value</a>
+<a name="1734"><span class="lineNum"> 1734 </span> : : *</a>
+<a name="1735"><span class="lineNum"> 1735 </span> : : * This is an alternative name for fdt_setprop_u32()</a>
+<a name="1736"><span class="lineNum"> 1736 </span> : : */</a>
+<a name="1737"><span class="lineNum"> 1737 </span> : : static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,</a>
+<a name="1738"><span class="lineNum"> 1738 </span> : : uint32_t val)</a>
+<a name="1739"><span class="lineNum"> 1739 </span> : : {</a>
+<a name="1740"><span class="lineNum"> 1740 </span> : : return fdt_setprop_u32(fdt, nodeoffset, name, val);</a>
+<a name="1741"><span class="lineNum"> 1741 </span> : : }</a>
+<a name="1742"><span class="lineNum"> 1742 </span> : : </a>
+<a name="1743"><span class="lineNum"> 1743 </span> : : /**</a>
+<a name="1744"><span class="lineNum"> 1744 </span> : : * fdt_setprop_string - set a property to a string value</a>
+<a name="1745"><span class="lineNum"> 1745 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1746"><span class="lineNum"> 1746 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1747"><span class="lineNum"> 1747 </span> : : * @name: name of the property to change</a>
+<a name="1748"><span class="lineNum"> 1748 </span> : : * @str: string value for the property</a>
+<a name="1749"><span class="lineNum"> 1749 </span> : : *</a>
+<a name="1750"><span class="lineNum"> 1750 </span> : : * fdt_setprop_string() sets the value of the named property in the</a>
+<a name="1751"><span class="lineNum"> 1751 </span> : : * given node to the given string value (using the length of the</a>
+<a name="1752"><span class="lineNum"> 1752 </span> : : * string to determine the new length of the property), or creates a</a>
+<a name="1753"><span class="lineNum"> 1753 </span> : : * new property with that value if it does not already exist.</a>
+<a name="1754"><span class="lineNum"> 1754 </span> : : *</a>
+<a name="1755"><span class="lineNum"> 1755 </span> : : * This function may insert or delete data from the blob, and will</a>
+<a name="1756"><span class="lineNum"> 1756 </span> : : * therefore change the offsets of some existing nodes.</a>
+<a name="1757"><span class="lineNum"> 1757 </span> : : *</a>
+<a name="1758"><span class="lineNum"> 1758 </span> : : * returns:</a>
+<a name="1759"><span class="lineNum"> 1759 </span> : : * 0, on success</a>
+<a name="1760"><span class="lineNum"> 1760 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1761"><span class="lineNum"> 1761 </span> : : * contain the new property value</a>
+<a name="1762"><span class="lineNum"> 1762 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1763"><span class="lineNum"> 1763 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1764"><span class="lineNum"> 1764 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1765"><span class="lineNum"> 1765 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1766"><span class="lineNum"> 1766 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1767"><span class="lineNum"> 1767 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1768"><span class="lineNum"> 1768 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1769"><span class="lineNum"> 1769 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1770"><span class="lineNum"> 1770 </span> : : */</a>
+<a name="1771"><span class="lineNum"> 1771 </span> : : #define fdt_setprop_string(fdt, nodeoffset, name, str) \</a>
+<a name="1772"><span class="lineNum"> 1772 </span> : : fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)</a>
+<a name="1773"><span class="lineNum"> 1773 </span> : : </a>
+<a name="1774"><span class="lineNum"> 1774 </span> : : </a>
+<a name="1775"><span class="lineNum"> 1775 </span> : : /**</a>
+<a name="1776"><span class="lineNum"> 1776 </span> : : * fdt_setprop_empty - set a property to an empty value</a>
+<a name="1777"><span class="lineNum"> 1777 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1778"><span class="lineNum"> 1778 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1779"><span class="lineNum"> 1779 </span> : : * @name: name of the property to change</a>
+<a name="1780"><span class="lineNum"> 1780 </span> : : *</a>
+<a name="1781"><span class="lineNum"> 1781 </span> : : * fdt_setprop_empty() sets the value of the named property in the</a>
+<a name="1782"><span class="lineNum"> 1782 </span> : : * given node to an empty (zero length) value, or creates a new empty</a>
+<a name="1783"><span class="lineNum"> 1783 </span> : : * property if it does not already exist.</a>
+<a name="1784"><span class="lineNum"> 1784 </span> : : *</a>
+<a name="1785"><span class="lineNum"> 1785 </span> : : * This function may insert or delete data from the blob, and will</a>
+<a name="1786"><span class="lineNum"> 1786 </span> : : * therefore change the offsets of some existing nodes.</a>
+<a name="1787"><span class="lineNum"> 1787 </span> : : *</a>
+<a name="1788"><span class="lineNum"> 1788 </span> : : * returns:</a>
+<a name="1789"><span class="lineNum"> 1789 </span> : : * 0, on success</a>
+<a name="1790"><span class="lineNum"> 1790 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1791"><span class="lineNum"> 1791 </span> : : * contain the new property value</a>
+<a name="1792"><span class="lineNum"> 1792 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1793"><span class="lineNum"> 1793 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1794"><span class="lineNum"> 1794 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1795"><span class="lineNum"> 1795 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1796"><span class="lineNum"> 1796 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1797"><span class="lineNum"> 1797 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1798"><span class="lineNum"> 1798 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1799"><span class="lineNum"> 1799 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1800"><span class="lineNum"> 1800 </span> : : */</a>
+<a name="1801"><span class="lineNum"> 1801 </span> : : #define fdt_setprop_empty(fdt, nodeoffset, name) \</a>
+<a name="1802"><span class="lineNum"> 1802 </span> : : fdt_setprop((fdt), (nodeoffset), (name), NULL, 0)</a>
+<a name="1803"><span class="lineNum"> 1803 </span> : : </a>
+<a name="1804"><span class="lineNum"> 1804 </span> : : /**</a>
+<a name="1805"><span class="lineNum"> 1805 </span> : : * fdt_appendprop - append to or create a property</a>
+<a name="1806"><span class="lineNum"> 1806 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1807"><span class="lineNum"> 1807 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1808"><span class="lineNum"> 1808 </span> : : * @name: name of the property to append to</a>
+<a name="1809"><span class="lineNum"> 1809 </span> : : * @val: pointer to data to append to the property value</a>
+<a name="1810"><span class="lineNum"> 1810 </span> : : * @len: length of the data to append to the property value</a>
+<a name="1811"><span class="lineNum"> 1811 </span> : : *</a>
+<a name="1812"><span class="lineNum"> 1812 </span> : : * fdt_appendprop() appends the value to the named property in the</a>
+<a name="1813"><span class="lineNum"> 1813 </span> : : * given node, creating the property if it does not already exist.</a>
+<a name="1814"><span class="lineNum"> 1814 </span> : : *</a>
+<a name="1815"><span class="lineNum"> 1815 </span> : : * This function may insert data into the blob, and will therefore</a>
+<a name="1816"><span class="lineNum"> 1816 </span> : : * change the offsets of some existing nodes.</a>
+<a name="1817"><span class="lineNum"> 1817 </span> : : *</a>
+<a name="1818"><span class="lineNum"> 1818 </span> : : * returns:</a>
+<a name="1819"><span class="lineNum"> 1819 </span> : : * 0, on success</a>
+<a name="1820"><span class="lineNum"> 1820 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1821"><span class="lineNum"> 1821 </span> : : * contain the new property value</a>
+<a name="1822"><span class="lineNum"> 1822 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1823"><span class="lineNum"> 1823 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1824"><span class="lineNum"> 1824 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1825"><span class="lineNum"> 1825 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1826"><span class="lineNum"> 1826 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1827"><span class="lineNum"> 1827 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1828"><span class="lineNum"> 1828 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1829"><span class="lineNum"> 1829 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1830"><span class="lineNum"> 1830 </span> : : */</a>
+<a name="1831"><span class="lineNum"> 1831 </span> : : int fdt_appendprop(void *fdt, int nodeoffset, const char *name,</a>
+<a name="1832"><span class="lineNum"> 1832 </span> : : const void *val, int len);</a>
+<a name="1833"><span class="lineNum"> 1833 </span> : : </a>
+<a name="1834"><span class="lineNum"> 1834 </span> : : /**</a>
+<a name="1835"><span class="lineNum"> 1835 </span> : : * fdt_appendprop_u32 - append a 32-bit integer value to a property</a>
+<a name="1836"><span class="lineNum"> 1836 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1837"><span class="lineNum"> 1837 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1838"><span class="lineNum"> 1838 </span> : : * @name: name of the property to change</a>
+<a name="1839"><span class="lineNum"> 1839 </span> : : * @val: 32-bit integer value to append to the property (native endian)</a>
+<a name="1840"><span class="lineNum"> 1840 </span> : : *</a>
+<a name="1841"><span class="lineNum"> 1841 </span> : : * fdt_appendprop_u32() appends the given 32-bit integer value</a>
+<a name="1842"><span class="lineNum"> 1842 </span> : : * (converting to big-endian if necessary) to the value of the named</a>
+<a name="1843"><span class="lineNum"> 1843 </span> : : * property in the given node, or creates a new property with that</a>
+<a name="1844"><span class="lineNum"> 1844 </span> : : * value if it does not already exist.</a>
+<a name="1845"><span class="lineNum"> 1845 </span> : : *</a>
+<a name="1846"><span class="lineNum"> 1846 </span> : : * This function may insert data into the blob, and will therefore</a>
+<a name="1847"><span class="lineNum"> 1847 </span> : : * change the offsets of some existing nodes.</a>
+<a name="1848"><span class="lineNum"> 1848 </span> : : *</a>
+<a name="1849"><span class="lineNum"> 1849 </span> : : * returns:</a>
+<a name="1850"><span class="lineNum"> 1850 </span> : : * 0, on success</a>
+<a name="1851"><span class="lineNum"> 1851 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1852"><span class="lineNum"> 1852 </span> : : * contain the new property value</a>
+<a name="1853"><span class="lineNum"> 1853 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1854"><span class="lineNum"> 1854 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1855"><span class="lineNum"> 1855 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1856"><span class="lineNum"> 1856 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1857"><span class="lineNum"> 1857 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1858"><span class="lineNum"> 1858 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1859"><span class="lineNum"> 1859 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1860"><span class="lineNum"> 1860 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1861"><span class="lineNum"> 1861 </span> : : */</a>
+<a name="1862"><span class="lineNum"> 1862 </span> : : static inline int fdt_appendprop_u32(void *fdt, int nodeoffset,</a>
+<a name="1863"><span class="lineNum"> 1863 </span> : : const char *name, uint32_t val)</a>
+<a name="1864"><span class="lineNum"> 1864 </span> : : {</a>
+<a name="1865"><span class="lineNum"> 1865 </span> : : fdt32_t tmp = cpu_to_fdt32(val);</a>
+<a name="1866"><span class="lineNum"> 1866 </span> : : return fdt_appendprop(fdt, nodeoffset, name, &amp;tmp, sizeof(tmp));</a>
+<a name="1867"><span class="lineNum"> 1867 </span> : : }</a>
+<a name="1868"><span class="lineNum"> 1868 </span> : : </a>
+<a name="1869"><span class="lineNum"> 1869 </span> : : /**</a>
+<a name="1870"><span class="lineNum"> 1870 </span> : : * fdt_appendprop_u64 - append a 64-bit integer value to a property</a>
+<a name="1871"><span class="lineNum"> 1871 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1872"><span class="lineNum"> 1872 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1873"><span class="lineNum"> 1873 </span> : : * @name: name of the property to change</a>
+<a name="1874"><span class="lineNum"> 1874 </span> : : * @val: 64-bit integer value to append to the property (native endian)</a>
+<a name="1875"><span class="lineNum"> 1875 </span> : : *</a>
+<a name="1876"><span class="lineNum"> 1876 </span> : : * fdt_appendprop_u64() appends the given 64-bit integer value</a>
+<a name="1877"><span class="lineNum"> 1877 </span> : : * (converting to big-endian if necessary) to the value of the named</a>
+<a name="1878"><span class="lineNum"> 1878 </span> : : * property in the given node, or creates a new property with that</a>
+<a name="1879"><span class="lineNum"> 1879 </span> : : * value if it does not already exist.</a>
+<a name="1880"><span class="lineNum"> 1880 </span> : : *</a>
+<a name="1881"><span class="lineNum"> 1881 </span> : : * This function may insert data into the blob, and will therefore</a>
+<a name="1882"><span class="lineNum"> 1882 </span> : : * change the offsets of some existing nodes.</a>
+<a name="1883"><span class="lineNum"> 1883 </span> : : *</a>
+<a name="1884"><span class="lineNum"> 1884 </span> : : * returns:</a>
+<a name="1885"><span class="lineNum"> 1885 </span> : : * 0, on success</a>
+<a name="1886"><span class="lineNum"> 1886 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1887"><span class="lineNum"> 1887 </span> : : * contain the new property value</a>
+<a name="1888"><span class="lineNum"> 1888 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1889"><span class="lineNum"> 1889 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1890"><span class="lineNum"> 1890 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1891"><span class="lineNum"> 1891 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1892"><span class="lineNum"> 1892 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1893"><span class="lineNum"> 1893 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1894"><span class="lineNum"> 1894 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1895"><span class="lineNum"> 1895 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1896"><span class="lineNum"> 1896 </span> : : */</a>
+<a name="1897"><span class="lineNum"> 1897 </span> : : static inline int fdt_appendprop_u64(void *fdt, int nodeoffset,</a>
+<a name="1898"><span class="lineNum"> 1898 </span> : : const char *name, uint64_t val)</a>
+<a name="1899"><span class="lineNum"> 1899 </span> : : {</a>
+<a name="1900"><span class="lineNum"> 1900 </span> : : fdt64_t tmp = cpu_to_fdt64(val);</a>
+<a name="1901"><span class="lineNum"> 1901 </span> : : return fdt_appendprop(fdt, nodeoffset, name, &amp;tmp, sizeof(tmp));</a>
+<a name="1902"><span class="lineNum"> 1902 </span> : : }</a>
+<a name="1903"><span class="lineNum"> 1903 </span> : : </a>
+<a name="1904"><span class="lineNum"> 1904 </span> : : /**</a>
+<a name="1905"><span class="lineNum"> 1905 </span> : : * fdt_appendprop_cell - append a single cell value to a property</a>
+<a name="1906"><span class="lineNum"> 1906 </span> : : *</a>
+<a name="1907"><span class="lineNum"> 1907 </span> : : * This is an alternative name for fdt_appendprop_u32()</a>
+<a name="1908"><span class="lineNum"> 1908 </span> : : */</a>
+<a name="1909"><span class="lineNum"> 1909 </span> : : static inline int fdt_appendprop_cell(void *fdt, int nodeoffset,</a>
+<a name="1910"><span class="lineNum"> 1910 </span> : : const char *name, uint32_t val)</a>
+<a name="1911"><span class="lineNum"> 1911 </span> : : {</a>
+<a name="1912"><span class="lineNum"> 1912 </span> : : return fdt_appendprop_u32(fdt, nodeoffset, name, val);</a>
+<a name="1913"><span class="lineNum"> 1913 </span> : : }</a>
+<a name="1914"><span class="lineNum"> 1914 </span> : : </a>
+<a name="1915"><span class="lineNum"> 1915 </span> : : /**</a>
+<a name="1916"><span class="lineNum"> 1916 </span> : : * fdt_appendprop_string - append a string to a property</a>
+<a name="1917"><span class="lineNum"> 1917 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1918"><span class="lineNum"> 1918 </span> : : * @nodeoffset: offset of the node whose property to change</a>
+<a name="1919"><span class="lineNum"> 1919 </span> : : * @name: name of the property to change</a>
+<a name="1920"><span class="lineNum"> 1920 </span> : : * @str: string value to append to the property</a>
+<a name="1921"><span class="lineNum"> 1921 </span> : : *</a>
+<a name="1922"><span class="lineNum"> 1922 </span> : : * fdt_appendprop_string() appends the given string to the value of</a>
+<a name="1923"><span class="lineNum"> 1923 </span> : : * the named property in the given node, or creates a new property</a>
+<a name="1924"><span class="lineNum"> 1924 </span> : : * with that value if it does not already exist.</a>
+<a name="1925"><span class="lineNum"> 1925 </span> : : *</a>
+<a name="1926"><span class="lineNum"> 1926 </span> : : * This function may insert data into the blob, and will therefore</a>
+<a name="1927"><span class="lineNum"> 1927 </span> : : * change the offsets of some existing nodes.</a>
+<a name="1928"><span class="lineNum"> 1928 </span> : : *</a>
+<a name="1929"><span class="lineNum"> 1929 </span> : : * returns:</a>
+<a name="1930"><span class="lineNum"> 1930 </span> : : * 0, on success</a>
+<a name="1931"><span class="lineNum"> 1931 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1932"><span class="lineNum"> 1932 </span> : : * contain the new property value</a>
+<a name="1933"><span class="lineNum"> 1933 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1934"><span class="lineNum"> 1934 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1935"><span class="lineNum"> 1935 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1936"><span class="lineNum"> 1936 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1937"><span class="lineNum"> 1937 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1938"><span class="lineNum"> 1938 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1939"><span class="lineNum"> 1939 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1940"><span class="lineNum"> 1940 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1941"><span class="lineNum"> 1941 </span> : : */</a>
+<a name="1942"><span class="lineNum"> 1942 </span> : : #define fdt_appendprop_string(fdt, nodeoffset, name, str) \</a>
+<a name="1943"><span class="lineNum"> 1943 </span> : : fdt_appendprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)</a>
+<a name="1944"><span class="lineNum"> 1944 </span> : : </a>
+<a name="1945"><span class="lineNum"> 1945 </span> : : /**</a>
+<a name="1946"><span class="lineNum"> 1946 </span> : : * fdt_appendprop_addrrange - append a address range property</a>
+<a name="1947"><span class="lineNum"> 1947 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1948"><span class="lineNum"> 1948 </span> : : * @parent: offset of the parent node</a>
+<a name="1949"><span class="lineNum"> 1949 </span> : : * @nodeoffset: offset of the node to add a property at</a>
+<a name="1950"><span class="lineNum"> 1950 </span> : : * @name: name of property</a>
+<a name="1951"><span class="lineNum"> 1951 </span> : : * @addr: start address of a given range</a>
+<a name="1952"><span class="lineNum"> 1952 </span> : : * @size: size of a given range</a>
+<a name="1953"><span class="lineNum"> 1953 </span> : : *</a>
+<a name="1954"><span class="lineNum"> 1954 </span> : : * fdt_appendprop_addrrange() appends an address range value (start</a>
+<a name="1955"><span class="lineNum"> 1955 </span> : : * address and size) to the value of the named property in the given</a>
+<a name="1956"><span class="lineNum"> 1956 </span> : : * node, or creates a new property with that value if it does not</a>
+<a name="1957"><span class="lineNum"> 1957 </span> : : * already exist.</a>
+<a name="1958"><span class="lineNum"> 1958 </span> : : * If &quot;name&quot; is not specified, a default &quot;reg&quot; is used.</a>
+<a name="1959"><span class="lineNum"> 1959 </span> : : * Cell sizes are determined by parent's #address-cells and #size-cells.</a>
+<a name="1960"><span class="lineNum"> 1960 </span> : : *</a>
+<a name="1961"><span class="lineNum"> 1961 </span> : : * This function may insert data into the blob, and will therefore</a>
+<a name="1962"><span class="lineNum"> 1962 </span> : : * change the offsets of some existing nodes.</a>
+<a name="1963"><span class="lineNum"> 1963 </span> : : *</a>
+<a name="1964"><span class="lineNum"> 1964 </span> : : * returns:</a>
+<a name="1965"><span class="lineNum"> 1965 </span> : : * 0, on success</a>
+<a name="1966"><span class="lineNum"> 1966 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1967"><span class="lineNum"> 1967 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1968"><span class="lineNum"> 1968 </span> : : * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid</a>
+<a name="1969"><span class="lineNum"> 1969 </span> : : * #address-cells property</a>
+<a name="1970"><span class="lineNum"> 1970 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1971"><span class="lineNum"> 1971 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="1972"><span class="lineNum"> 1972 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="1973"><span class="lineNum"> 1973 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="1974"><span class="lineNum"> 1974 </span> : : * -FDT_ERR_BADVALUE, addr or size doesn't fit to respective cells size</a>
+<a name="1975"><span class="lineNum"> 1975 </span> : : * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to</a>
+<a name="1976"><span class="lineNum"> 1976 </span> : : * contain a new property</a>
+<a name="1977"><span class="lineNum"> 1977 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="1978"><span class="lineNum"> 1978 </span> : : */</a>
+<a name="1979"><span class="lineNum"> 1979 </span> : : int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset,</a>
+<a name="1980"><span class="lineNum"> 1980 </span> : : const char *name, uint64_t addr, uint64_t size);</a>
+<a name="1981"><span class="lineNum"> 1981 </span> : : </a>
+<a name="1982"><span class="lineNum"> 1982 </span> : : /**</a>
+<a name="1983"><span class="lineNum"> 1983 </span> : : * fdt_delprop - delete a property</a>
+<a name="1984"><span class="lineNum"> 1984 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="1985"><span class="lineNum"> 1985 </span> : : * @nodeoffset: offset of the node whose property to nop</a>
+<a name="1986"><span class="lineNum"> 1986 </span> : : * @name: name of the property to nop</a>
+<a name="1987"><span class="lineNum"> 1987 </span> : : *</a>
+<a name="1988"><span class="lineNum"> 1988 </span> : : * fdt_del_property() will delete the given property.</a>
+<a name="1989"><span class="lineNum"> 1989 </span> : : *</a>
+<a name="1990"><span class="lineNum"> 1990 </span> : : * This function will delete data from the blob, and will therefore</a>
+<a name="1991"><span class="lineNum"> 1991 </span> : : * change the offsets of some existing nodes.</a>
+<a name="1992"><span class="lineNum"> 1992 </span> : : *</a>
+<a name="1993"><span class="lineNum"> 1993 </span> : : * returns:</a>
+<a name="1994"><span class="lineNum"> 1994 </span> : : * 0, on success</a>
+<a name="1995"><span class="lineNum"> 1995 </span> : : * -FDT_ERR_NOTFOUND, node does not have the named property</a>
+<a name="1996"><span class="lineNum"> 1996 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="1997"><span class="lineNum"> 1997 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="1998"><span class="lineNum"> 1998 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="1999"><span class="lineNum"> 1999 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="2000"><span class="lineNum"> 2000 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="2001"><span class="lineNum"> 2001 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="2002"><span class="lineNum"> 2002 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="2003"><span class="lineNum"> 2003 </span> : : */</a>
+<a name="2004"><span class="lineNum"> 2004 </span> : : int fdt_delprop(void *fdt, int nodeoffset, const char *name);</a>
+<a name="2005"><span class="lineNum"> 2005 </span> : : </a>
+<a name="2006"><span class="lineNum"> 2006 </span> : : /**</a>
+<a name="2007"><span class="lineNum"> 2007 </span> : : * fdt_add_subnode_namelen - creates a new node based on substring</a>
+<a name="2008"><span class="lineNum"> 2008 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="2009"><span class="lineNum"> 2009 </span> : : * @parentoffset: structure block offset of a node</a>
+<a name="2010"><span class="lineNum"> 2010 </span> : : * @name: name of the subnode to locate</a>
+<a name="2011"><span class="lineNum"> 2011 </span> : : * @namelen: number of characters of name to consider</a>
+<a name="2012"><span class="lineNum"> 2012 </span> : : *</a>
+<a name="2013"><span class="lineNum"> 2013 </span> : : * Identical to fdt_add_subnode(), but use only the first namelen</a>
+<a name="2014"><span class="lineNum"> 2014 </span> : : * characters of name as the name of the new node. This is useful for</a>
+<a name="2015"><span class="lineNum"> 2015 </span> : : * creating subnodes based on a portion of a larger string, such as a</a>
+<a name="2016"><span class="lineNum"> 2016 </span> : : * full path.</a>
+<a name="2017"><span class="lineNum"> 2017 </span> : : */</a>
+<a name="2018"><span class="lineNum"> 2018 </span> : : #ifndef SWIG /* Not available in Python */</a>
+<a name="2019"><span class="lineNum"> 2019 </span> : : int fdt_add_subnode_namelen(void *fdt, int parentoffset,</a>
+<a name="2020"><span class="lineNum"> 2020 </span> : : const char *name, int namelen);</a>
+<a name="2021"><span class="lineNum"> 2021 </span> : : #endif</a>
+<a name="2022"><span class="lineNum"> 2022 </span> : : </a>
+<a name="2023"><span class="lineNum"> 2023 </span> : : /**</a>
+<a name="2024"><span class="lineNum"> 2024 </span> : : * fdt_add_subnode - creates a new node</a>
+<a name="2025"><span class="lineNum"> 2025 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="2026"><span class="lineNum"> 2026 </span> : : * @parentoffset: structure block offset of a node</a>
+<a name="2027"><span class="lineNum"> 2027 </span> : : * @name: name of the subnode to locate</a>
+<a name="2028"><span class="lineNum"> 2028 </span> : : *</a>
+<a name="2029"><span class="lineNum"> 2029 </span> : : * fdt_add_subnode() creates a new node as a subnode of the node at</a>
+<a name="2030"><span class="lineNum"> 2030 </span> : : * structure block offset parentoffset, with the given name (which</a>
+<a name="2031"><span class="lineNum"> 2031 </span> : : * should include the unit address, if any).</a>
+<a name="2032"><span class="lineNum"> 2032 </span> : : *</a>
+<a name="2033"><span class="lineNum"> 2033 </span> : : * This function will insert data into the blob, and will therefore</a>
+<a name="2034"><span class="lineNum"> 2034 </span> : : * change the offsets of some existing nodes.</a>
+<a name="2035"><span class="lineNum"> 2035 </span> : : </a>
+<a name="2036"><span class="lineNum"> 2036 </span> : : * returns:</a>
+<a name="2037"><span class="lineNum"> 2037 </span> : : * structure block offset of the created nodeequested subnode (&gt;=0), on</a>
+<a name="2038"><span class="lineNum"> 2038 </span> : : * success</a>
+<a name="2039"><span class="lineNum"> 2039 </span> : : * -FDT_ERR_NOTFOUND, if the requested subnode does not exist</a>
+<a name="2040"><span class="lineNum"> 2040 </span> : : * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE</a>
+<a name="2041"><span class="lineNum"> 2041 </span> : : * tag</a>
+<a name="2042"><span class="lineNum"> 2042 </span> : : * -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of</a>
+<a name="2043"><span class="lineNum"> 2043 </span> : : * the given name</a>
+<a name="2044"><span class="lineNum"> 2044 </span> : : * -FDT_ERR_NOSPACE, if there is insufficient free space in the</a>
+<a name="2045"><span class="lineNum"> 2045 </span> : : * blob to contain the new node</a>
+<a name="2046"><span class="lineNum"> 2046 </span> : : * -FDT_ERR_NOSPACE</a>
+<a name="2047"><span class="lineNum"> 2047 </span> : : * -FDT_ERR_BADLAYOUT</a>
+<a name="2048"><span class="lineNum"> 2048 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="2049"><span class="lineNum"> 2049 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="2050"><span class="lineNum"> 2050 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="2051"><span class="lineNum"> 2051 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="2052"><span class="lineNum"> 2052 </span> : : * -FDT_ERR_TRUNCATED, standard meanings.</a>
+<a name="2053"><span class="lineNum"> 2053 </span> : : */</a>
+<a name="2054"><span class="lineNum"> 2054 </span> : : int fdt_add_subnode(void *fdt, int parentoffset, const char *name);</a>
+<a name="2055"><span class="lineNum"> 2055 </span> : : </a>
+<a name="2056"><span class="lineNum"> 2056 </span> : : /**</a>
+<a name="2057"><span class="lineNum"> 2057 </span> : : * fdt_del_node - delete a node (subtree)</a>
+<a name="2058"><span class="lineNum"> 2058 </span> : : * @fdt: pointer to the device tree blob</a>
+<a name="2059"><span class="lineNum"> 2059 </span> : : * @nodeoffset: offset of the node to nop</a>
+<a name="2060"><span class="lineNum"> 2060 </span> : : *</a>
+<a name="2061"><span class="lineNum"> 2061 </span> : : * fdt_del_node() will remove the given node, including all its</a>
+<a name="2062"><span class="lineNum"> 2062 </span> : : * subnodes if any, from the blob.</a>
+<a name="2063"><span class="lineNum"> 2063 </span> : : *</a>
+<a name="2064"><span class="lineNum"> 2064 </span> : : * This function will delete data from the blob, and will therefore</a>
+<a name="2065"><span class="lineNum"> 2065 </span> : : * change the offsets of some existing nodes.</a>
+<a name="2066"><span class="lineNum"> 2066 </span> : : *</a>
+<a name="2067"><span class="lineNum"> 2067 </span> : : * returns:</a>
+<a name="2068"><span class="lineNum"> 2068 </span> : : * 0, on success</a>
+<a name="2069"><span class="lineNum"> 2069 </span> : : * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag</a>
+<a name="2070"><span class="lineNum"> 2070 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="2071"><span class="lineNum"> 2071 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="2072"><span class="lineNum"> 2072 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="2073"><span class="lineNum"> 2073 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="2074"><span class="lineNum"> 2074 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="2075"><span class="lineNum"> 2075 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="2076"><span class="lineNum"> 2076 </span> : : */</a>
+<a name="2077"><span class="lineNum"> 2077 </span> : : int fdt_del_node(void *fdt, int nodeoffset);</a>
+<a name="2078"><span class="lineNum"> 2078 </span> : : </a>
+<a name="2079"><span class="lineNum"> 2079 </span> : : /**</a>
+<a name="2080"><span class="lineNum"> 2080 </span> : : * fdt_overlay_apply - Applies a DT overlay on a base DT</a>
+<a name="2081"><span class="lineNum"> 2081 </span> : : * @fdt: pointer to the base device tree blob</a>
+<a name="2082"><span class="lineNum"> 2082 </span> : : * @fdto: pointer to the device tree overlay blob</a>
+<a name="2083"><span class="lineNum"> 2083 </span> : : *</a>
+<a name="2084"><span class="lineNum"> 2084 </span> : : * fdt_overlay_apply() will apply the given device tree overlay on the</a>
+<a name="2085"><span class="lineNum"> 2085 </span> : : * given base device tree.</a>
+<a name="2086"><span class="lineNum"> 2086 </span> : : *</a>
+<a name="2087"><span class="lineNum"> 2087 </span> : : * Expect the base device tree to be modified, even if the function</a>
+<a name="2088"><span class="lineNum"> 2088 </span> : : * returns an error.</a>
+<a name="2089"><span class="lineNum"> 2089 </span> : : *</a>
+<a name="2090"><span class="lineNum"> 2090 </span> : : * returns:</a>
+<a name="2091"><span class="lineNum"> 2091 </span> : : * 0, on success</a>
+<a name="2092"><span class="lineNum"> 2092 </span> : : * -FDT_ERR_NOSPACE, there's not enough space in the base device tree</a>
+<a name="2093"><span class="lineNum"> 2093 </span> : : * -FDT_ERR_NOTFOUND, the overlay points to some inexistant nodes or</a>
+<a name="2094"><span class="lineNum"> 2094 </span> : : * properties in the base DT</a>
+<a name="2095"><span class="lineNum"> 2095 </span> : : * -FDT_ERR_BADPHANDLE,</a>
+<a name="2096"><span class="lineNum"> 2096 </span> : : * -FDT_ERR_BADOVERLAY,</a>
+<a name="2097"><span class="lineNum"> 2097 </span> : : * -FDT_ERR_NOPHANDLES,</a>
+<a name="2098"><span class="lineNum"> 2098 </span> : : * -FDT_ERR_INTERNAL,</a>
+<a name="2099"><span class="lineNum"> 2099 </span> : : * -FDT_ERR_BADLAYOUT,</a>
+<a name="2100"><span class="lineNum"> 2100 </span> : : * -FDT_ERR_BADMAGIC,</a>
+<a name="2101"><span class="lineNum"> 2101 </span> : : * -FDT_ERR_BADOFFSET,</a>
+<a name="2102"><span class="lineNum"> 2102 </span> : : * -FDT_ERR_BADPATH,</a>
+<a name="2103"><span class="lineNum"> 2103 </span> : : * -FDT_ERR_BADVERSION,</a>
+<a name="2104"><span class="lineNum"> 2104 </span> : : * -FDT_ERR_BADSTRUCTURE,</a>
+<a name="2105"><span class="lineNum"> 2105 </span> : : * -FDT_ERR_BADSTATE,</a>
+<a name="2106"><span class="lineNum"> 2106 </span> : : * -FDT_ERR_TRUNCATED, standard meanings</a>
+<a name="2107"><span class="lineNum"> 2107 </span> : : */</a>
+<a name="2108"><span class="lineNum"> 2108 </span> : : int fdt_overlay_apply(void *fdt, void *fdto);</a>
+<a name="2109"><span class="lineNum"> 2109 </span> : : </a>
+<a name="2110"><span class="lineNum"> 2110 </span> : : /**********************************************************************/</a>
+<a name="2111"><span class="lineNum"> 2111 </span> : : /* Debugging / informational functions */</a>
+<a name="2112"><span class="lineNum"> 2112 </span> : : /**********************************************************************/</a>
+<a name="2113"><span class="lineNum"> 2113 </span> : : </a>
+<a name="2114"><span class="lineNum"> 2114 </span> : : const char *fdt_strerror(int errval);</a>
+<a name="2115"><span class="lineNum"> 2115 </span> : : </a>
+<a name="2116"><span class="lineNum"> 2116 </span> : : #endif /* LIBFDT_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt_env.h.func-sort-c.html b/coverage-report/libfdt/libfdt_env.h.func-sort-c.html
new file mode 100644
index 0000000..3c18cfa
--- /dev/null
+++ b/coverage-report/libfdt/libfdt_env.h.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt_env.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt_env.h<span style="font-size: 80%;"> (<a href="libfdt_env.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libfdt_env.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#99">fdt64_to_cpu</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#103">cpu_to_fdt64</a></td>
+ <td class="coverFnHi">128</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#90">fdt32_to_cpu</a></td>
+ <td class="coverFnHi">9271</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#94">cpu_to_fdt32</a></td>
+ <td class="coverFnHi">19705</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt_env.h.func.html b/coverage-report/libfdt/libfdt_env.h.func.html
new file mode 100644
index 0000000..6818298
--- /dev/null
+++ b/coverage-report/libfdt/libfdt_env.h.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt_env.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt_env.h<span style="font-size: 80%;"> (<a href="libfdt_env.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libfdt_env.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#94">cpu_to_fdt32</a></td>
+ <td class="coverFnHi">19705</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#103">cpu_to_fdt64</a></td>
+ <td class="coverFnHi">128</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#90">fdt32_to_cpu</a></td>
+ <td class="coverFnHi">9271</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_env.h.gcov.html#99">fdt64_to_cpu</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt_env.h.gcov.html b/coverage-report/libfdt/libfdt_env.h.gcov.html
new file mode 100644
index 0000000..0cb5f7b
--- /dev/null
+++ b/coverage-report/libfdt/libfdt_env.h.gcov.html
@@ -0,0 +1,226 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt_env.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt_env.h<span style="font-size: 80%;"> (source / <a href="libfdt_env.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #ifndef LIBFDT_ENV_H</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #define LIBFDT_ENV_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : /*</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * libfdt - Flat Device Tree manipulation</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright (C) 2006 David Gibson, IBM Corporation.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : * Copyright 2012 Kim Phillips, Freescale Semiconductor.</a>
+<a name="7"><span class="lineNum"> 7 </span> : : *</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * libfdt is dual licensed: you can use it either under the terms of</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * the GPL, or the BSD license, at your option.</a>
+<a name="10"><span class="lineNum"> 10 </span> : : *</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * a) This library is free software; you can redistribute it and/or</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * modify it under the terms of the GNU General Public License as</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * published by the Free Software Foundation; either version 2 of the</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * License, or (at your option) any later version.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : *</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * This library is distributed in the hope that it will be useful,</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * GNU General Public License for more details.</a>
+<a name="20"><span class="lineNum"> 20 </span> : : *</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * You should have received a copy of the GNU General Public</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * License along with this library; if not, write to the Free</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * MA 02110-1301 USA</a>
+<a name="25"><span class="lineNum"> 25 </span> : : *</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * Alternatively,</a>
+<a name="27"><span class="lineNum"> 27 </span> : : *</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * b) Redistribution and use in source and binary forms, with or</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * without modification, are permitted provided that the following</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * conditions are met:</a>
+<a name="31"><span class="lineNum"> 31 </span> : : *</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * 1. Redistributions of source code must retain the above</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * disclaimer.</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * 2. Redistributions in binary form must reproduce the above</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * disclaimer in the documentation and/or other materials</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * provided with the distribution.</a>
+<a name="39"><span class="lineNum"> 39 </span> : : *</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,</a>
+<a name="52"><span class="lineNum"> 52 </span> : : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</a>
+<a name="53"><span class="lineNum"> 53 </span> : : */</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : #include &lt;stddef.h&gt;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="59"><span class="lineNum"> 59 </span> : : #include &lt;string.h&gt;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : #include &lt;limits.h&gt;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> : : #ifdef __CHECKER__</a>
+<a name="63"><span class="lineNum"> 63 </span> : : #define FDT_FORCE __attribute__((force))</a>
+<a name="64"><span class="lineNum"> 64 </span> : : #define FDT_BITWISE __attribute__((bitwise))</a>
+<a name="65"><span class="lineNum"> 65 </span> : : #else</a>
+<a name="66"><span class="lineNum"> 66 </span> : : #define FDT_FORCE</a>
+<a name="67"><span class="lineNum"> 67 </span> : : #define FDT_BITWISE</a>
+<a name="68"><span class="lineNum"> 68 </span> : : #endif</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : typedef uint16_t FDT_BITWISE fdt16_t;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : typedef uint32_t FDT_BITWISE fdt32_t;</a>
+<a name="72"><span class="lineNum"> 72 </span> : : typedef uint64_t FDT_BITWISE fdt64_t;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : #define EXTRACT_BYTE(x, n) ((unsigned long long)((uint8_t *)&amp;x)[n])</a>
+<a name="75"><span class="lineNum"> 75 </span> : : #define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) &lt;&lt; 8) | EXTRACT_BYTE(x, 1))</a>
+<a name="76"><span class="lineNum"> 76 </span> : : #define CPU_TO_FDT32(x) ((EXTRACT_BYTE(x, 0) &lt;&lt; 24) | (EXTRACT_BYTE(x, 1) &lt;&lt; 16) | \</a>
+<a name="77"><span class="lineNum"> 77 </span> : : (EXTRACT_BYTE(x, 2) &lt;&lt; 8) | EXTRACT_BYTE(x, 3))</a>
+<a name="78"><span class="lineNum"> 78 </span> : : #define CPU_TO_FDT64(x) ((EXTRACT_BYTE(x, 0) &lt;&lt; 56) | (EXTRACT_BYTE(x, 1) &lt;&lt; 48) | \</a>
+<a name="79"><span class="lineNum"> 79 </span> : : (EXTRACT_BYTE(x, 2) &lt;&lt; 40) | (EXTRACT_BYTE(x, 3) &lt;&lt; 32) | \</a>
+<a name="80"><span class="lineNum"> 80 </span> : : (EXTRACT_BYTE(x, 4) &lt;&lt; 24) | (EXTRACT_BYTE(x, 5) &lt;&lt; 16) | \</a>
+<a name="81"><span class="lineNum"> 81 </span> : : (EXTRACT_BYTE(x, 6) &lt;&lt; 8) | EXTRACT_BYTE(x, 7))</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : static inline uint16_t fdt16_to_cpu(fdt16_t x)</a>
+<a name="84"><span class="lineNum"> 84 </span> : : {</a>
+<a name="85"><span class="lineNum"> 85 </span> : : return (FDT_FORCE uint16_t)CPU_TO_FDT16(x);</a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : static inline fdt16_t cpu_to_fdt16(uint16_t x)</a>
+<a name="88"><span class="lineNum"> 88 </span> : : {</a>
+<a name="89"><span class="lineNum"> 89 </span> : : return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x);</a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 9271 : static inline uint32_t fdt32_to_cpu(fdt32_t x)</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : {</a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 9271 : return (FDT_FORCE uint32_t)CPU_TO_FDT32(x);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : }</a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 19705 : static inline fdt32_t cpu_to_fdt32(uint32_t x)</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : {</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 19705 : return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : }</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 3 : static inline uint64_t fdt64_to_cpu(fdt64_t x)</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : {</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 3 : return (FDT_FORCE uint64_t)CPU_TO_FDT64(x);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : }</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 128 : static inline fdt64_t cpu_to_fdt64(uint64_t x)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : {</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 128 : return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : }</a>
+<a name="109"><span class="lineNum"> 109 </span> : : #undef CPU_TO_FDT64</a>
+<a name="110"><span class="lineNum"> 110 </span> : : #undef CPU_TO_FDT32</a>
+<a name="111"><span class="lineNum"> 111 </span> : : #undef CPU_TO_FDT16</a>
+<a name="112"><span class="lineNum"> 112 </span> : : #undef EXTRACT_BYTE</a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : #ifdef __APPLE__</a>
+<a name="115"><span class="lineNum"> 115 </span> : : #include &lt;AvailabilityMacros.h&gt;</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : /* strnlen() is not available on Mac OS &lt; 10.7 */</a>
+<a name="118"><span class="lineNum"> 118 </span> : : # if !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MAX_ALLOWED &lt; \</a>
+<a name="119"><span class="lineNum"> 119 </span> : : MAC_OS_X_VERSION_10_7)</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : #define strnlen fdt_strnlen</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> : : /*</a>
+<a name="124"><span class="lineNum"> 124 </span> : : * fdt_strnlen: returns the length of a string or max_count - which ever is</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * smallest.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : * Input 1 string: the string whose size is to be determined</a>
+<a name="127"><span class="lineNum"> 127 </span> : : * Input 2 max_count: the maximum value returned by this function</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * Output: length of the string or max_count (the smallest of the two)</a>
+<a name="129"><span class="lineNum"> 129 </span> : : */</a>
+<a name="130"><span class="lineNum"> 130 </span> : : static inline size_t fdt_strnlen(const char *string, size_t max_count)</a>
+<a name="131"><span class="lineNum"> 131 </span> : : {</a>
+<a name="132"><span class="lineNum"> 132 </span> : : const char *p = memchr(string, 0, max_count);</a>
+<a name="133"><span class="lineNum"> 133 </span> : : return p ? p - string : max_count;</a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : #endif /* !defined(MAC_OS_X_VERSION_10_7) || (MAC_OS_X_VERSION_MAX_ALLOWED &lt;</a>
+<a name="137"><span class="lineNum"> 137 </span> : : MAC_OS_X_VERSION_10_7) */</a>
+<a name="138"><span class="lineNum"> 138 </span> : : </a>
+<a name="139"><span class="lineNum"> 139 </span> : : #endif /* __APPLE__ */</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : #endif /* LIBFDT_ENV_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt_internal.h.func-sort-c.html b/coverage-report/libfdt/libfdt_internal.h.func-sort-c.html
new file mode 100644
index 0000000..520e82f
--- /dev/null
+++ b/coverage-report/libfdt/libfdt_internal.h.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt_internal.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt_internal.h<span style="font-size: 80%;"> (<a href="libfdt_internal.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libfdt_internal.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_internal.h.gcov.html#79">fdt_mem_rsv_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_internal.h.gcov.html#74">fdt_offset_ptr_w_</a></td>
+ <td class="coverFnHi">6044</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_internal.h.gcov.html#69">fdt_offset_ptr_</a></td>
+ <td class="coverFnHi">20326</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt_internal.h.func.html b/coverage-report/libfdt/libfdt_internal.h.func.html
new file mode 100644
index 0000000..405554a
--- /dev/null
+++ b/coverage-report/libfdt/libfdt_internal.h.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt_internal.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt_internal.h<span style="font-size: 80%;"> (<a href="libfdt_internal.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libfdt_internal.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_internal.h.gcov.html#79">fdt_mem_rsv_</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_internal.h.gcov.html#69">fdt_offset_ptr_</a></td>
+ <td class="coverFnHi">20326</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libfdt_internal.h.gcov.html#74">fdt_offset_ptr_w_</a></td>
+ <td class="coverFnHi">6044</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libfdt/libfdt_internal.h.gcov.html b/coverage-report/libfdt/libfdt_internal.h.gcov.html
new file mode 100644
index 0000000..d08327b
--- /dev/null
+++ b/coverage-report/libfdt/libfdt_internal.h.gcov.html
@@ -0,0 +1,181 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libfdt/libfdt_internal.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libfdt</a> - libfdt_internal.h<span style="font-size: 80%;"> (source / <a href="libfdt_internal.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryLo">50.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : #ifndef LIBFDT_INTERNAL_H</a>
+<a name="2"><span class="lineNum"> 2 </span> : : #define LIBFDT_INTERNAL_H</a>
+<a name="3"><span class="lineNum"> 3 </span> : : /*</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * libfdt - Flat Device Tree manipulation</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright (C) 2006 David Gibson, IBM Corporation.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : *</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * libfdt is dual licensed: you can use it either under the terms of</a>
+<a name="8"><span class="lineNum"> 8 </span> : : * the GPL, or the BSD license, at your option.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : *</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * a) This library is free software; you can redistribute it and/or</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * modify it under the terms of the GNU General Public License as</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * published by the Free Software Foundation; either version 2 of the</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * License, or (at your option) any later version.</a>
+<a name="14"><span class="lineNum"> 14 </span> : : *</a>
+<a name="15"><span class="lineNum"> 15 </span> : : * This library is distributed in the hope that it will be useful,</a>
+<a name="16"><span class="lineNum"> 16 </span> : : * but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="17"><span class="lineNum"> 17 </span> : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</a>
+<a name="18"><span class="lineNum"> 18 </span> : : * GNU General Public License for more details.</a>
+<a name="19"><span class="lineNum"> 19 </span> : : *</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * You should have received a copy of the GNU General Public</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * License along with this library; if not, write to the Free</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * MA 02110-1301 USA</a>
+<a name="24"><span class="lineNum"> 24 </span> : : *</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * Alternatively,</a>
+<a name="26"><span class="lineNum"> 26 </span> : : *</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * b) Redistribution and use in source and binary forms, with or</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * without modification, are permitted provided that the following</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * conditions are met:</a>
+<a name="30"><span class="lineNum"> 30 </span> : : *</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * 1. Redistributions of source code must retain the above</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * disclaimer.</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * 2. Redistributions in binary form must reproduce the above</a>
+<a name="35"><span class="lineNum"> 35 </span> : : * copyright notice, this list of conditions and the following</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * disclaimer in the documentation and/or other materials</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * provided with the distribution.</a>
+<a name="38"><span class="lineNum"> 38 </span> : : *</a>
+<a name="39"><span class="lineNum"> 39 </span> : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES,</a>
+<a name="41"><span class="lineNum"> 41 </span> : : * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT</a>
+<a name="46"><span class="lineNum"> 46 </span> : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</a>
+<a name="48"><span class="lineNum"> 48 </span> : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</a>
+<a name="49"><span class="lineNum"> 49 </span> : : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR</a>
+<a name="50"><span class="lineNum"> 50 </span> : : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</a>
+<a name="52"><span class="lineNum"> 52 </span> : : */</a>
+<a name="53"><span class="lineNum"> 53 </span> : : #include &lt;fdt.h&gt;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : #define FDT_ALIGN(x, a) (((x) + (a) - 1) &amp; ~((a) - 1))</a>
+<a name="56"><span class="lineNum"> 56 </span> : : #define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE))</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : int fdt_ro_probe_(const void *fdt);</a>
+<a name="59"><span class="lineNum"> 59 </span> : : #define FDT_RO_PROBE(fdt) \</a>
+<a name="60"><span class="lineNum"> 60 </span> : : { \</a>
+<a name="61"><span class="lineNum"> 61 </span> : : int err_; \</a>
+<a name="62"><span class="lineNum"> 62 </span> : : if ((err_ = fdt_ro_probe_(fdt)) != 0) \</a>
+<a name="63"><span class="lineNum"> 63 </span> : : return err_; \</a>
+<a name="64"><span class="lineNum"> 64 </span> : : }</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : int fdt_check_node_offset_(const void *fdt, int offset);</a>
+<a name="67"><span class="lineNum"> 67 </span> : : int fdt_check_prop_offset_(const void *fdt, int offset);</a>
+<a name="68"><span class="lineNum"> 68 </span> : : const char *fdt_find_string_(const char *strtab, int tabsize, const char *s);</a>
+<a name="69"><span class="lineNum"> 69 </span> : : int fdt_node_end_offset_(void *fdt, int nodeoffset);</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 20326 : static inline const void *fdt_offset_ptr_(const void *fdt, int offset)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 20326 : return (const char *)fdt + fdt_off_dt_struct(fdt) + offset;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : }</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 6044 : static inline void *fdt_offset_ptr_w_(void *fdt, int offset)</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : {</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 6044 : return (void *)(uintptr_t)fdt_offset_ptr_(fdt, offset);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : static inline const struct fdt_reserve_entry *fdt_mem_rsv_(const void *fdt, int n)</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : {</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : const struct fdt_reserve_entry *rsv_table =</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : (const struct fdt_reserve_entry *)</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : ((const char *)fdt + fdt_off_mem_rsvmap(fdt));</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : return rsv_table + n;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : static inline struct fdt_reserve_entry *fdt_mem_rsv_w_(void *fdt, int n)</a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> : : return (void *)(uintptr_t)fdt_mem_rsv_(fdt, n);</a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : #define FDT_SW_MAGIC (~FDT_MAGIC)</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : #endif /* LIBFDT_INTERNAL_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/blocklevel.c.func-sort-c.html b/coverage-report/libflash/blocklevel.c.func-sort-c.html
new file mode 100644
index 0000000..1165c3f
--- /dev/null
+++ b/coverage-report/libflash/blocklevel.c.func-sort-c.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">241</td>
+ <td class="headerCovTableEntry">407</td>
+ <td class="headerCovTableEntryLo">59.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">93.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="blocklevel.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#56">with_ecc_pos</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnHi">42</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnHi">47</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnHi">488</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnHi">492</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">540</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnHi">778</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">3340</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">3922</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">3922</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/blocklevel.c.func.html b/coverage-report/libflash/blocklevel.c.func.html
new file mode 100644
index 0000000..0fe4d4d
--- /dev/null
+++ b/coverage-report/libflash/blocklevel.c.func.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - blocklevel.c<span style="font-size: 80%;"> (<a href="blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">241</td>
+ <td class="headerCovTableEntry">407</td>
+ <td class="headerCovTableEntryLo">59.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">93.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="blocklevel.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#727">blocklevel_ecc_protect</a></td>
+ <td class="coverFnHi">42</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#285">blocklevel_erase</a></td>
+ <td class="coverFnHi">3340</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#355">blocklevel_flashcmp</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#319">blocklevel_get_info</a></td>
+ <td class="coverFnHi">47</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#80">blocklevel_raw_read</a></td>
+ <td class="coverFnHi">492</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#166">blocklevel_raw_write</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#101">blocklevel_read</a></td>
+ <td class="coverFnHi">488</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#374">blocklevel_smart_erase</a></td>
+ <td class="coverFnHi">778</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#505">blocklevel_smart_write</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#188">blocklevel_write</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#23">ecc_protected</a></td>
+ <td class="coverFnHi">540</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#643">insert_bl_prot_range</a></td>
+ <td class="coverFnHi">41</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#61">reacquire</a></td>
+ <td class="coverFnHi">3922</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#68">release</a></td>
+ <td class="coverFnHi">3922</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="blocklevel.c.gcov.html#56">with_ecc_pos</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/blocklevel.c.gcov.html b/coverage-report/libflash/blocklevel.c.gcov.html
new file mode 100644
index 0000000..5112889
--- /dev/null
+++ b/coverage-report/libflash/blocklevel.c.gcov.html
@@ -0,0 +1,826 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/blocklevel.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - blocklevel.c<span style="font-size: 80%;"> (source / <a href="blocklevel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">241</td>
+ <td class="headerCovTableEntry">407</td>
+ <td class="headerCovTableEntryLo">59.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntry">15</td>
+ <td class="headerCovTableEntryHi">93.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;errno.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;libflash/errors.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : #define PROT_REALLOC_NUM 25</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : /* This function returns tristate values.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * 1 - The region is ECC protected</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * 0 - The region is not ECC protected</a>
+<a name="23"><span class="lineNum"> 23 </span> : : * -1 - Partially protected</a>
+<a name="24"><span class="lineNum"> 24 </span> : : */</a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 540 : static int ecc_protected(struct blocklevel_device *bl, uint64_t pos, uint64_t len, uint64_t *start)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : {</a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 122 : int i;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Length of 0 is nonsensical so add 1 */</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 540 : if (len == 0)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 2 : len = 1;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 554 : for (i = 0; i &lt; bl-&gt;ecc_prot.n_prot; i++) {</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* Fits entirely within the range */</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 139 : if (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 138 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt;= pos + len) {</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 123 : if (start)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 116 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 123 : return 1;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : /*</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * Even if ranges are merged we can't currently guarantee two</a>
+<a name="44"><span class="lineNum"> 44 </span> : : * contiguous regions are sanely ECC protected so a partial fit</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * is no good.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 16 : if ((bl-&gt;ecc_prot.prot[i].start &gt;= pos &amp;&amp; bl-&gt;ecc_prot.prot[i].start &lt; pos + len) ||</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 15 : (bl-&gt;ecc_prot.prot[i].start &lt;= pos &amp;&amp;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 14 : bl-&gt;ecc_prot.prot[i].start + bl-&gt;ecc_prot.prot[i].len &gt; pos)) {</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 2 : if (start)</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : *start = bl-&gt;ecc_prot.prot[i].start;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 2 : return -1;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 394 : return 0;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 116 : static uint64_t with_ecc_pos(uint64_t ecc_start, uint64_t pos)</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : {</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 116 : return pos + ((pos - ecc_start) / (BYTES_PER_ECC));</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 3922 : static int reacquire(struct blocklevel_device *bl)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 3922 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;reacquire)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : return bl-&gt;reacquire(bl);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 427 : return 0;</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 3922 : static int release(struct blocklevel_device *bl)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 3922 : int rc = 0;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 3922 : if (!bl-&gt;keep_alive &amp;&amp; bl-&gt;release) {</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : /* This is the error return path a lot, preserve errno */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : int err = errno;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;release(bl);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 3922 : return rc;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 492 : int blocklevel_raw_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 107 : int rc;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 492 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 492 : if (!bl || !bl-&gt;read || !buf) {</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 492 : rc = reacquire(bl);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 492 : if (rc)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 492 : rc = bl-&gt;read(bl, pos, buf, len);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 492 : release(bl);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 492 : return rc;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 488 : int blocklevel_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 107 : int rc, ecc_protection;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 107 : struct ecc64 *buffer;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 107 : uint64_t ecc_pos, ecc_start, ecc_diff, ecc_len;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 488 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 488 : if (!bl || !buf) {</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : }</a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 488 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 488 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="119"><span class="lineNum"> 119 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 488 : if (!ecc_protection)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 389 : return blocklevel_raw_read(bl, pos, buf, len);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /*</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * The region we're reading to has both ecc protection and not.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="127"><span class="lineNum"> 127 </span> : : */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 99 : if (ecc_protection == -1) {</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 99 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 99 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 99 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 99 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 99 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="142"><span class="lineNum"> 142 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 99 : buffer = malloc(ecc_len);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 99 : if (!buffer) {</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 99 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, ecc_len);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 99 : if (rc)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> : : /*</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * Could optimise and simply call memcpy_from_ecc() if ecc_diff</a>
+<a name="156"><span class="lineNum"> 156 </span> : : * == 0 but _unaligned checks and bascially does that for us</a>
+<a name="157"><span class="lineNum"> 157 </span> : : */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 99 : if (memcpy_from_ecc_unaligned(buf, buffer, len, ecc_diff)) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 99 : out:</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 99 : free(buffer);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 99 : return rc;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 41 : int blocklevel_raw_write(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : const void *buf, uint64_t len)</a>
+<a name="170"><span class="lineNum"> 170 </span> : : {</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 15 : int rc;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 41 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 41 : if (!bl || !bl-&gt;write || !buf) {</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 41 : rc = reacquire(bl);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 41 : if (rc)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 41 : rc = bl-&gt;write(bl, pos, buf, len);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 41 : release(bl);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 41 : return rc;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : }</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 41 : int blocklevel_write(struct blocklevel_device *bl, uint64_t pos, const void *buf,</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : uint64_t len)</a>
+<a name="192"><span class="lineNum"> 192 </span> : : {</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 15 : int rc, ecc_protection;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 15 : struct ecc64 *buffer;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 15 : uint64_t ecc_len;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 15 : uint64_t ecc_start, ecc_pos, ecc_diff;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 41 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t%p\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, buf, len);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 41 : if (!bl || !buf) {</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : }</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 41 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 41 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot; for 0x%&quot; PRIx64 &quot; ecc=%s\n&quot;,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : __func__, pos, len, ecc_protection ?</a>
+<a name="208"><span class="lineNum"> 208 </span> : : (ecc_protection == -1 ? &quot;partial&quot; : &quot;yes&quot;) : &quot;no&quot;);</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 41 : if (!ecc_protection)</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 24 : return blocklevel_raw_write(bl, pos, buf, len);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /*</a>
+<a name="214"><span class="lineNum"> 214 </span> : : * The region we're writing to has both ecc protection and not.</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * Perhaps one day in the future blocklevel can cope with this.</a>
+<a name="216"><span class="lineNum"> 216 </span> : : */</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 17 : if (ecc_protection == -1) {</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : }</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 17 : pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 17 : ecc_pos = ecc_buffer_align(ecc_start, pos);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 17 : ecc_diff = pos - ecc_pos;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 17 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 17 : FL_DBG(&quot;%s: adjusted_pos: 0x%&quot; PRIx64 &quot;, ecc_pos: 0x%&quot; PRIx64</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : &quot;, ecc_diff: 0x%&quot; PRIx64 &quot;, ecc_len: 0x%&quot; PRIx64 &quot;\n&quot;,</a>
+<a name="231"><span class="lineNum"> 231 </span> : : __func__, pos, ecc_pos, ecc_diff, ecc_len);</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 17 : buffer = malloc(ecc_len);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 17 : if (!buffer) {</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 17 : if (ecc_diff) {</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 2 : uint64_t start_chunk = ecc_diff;</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 2 : uint64_t end_chunk = BYTES_PER_ECC - ecc_diff;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 2 : uint64_t end_len = ecc_len - end_chunk;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /*</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * Read the start bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="247"><span class="lineNum"> 247 </span> : : * to calculate the first ecc byte</a>
+<a name="248"><span class="lineNum"> 248 </span> : : */</a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 2 : rc = blocklevel_raw_read(bl, ecc_pos, buffer, start_chunk);</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 2 : if (rc) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> : : /*</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * Read the end bytes that memcpy_to_ecc_unaligned() will need</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * to calculate the last ecc byte</a>
+<a name="259"><span class="lineNum"> 259 </span> : : */</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 2 : rc = blocklevel_raw_read(bl, ecc_pos + end_len, ((char *)buffer) + end_len,</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : end_chunk);</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 2 : if (rc) {</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 2 : if (memcpy_to_ecc_unaligned(buffer, buf, len, ecc_diff)) {</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : } else {</a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 15 : if (memcpy_to_ecc(buffer, buf, len)) {</span></a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="278"><span class="lineNum"> 278 </span> : : }</a>
+<a name="279"><span class="lineNum"> 279 </span> : : }</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 17 : rc = blocklevel_raw_write(bl, pos, buffer, ecc_len);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : </a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 17 : out:</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 17 : free(buffer);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 17 : return rc;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 3340 : int blocklevel_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : {</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 3330 : int rc;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 3340 : if (!bl || !bl-&gt;erase) {</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 3340 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /* Programmer may be making a horrible mistake without knowing it */</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 3340 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_erase: pos (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : pos, bl-&gt;erase_mask + 1);</a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> : : }</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 3340 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 4 : FL_ERR(&quot;blocklevel_erase: len (0x%&quot;PRIx64&quot;) is not erase block (0x%08x) aligned\n&quot;,</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : len, bl-&gt;erase_mask + 1);</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 4 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : }</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 3336 : rc = reacquire(bl);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 3336 : if (rc)</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : </a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 3336 : rc = bl-&gt;erase(bl, pos, len);</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 3336 : release(bl);</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 3336 : return rc;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : }</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 47 : int blocklevel_get_info(struct blocklevel_device *bl, const char **name, uint64_t *total_size,</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : uint32_t *erase_granule)</a>
+<a name="323"><span class="lineNum"> 323 </span> : : {</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 43 : int rc;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 47 : if (!bl || !bl-&gt;get_info) {</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : }</a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 47 : rc = reacquire(bl);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 47 : if (rc)</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 47 : rc = bl-&gt;get_info(bl, name, total_size, erase_granule);</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : </a>
+<a name="337"><span class="lineNum"> 337 </span> : : /* Check the validity of what we are being told */</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 47 : if (erase_granule &amp;&amp; *erase_granule != bl-&gt;erase_mask + 1)</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;blocklevel_get_info: WARNING: erase_granule (0x%08x) and erase_mask&quot;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : &quot; (0x%08x) don't match\n&quot;, *erase_granule, bl-&gt;erase_mask + 1);</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 47 : release(bl);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 47 : return rc;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : }</a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+<a name="347"><span class="lineNum"> 347 </span> : : /*</a>
+<a name="348"><span class="lineNum"> 348 </span> : : * Compare flash and memory to determine if:</a>
+<a name="349"><span class="lineNum"> 349 </span> : : * a) Erase must happen before write</a>
+<a name="350"><span class="lineNum"> 350 </span> : : * b) Flash and memory are identical</a>
+<a name="351"><span class="lineNum"> 351 </span> : : * c) Flash can simply be written to</a>
+<a name="352"><span class="lineNum"> 352 </span> : : *</a>
+<a name="353"><span class="lineNum"> 353 </span> : : * returns -1 for a</a>
+<a name="354"><span class="lineNum"> 354 </span> : : * returns 0 for b</a>
+<a name="355"><span class="lineNum"> 355 </span> : : * returns 1 for c</a>
+<a name="356"><span class="lineNum"> 356 </span> : : */</a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : static int blocklevel_flashcmp(const void *flash_buf, const void *mem_buf, uint64_t len)</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : {</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : uint64_t i;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : int same = true;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : const uint8_t *f_buf, *m_buf;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : f_buf = flash_buf;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : m_buf = mem_buf;</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : if (m_buf[i] &amp; ~f_buf[i])</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : if (same &amp;&amp; (m_buf[i] != f_buf[i]))</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : same = false;</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : }</a>
+<a name="372"><span class="lineNum"> 372 </span> : : </a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : return same ? 0 : 1;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : }</a>
+<a name="375"><span class="lineNum"> 375 </span> : : </a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 778 : int blocklevel_smart_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : {</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 770 : uint64_t block_size;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 770 : void *erase_buf;</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 770 : int rc;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> : : </a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 778 : if (!bl) {</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 778 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : </a>
+<a name="389"><span class="lineNum"> 389 </span> : : /* Nothing smart needs to be done, pos and len are aligned */</a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 778 : if ((pos &amp; bl-&gt;erase_mask) == 0 &amp;&amp; (len &amp; bl-&gt;erase_mask) == 0) {</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 772 : FL_DBG(&quot;%s: Skipping smarts everything is aligned 0x%&quot; PRIx64 &quot; 0x%&quot; PRIx64</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : &quot;to 0x%08x\n&quot;, __func__, pos, len, bl-&gt;erase_mask);</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 772 : return blocklevel_erase(bl, pos, len);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : }</a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 6 : block_size = bl-&gt;erase_mask + 1;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineCov"> 6 : erase_buf = malloc(block_size);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 6 : if (!erase_buf) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : }</a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 6 : rc = reacquire(bl);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : }</a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 6 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : /*</a>
+<a name="410"><span class="lineNum"> 410 </span> : : * base_pos and base_len are the values in the first erase</a>
+<a name="411"><span class="lineNum"> 411 </span> : : * block that we need to preserve: the region up to pos.</a>
+<a name="412"><span class="lineNum"> 412 </span> : : */</a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 4 : uint64_t base_pos = pos &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 4 : uint64_t base_len = pos - base_pos;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 4 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : __func__, base_pos, base_pos + base_len);</a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> : : /*</a>
+<a name="420"><span class="lineNum"> 420 </span> : : * Read the entire block in case this is the ONLY block we're</a>
+<a name="421"><span class="lineNum"> 421 </span> : : * modifying, we may need the end chunk of it later</a>
+<a name="422"><span class="lineNum"> 422 </span> : : */</a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 4 : rc = bl-&gt;read(bl, base_pos, erase_buf, block_size);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 4 : if (rc)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 4 : rc = bl-&gt;erase(bl, base_pos, block_size);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 4 : if (rc)</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 4 : rc = bl-&gt;write(bl, base_pos, erase_buf, base_len);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 4 : if (rc)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /*</a>
+<a name="436"><span class="lineNum"> 436 </span> : : * The requested erase fits entirely into this erase block and</a>
+<a name="437"><span class="lineNum"> 437 </span> : : * so we need to write back the chunk at the end of the block</a>
+<a name="438"><span class="lineNum"> 438 </span> : : */</a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 4 : if (base_pos + base_len + len &lt; base_pos + block_size) {</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 1 : rc = bl-&gt;write(bl, pos + len, erase_buf + base_len + len,</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 1 : block_size - base_len - len);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;%s: Early exit, everything was in one erase block\n&quot;,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : __func__);</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 1 : goto out;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 3 : pos += block_size - base_len;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 3 : len -= block_size - base_len;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* Now we should be aligned, best to double check */</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 5 : if (pos &amp; bl-&gt;erase_mask) {</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s:pos 0x%&quot; PRIx64 &quot; isn't erase_mask 0x%08x aligned\n&quot;,</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : __func__, pos, bl-&gt;erase_mask);</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : }</a>
+<a name="458"><span class="lineNum"> 458 </span> : : </a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 5 : if (len &amp; ~(bl-&gt;erase_mask)) {</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 3 : rc = bl-&gt;erase(bl, pos, len &amp; ~(bl-&gt;erase_mask));</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : </a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 3 : pos += len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineCov"> 3 : len -= len &amp; ~(bl-&gt;erase_mask);</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : }</a>
+<a name="467"><span class="lineNum"> 467 </span> : : </a>
+<a name="468"><span class="lineNum"> 468 </span> : : /* Length should be less than a block now */</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 5 : if (len &gt; block_size) {</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: len 0x%&quot; PRIx64 &quot; is still exceeds block_size 0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : __func__, len, block_size);</a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : }</a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 5 : if (len &amp; bl-&gt;erase_mask) {</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : /*</a>
+<a name="478"><span class="lineNum"> 478 </span> : : * top_pos is the first byte that must be preserved and</a>
+<a name="479"><span class="lineNum"> 479 </span> : : * top_len is the length from top_pos to the end of the erase</a>
+<a name="480"><span class="lineNum"> 480 </span> : : * block: the region that must be preserved</a>
+<a name="481"><span class="lineNum"> 481 </span> : : */</a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 3 : uint64_t top_pos = pos + len;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 3 : uint64_t top_len = block_size - len;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineCov"> 3 : FL_DBG(&quot;%s: preserving 0x%&quot; PRIx64 &quot;..0x%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : __func__, top_pos, top_pos + top_len);</a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineCov"> 3 : rc = bl-&gt;read(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 3 : rc = bl-&gt;erase(bl, pos, block_size);</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> : : </a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 3 : rc = bl-&gt;write(bl, top_pos, erase_buf, top_len);</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="499"><span class="lineNum"> 499 </span> : : }</a>
+<a name="500"><span class="lineNum"> 500 </span> : : </a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 5 : out:</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 6 : free(erase_buf);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 6 : release(bl);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 6 : return rc;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 11 : int blocklevel_smart_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len)</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : {</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 11 : void *ecc_buf = NULL;</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 11 : uint64_t ecc_start;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 11 : int ecc_protection;</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 11 : void *erase_buf = NULL;</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 11 : uint32_t erase_size;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : </a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineCov"> 11 : const void *write_buf;</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 11 : uint64_t write_len;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineCov"> 11 : uint64_t write_pos;</span></a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 11 : int rc = 0;</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 11 : if (!buf || !bl) {</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 11 : FL_DBG(&quot;%s: 0x%&quot; PRIx64 &quot;\t0x%&quot; PRIx64 &quot;\n&quot;, __func__, pos, len);</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : </a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 11 : if (!(bl-&gt;flags &amp; WRITE_NEED_ERASE)) {</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 11 : FL_DBG(&quot;%s: backend doesn't need erase\n&quot;, __func__);</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 11 : return blocklevel_write(bl, pos, buf, len);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_get_info(bl, NULL, NULL, &amp;erase_size);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : ecc_protection = ecc_protected(bl, pos, len, &amp;ecc_start);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (ecc_protection == -1) {</span></a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: Can't cope with partial ecc\n&quot;, __func__);</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : errno = EINVAL;</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : }</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : if (ecc_protection) {</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : uint64_t ecc_pos, ecc_align, ecc_diff, ecc_len;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : </a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region has ECC\n&quot;, __func__);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : ecc_pos = with_ecc_pos(ecc_start, pos);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : ecc_align = ecc_buffer_align(ecc_start, ecc_pos);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : ecc_diff = ecc_pos - ecc_align;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : ecc_len = ecc_buffer_size(len + ecc_diff);</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : ecc_buf = malloc(ecc_len);</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : if (!ecc_buf) {</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> : : }</a>
+<a name="560"><span class="lineNum"> 560 </span> : : </a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : if (ecc_diff) {</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_read(bl, ecc_align, ecc_buf, ecc_diff);</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : }</a>
+<a name="569"><span class="lineNum"> 569 </span> : : </a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineNoCov"> 0 : rc = memcpy_to_ecc_unaligned(ecc_buf, buf, len, ecc_diff);</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : errno = EBADF;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ECC_INVALID;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : }</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineNoCov"> 0 : write_buf = ecc_buf;</span></a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineNoCov"> 0 : write_len = ecc_len;</span></a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineNoCov"> 0 : write_pos = ecc_pos;</span></a>
+<a name="580"><span class="lineNum"> 580 </span> : : } else {</a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : write_buf = buf;</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : write_len = len;</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : write_pos = pos;</span></a>
+<a name="584"><span class="lineNum"> 584 </span> : : }</a>
+<a name="585"><span class="lineNum"> 585 </span> : : </a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : erase_buf = malloc(erase_size);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineNoCov"> 0 : if (!erase_buf) {</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : errno = ENOMEM;</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : }</a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : rc = reacquire(bl);</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : goto out_free;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : </a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineNoCov"> 0 : while (write_len &gt; 0) {</span></a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineNoCov"> 0 : uint32_t erase_block = write_pos &amp; ~(erase_size - 1);</span></a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineNoCov"> 0 : uint32_t block_offset = write_pos &amp; (erase_size - 1);</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : uint32_t chunk_size = erase_size &gt; write_len ?</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : write_len : erase_size;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : int cmp;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : </a>
+<a name="604"><span class="lineNum"> 604 </span> : : /* Write crosses an erase boundary, shrink the write to the boundary */</a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : if (erase_size &lt; block_offset + chunk_size) {</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : chunk_size = erase_size - block_offset;</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : }</a>
+<a name="608"><span class="lineNum"> 608 </span> : : </a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;read(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineNoCov"> 0 : cmp = blocklevel_flashcmp(erase_buf + block_offset, write_buf,</span></a>
+<a name="614"><span class="lineNum"> 614 </span> : : chunk_size);</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: region 0x%08x..0x%08x &quot;, __func__,</span></a>
+<a name="616"><span class="lineNum"> 616 </span> : : erase_block, erase_size);</a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineNoCov"> 0 : if (cmp != 0) {</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;needs &quot;);</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : if (cmp == -1) {</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;erase and &quot;);</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : bl-&gt;erase(bl, erase_block, erase_size);</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : }</a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;write\n&quot;);</span></a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : memcpy(erase_buf + block_offset, write_buf, chunk_size);</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineNoCov"> 0 : rc = bl-&gt;write(bl, erase_block, erase_buf, erase_size);</span></a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : } else {</a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;clean\n&quot;);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : write_len -= chunk_size;</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : write_pos += chunk_size;</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : write_buf += chunk_size;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : }</a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : release(bl);</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : out_free:</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : free(ecc_buf);</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : free(erase_buf);</span></a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="643"><span class="lineNum"> 643 </span> : : }</a>
+<a name="644"><span class="lineNum"> 644 </span> : : </a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 41 : static bool insert_bl_prot_range(struct blocklevel_range *ranges, struct bl_prot_range range)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : {</a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 23 : int i;</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineCov"> 23 : uint32_t pos, len;</span></a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineCov"> 41 : struct bl_prot_range *prot = ranges-&gt;prot;</span></a>
+<a name="650"><span class="lineNum"> 650 </span> : : </a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 41 : pos = range.start;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 41 : len = range.len;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 41 : if (len == 0)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* Check for overflow */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineCov"> 41 : if (pos + len &lt; len)</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineCov"> 1 : return false;</span></a>
+<a name="660"><span class="lineNum"> 660 </span> : : </a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 81 : for (i = 0; i &lt; ranges-&gt;n_prot &amp;&amp; len &gt; 0; i++) {</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 44 : if (prot[i].start &lt;= pos &amp;&amp; prot[i].start + prot[i].len &gt;= pos + len) {</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 1 : len = 0;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineCov"> 1 : break; /* Might as well, the next two conditions can't be true */</span></a>
+<a name="665"><span class="lineNum"> 665 </span> : : }</a>
+<a name="666"><span class="lineNum"> 666 </span> : : </a>
+<a name="667"><span class="lineNum"> 667 </span> : : /* Can easily extend this down just by adjusting start */</a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 43 : if (pos &lt;= prot[i].start &amp;&amp; pos + len &gt;= prot[i].start) {</span></a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineCov"> 5 : FL_DBG(&quot;%s: extending start down\n&quot;, __func__);</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineCov"> 5 : prot[i].len += prot[i].start - pos;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineCov"> 5 : prot[i].start = pos;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineCov"> 5 : pos += prot[i].len;</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineCov"> 5 : if (prot[i].len &gt;= len)</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineCov"> 2 : len = 0;</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : else</a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineCov"> 3 : len -= prot[i].len;</span></a>
+<a name="677"><span class="lineNum"> 677 </span> : : }</a>
+<a name="678"><span class="lineNum"> 678 </span> : : </a>
+<a name="679"><span class="lineNum"> 679 </span> : : /*</a>
+<a name="680"><span class="lineNum"> 680 </span> : : * Jump over this range but the new range might be so big that</a>
+<a name="681"><span class="lineNum"> 681 </span> : : * theres a chunk after</a>
+<a name="682"><span class="lineNum"> 682 </span> : : */</a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineCov"> 43 : if (pos &gt;= prot[i].start &amp;&amp; pos &lt; prot[i].start + prot[i].len) {</span></a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;%s: fits within current range &quot;, __func__);</span></a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineCov"> 1 : if (prot[i].start + prot[i].len - pos &gt; len) {</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;but there is some extra at the end\n&quot;);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : len -= prot[i].start + prot[i].len - pos;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : pos = prot[i].start + prot[i].len;</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : } else {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;\n&quot;);</span></a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineCov"> 1 : len = 0;</span></a>
+<a name="692"><span class="lineNum"> 692 </span> : : }</a>
+<a name="693"><span class="lineNum"> 693 </span> : : }</a>
+<a name="694"><span class="lineNum"> 694 </span> : : /*</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * This condition will be true if the range is smaller than</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * the current range, therefore it should go here!</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineCov"> 43 : if (pos &lt; prot[i].start &amp;&amp; pos + len &lt;= prot[i].start)</span></a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="700"><span class="lineNum"> 700 </span> : : }</a>
+<a name="701"><span class="lineNum"> 701 </span> : : </a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineCov"> 40 : if (len) {</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 36 : int insert_pos = i;</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineCov"> 36 : struct bl_prot_range *new_ranges = ranges-&gt;prot;</span></a>
+<a name="705"><span class="lineNum"> 705 </span> : : </a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 36 : FL_DBG(&quot;%s: adding 0x%08x..0x%08x\n&quot;, __func__, pos, pos + len);</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 36 : if (ranges-&gt;n_prot == ranges-&gt;total_prot) {</span></a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineCov"> 25 : new_ranges = realloc(ranges-&gt;prot,</span></a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 25 : sizeof(range) * ((ranges-&gt;n_prot) + PROT_REALLOC_NUM));</span></a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineCov"> 25 : if (!new_ranges)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 25 : ranges-&gt;total_prot += PROT_REALLOC_NUM;</span></a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineCov"> 36 : if (insert_pos != ranges-&gt;n_prot)</span></a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineCov"> 6 : for (i = ranges-&gt;n_prot; i &gt; insert_pos; i--)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 4 : memcpy(&amp;new_ranges[i], &amp;new_ranges[i - 1], sizeof(range));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 36 : range.start = pos;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineCov"> 36 : range.len = len;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 36 : memcpy(&amp;new_ranges[insert_pos], &amp;range, sizeof(range));</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 36 : ranges-&gt;prot = new_ranges;</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 36 : ranges-&gt;n_prot++;</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 36 : prot = new_ranges;</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : }</a>
+<a name="725"><span class="lineNum"> 725 </span> : : </a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineCov"> 17 : return true;</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : }</a>
+<a name="728"><span class="lineNum"> 728 </span> : : </a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineCov"> 42 : int blocklevel_ecc_protect(struct blocklevel_device *bl, uint32_t start, uint32_t len)</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : {</a>
+<a name="731"><span class="lineNum"> 731 </span> : : /*</a>
+<a name="732"><span class="lineNum"> 732 </span> : : * Could implement this at hardware level by having an accessor to the</a>
+<a name="733"><span class="lineNum"> 733 </span> : : * backend in struct blocklevel_device and as a result do nothing at</a>
+<a name="734"><span class="lineNum"> 734 </span> : : * this level (although probably not for ecc!)</a>
+<a name="735"><span class="lineNum"> 735 </span> : : */</a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineCov"> 42 : struct bl_prot_range range = { .start = start, .len = len };</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : </a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineCov"> 42 : if (len &lt; BYTES_PER_ECC)</span></a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineCov"> 1 : return -1;</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 41 : return !insert_bl_prot_range(&amp;bl-&gt;ecc_prot, range);</span></a>
+<a name="741"><span class="lineNum"> 741 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ecc.c.func-sort-c.html b/coverage-report/libflash/ecc.c.func-sort-c.html
new file mode 100644
index 0000000..5e28af3
--- /dev/null
+++ b/coverage-report/libflash/ecc.c.func-sort-c.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">105</td>
+ <td class="headerCovTableEntry">117</td>
+ <td class="headerCovTableEntryMed">89.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#171">inc_uint64_by</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#166">inc_beint64_by</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#176">inc_ecc64_by</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#186">whole_ecc_structs</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#181">whole_ecc_bytes</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnHi">99</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#135">eccflipbit</a></td>
+ <td class="coverFnHi">128</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnHi">163</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnHi">864</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnHi">928</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#106">eccgenerate</a></td>
+ <td class="coverFnHi">16647</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ecc.c.func.html b/coverage-report/libflash/ecc.c.func.html
new file mode 100644
index 0000000..858c84f
--- /dev/null
+++ b/coverage-report/libflash/ecc.c.func.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ecc.c<span style="font-size: 80%;"> (<a href="ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">105</td>
+ <td class="headerCovTableEntry">117</td>
+ <td class="headerCovTableEntryMed">89.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#143">eccbyte</a></td>
+ <td class="coverFnHi">864</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#135">eccflipbit</a></td>
+ <td class="coverFnHi">128</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#106">eccgenerate</a></td>
+ <td class="coverFnHi">16647</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#129">eccverify</a></td>
+ <td class="coverFnHi">928</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#166">inc_beint64_by</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#176">inc_ecc64_by</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#171">inc_uint64_by</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#205">memcpy_from_ecc</a></td>
+ <td class="coverFnHi">163</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#261">memcpy_from_ecc_unaligned</a></td>
+ <td class="coverFnHi">99</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#328">memcpy_to_ecc</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#395">memcpy_to_ecc_unaligned</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#181">whole_ecc_bytes</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.c.gcov.html#186">whole_ecc_structs</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ecc.c.gcov.html b/coverage-report/libflash/ecc.c.gcov.html
new file mode 100644
index 0000000..961ed1a
--- /dev/null
+++ b/coverage-report/libflash/ecc.c.gcov.html
@@ -0,0 +1,534 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ecc.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ecc.c<span style="font-size: 80%;"> (source / <a href="ecc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">105</td>
+ <td class="headerCovTableEntry">117</td>
+ <td class="headerCovTableEntryMed">89.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2019 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : /* Bit field identifiers for syndrome calculations. */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : enum eccbitfields</a>
+<a name="19"><span class="lineNum"> 19 </span> : : {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : GD = 0xff, //&lt; Good, ECC matches.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : UE = 0xfe, //&lt; Uncorrectable.</a>
+<a name="22"><span class="lineNum"> 22 </span> : : E0 = 71, //&lt; Error in ECC bit 0</a>
+<a name="23"><span class="lineNum"> 23 </span> : : E1 = 70, //&lt; Error in ECC bit 1</a>
+<a name="24"><span class="lineNum"> 24 </span> : : E2 = 69, //&lt; Error in ECC bit 2</a>
+<a name="25"><span class="lineNum"> 25 </span> : : E3 = 68, //&lt; Error in ECC bit 3</a>
+<a name="26"><span class="lineNum"> 26 </span> : : E4 = 67, //&lt; Error in ECC bit 4</a>
+<a name="27"><span class="lineNum"> 27 </span> : : E5 = 66, //&lt; Error in ECC bit 5</a>
+<a name="28"><span class="lineNum"> 28 </span> : : E6 = 65, //&lt; Error in ECC bit 6</a>
+<a name="29"><span class="lineNum"> 29 </span> : : E7 = 64 //&lt; Error in ECC bit 7</a>
+<a name="30"><span class="lineNum"> 30 </span> : : /* 0-63 Correctable bit in byte */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : };</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /*</a>
+<a name="34"><span class="lineNum"> 34 </span> : : * Matrix used for ECC calculation.</a>
+<a name="35"><span class="lineNum"> 35 </span> : : *</a>
+<a name="36"><span class="lineNum"> 36 </span> : : * Each row of this is the set of data word bits that are used for</a>
+<a name="37"><span class="lineNum"> 37 </span> : : * the calculation of the corresponding ECC bit. The parity of the</a>
+<a name="38"><span class="lineNum"> 38 </span> : : * bitset is the value of the ECC bit.</a>
+<a name="39"><span class="lineNum"> 39 </span> : : *</a>
+<a name="40"><span class="lineNum"> 40 </span> : : * ie. ECC[n] = eccMatrix[n] &amp; data</a>
+<a name="41"><span class="lineNum"> 41 </span> : : *</a>
+<a name="42"><span class="lineNum"> 42 </span> : : * Note: To make the math easier (and less shifts in resulting code),</a>
+<a name="43"><span class="lineNum"> 43 </span> : : * row0 = ECC7. HW numbering is MSB, order here is LSB.</a>
+<a name="44"><span class="lineNum"> 44 </span> : : *</a>
+<a name="45"><span class="lineNum"> 45 </span> : : * These values come from the HW design of the ECC algorithm.</a>
+<a name="46"><span class="lineNum"> 46 </span> : : */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : static uint64_t eccmatrix[] = {</a>
+<a name="48"><span class="lineNum"> 48 </span> : : 0x0000e8423c0f99ffull,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : 0x00e8423c0f99ff00ull,</a>
+<a name="50"><span class="lineNum"> 50 </span> : : 0xe8423c0f99ff0000ull,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : 0x423c0f99ff0000e8ull,</a>
+<a name="52"><span class="lineNum"> 52 </span> : : 0x3c0f99ff0000e842ull,</a>
+<a name="53"><span class="lineNum"> 53 </span> : : 0x0f99ff0000e8423cull,</a>
+<a name="54"><span class="lineNum"> 54 </span> : : 0x99ff0000e8423c0full,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : 0xff0000e8423c0f99ull</a>
+<a name="56"><span class="lineNum"> 56 </span> : : };</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : /**</a>
+<a name="59"><span class="lineNum"> 59 </span> : : * Syndrome calculation matrix.</a>
+<a name="60"><span class="lineNum"> 60 </span> : : *</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * Maps syndrome to flipped bit.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : *</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * To perform ECC correction, this matrix is a look-up of the bit</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * that is bad based on the binary difference of the good and bad</a>
+<a name="65"><span class="lineNum"> 65 </span> : : * ECC. This difference is called the &quot;syndrome&quot;.</a>
+<a name="66"><span class="lineNum"> 66 </span> : : *</a>
+<a name="67"><span class="lineNum"> 67 </span> : : * When a particular bit is on in the data, it cause a column from</a>
+<a name="68"><span class="lineNum"> 68 </span> : : * eccMatrix being XOR'd into the ECC field. This column is the</a>
+<a name="69"><span class="lineNum"> 69 </span> : : * &quot;effect&quot; of each bit. If a bit is flipped in the data then its</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * &quot;effect&quot; is missing from the ECC. You can calculate ECC on unknown</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * quality data and compare the ECC field between the calculated</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * value and the stored value. If the difference is zero, then the</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * data is clean. If the difference is non-zero, you look up the</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * difference in the syndrome table to identify the &quot;effect&quot; that</a>
+<a name="75"><span class="lineNum"> 75 </span> : : * is missing, which is the bit that is flipped.</a>
+<a name="76"><span class="lineNum"> 76 </span> : : *</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * Notice that ECC bit flips are recorded by a single &quot;effect&quot;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : * bit (ie. 0x1, 0x2, 0x4, 0x8 ...) and double bit flips are identified</a>
+<a name="79"><span class="lineNum"> 79 </span> : : * by the UE status in the table.</a>
+<a name="80"><span class="lineNum"> 80 </span> : : *</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * Bits are in MSB order.</a>
+<a name="82"><span class="lineNum"> 82 </span> : : */</a>
+<a name="83"><span class="lineNum"> 83 </span> : : static enum eccbitfields syndromematrix[] = {</a>
+<a name="84"><span class="lineNum"> 84 </span> : : GD, E7, E6, UE, E5, UE, UE, 47, E4, UE, UE, 37, UE, 35, 39, UE,</a>
+<a name="85"><span class="lineNum"> 85 </span> : : E3, UE, UE, 48, UE, 30, 29, UE, UE, 57, 27, UE, 31, UE, UE, UE,</a>
+<a name="86"><span class="lineNum"> 86 </span> : : E2, UE, UE, 17, UE, 18, 40, UE, UE, 58, 22, UE, 21, UE, UE, UE,</a>
+<a name="87"><span class="lineNum"> 87 </span> : : UE, 16, 49, UE, 19, UE, UE, UE, 23, UE, UE, UE, UE, 20, UE, UE,</a>
+<a name="88"><span class="lineNum"> 88 </span> : : E1, UE, UE, 51, UE, 46, 9, UE, UE, 34, 10, UE, 32, UE, UE, 36,</a>
+<a name="89"><span class="lineNum"> 89 </span> : : UE, 62, 50, UE, 14, UE, UE, UE, 13, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : UE, 61, 8, UE, 41, UE, UE, UE, 11, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : 15, UE, UE, UE, UE, UE, UE, UE, UE, UE, 12, UE, UE, UE, UE, UE,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : E0, UE, UE, 55, UE, 45, 43, UE, UE, 56, 38, UE, 1, UE, UE, UE,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : UE, 25, 26, UE, 2, UE, UE, UE, 24, UE, UE, UE, UE, UE, 28, UE,</a>
+<a name="94"><span class="lineNum"> 94 </span> : : UE, 59, 54, UE, 42, UE, UE, 44, 6, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="95"><span class="lineNum"> 95 </span> : : 5, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : UE, 63, 53, UE, 0, UE, UE, UE, 33, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : 3, UE, UE, 52, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : 7, UE, UE, UE, UE, UE, UE, UE, UE, 60, UE, UE, UE, UE, UE, UE,</a>
+<a name="99"><span class="lineNum"> 99 </span> : : UE, UE, UE, UE, 4, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE,</a>
+<a name="100"><span class="lineNum"> 100 </span> : : };</a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> : : /**</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Create the ECC field corresponding to a 8-byte data field</a>
+<a name="104"><span class="lineNum"> 104 </span> : : *</a>
+<a name="105"><span class="lineNum"> 105 </span> : : * @data: The 8 byte data to generate ECC for.</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * @return: The 1 byte ECC corresponding to the data.</a>
+<a name="107"><span class="lineNum"> 107 </span> : : */</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 21702 : static uint8_t eccgenerate(uint64_t data)</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 5055 : int i;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 21702 : uint8_t result = 0;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 195318 : for (i = 0; i &lt; 8; i++)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 173616 : result |= __builtin_parityll(eccmatrix[i] &amp; data) &lt;&lt; i;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 21702 : return result;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : /**</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * Verify the data and ECC match or indicate how they are wrong.</a>
+<a name="121"><span class="lineNum"> 121 </span> : : *</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * @data: The data to check ECC on.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * @ecc: The [supposed] ECC for the data.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : *</a>
+<a name="125"><span class="lineNum"> 125 </span> : : * @return: eccBitfield or 0-64.</a>
+<a name="126"><span class="lineNum"> 126 </span> : : *</a>
+<a name="127"><span class="lineNum"> 127 </span> : : * @retval GD - Indicates the data is good (matches ECC).</a>
+<a name="128"><span class="lineNum"> 128 </span> : : * @retval UE - Indicates the data is uncorrectable.</a>
+<a name="129"><span class="lineNum"> 129 </span> : : * @retval all others - Indication of which bit is incorrect.</a>
+<a name="130"><span class="lineNum"> 130 </span> : : */</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 928 : static enum eccbitfields eccverify(uint64_t data, uint8_t ecc)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : {</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 928 : return syndromematrix[eccgenerate(data) ^ ecc];</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /* IBM bit ordering */</a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 128 : static inline uint64_t eccflipbit(uint64_t data, uint8_t bit)</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : {</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 128 : if (bit &gt; 63)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : return data;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 128 : return data ^ (1ul &lt;&lt; (63 - bit));</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 864 : static int eccbyte(beint64_t *dst, struct ecc64 *src)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : {</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 450 : uint8_t ecc, badbit;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 450 : uint64_t data;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 864 : data = be64_to_cpu(src-&gt;data);</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 864 : ecc = src-&gt;ecc;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 864 : badbit = eccverify(data, ecc);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 864 : if (badbit == UE) {</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;ECC: uncorrectable error: %016llx %02x\n&quot;, (unsigned long long int)data, ecc);</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : return badbit;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : }</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 864 : if (badbit &lt;= UE)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 128 : FL_INF(&quot;ECC: correctable error: %i\n&quot;, badbit);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 864 : if (badbit &lt; 64)</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 128 : *dst = cpu_to_be64(eccflipbit(data, badbit));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : else</a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 736 : *dst = cpu_to_be64(data);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 414 : return 0;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 7 : static beint64_t *inc_beint64_by(const void *p, uint64_t i)</span></a>
+<a name="169"><span class="lineNum"> 169 </span> : : {</a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 7 : return (beint64_t *)(((char *)p) + i);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 3 : static uint64_t *inc_uint64_by(const void *p, uint64_t i)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : {</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 3 : return (uint64_t *)(((char *)p) + i);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 10 : static struct ecc64 *inc_ecc64_by(struct ecc64 *p, uint64_t i)</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : {</a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 10 : return (struct ecc64 *)(((char *)p) + i);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : }</a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 214 : static uint64_t whole_ecc_bytes(uint64_t i)</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : {</a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 214 : return i &amp; ~(BYTES_PER_ECC - 1);</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 107 : static uint64_t whole_ecc_structs(uint64_t i)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : {</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 107 : return whole_ecc_bytes(i) &gt;&gt; 3;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : /**</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * Correct it along the way and check for errors.</a>
+<a name="196"><span class="lineNum"> 196 </span> : : *</a>
+<a name="197"><span class="lineNum"> 197 </span> : : * @dst: destination buffer without ECC</a>
+<a name="198"><span class="lineNum"> 198 </span> : : * @src: source buffer with ECC</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="200"><span class="lineNum"> 200 </span> : : * Must be 8 byte aligned.</a>
+<a name="201"><span class="lineNum"> 201 </span> : : *</a>
+<a name="202"><span class="lineNum"> 202 </span> : : * @return: Success or error</a>
+<a name="203"><span class="lineNum"> 203 </span> : : *</a>
+<a name="204"><span class="lineNum"> 204 </span> : : * @retval: 0 - success</a>
+<a name="205"><span class="lineNum"> 205 </span> : : * @retfal: other - fail</a>
+<a name="206"><span class="lineNum"> 206 </span> : : */</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 163 : int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len)</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 89 : uint32_t i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 163 : if (len &amp; 0x7) {</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* TODO: we could probably handle this */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 2 : FL_ERR(&quot;ECC data length must be 8 byte aligned length:%&quot; PRIx64 &quot;\n&quot;,</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : len);</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 2 : return -1;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 161 : len &gt;&gt;= 3;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1013 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 450 : int rc;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 852 : rc = eccbyte(dst, src + i);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 852 : if (rc)</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 852 : dst++;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 72 : return 0;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> : : /**</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * Copy data from an input buffer with ECC to an output buffer without ECC.</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * Correct it along the way and check for errors.</a>
+<a name="234"><span class="lineNum"> 234 </span> : : *</a>
+<a name="235"><span class="lineNum"> 235 </span> : : * Unlike memcmp_from_ecc() which requires that the first byte into</a>
+<a name="236"><span class="lineNum"> 236 </span> : : * dst be the first byte in src (which must also be aligned to a</a>
+<a name="237"><span class="lineNum"> 237 </span> : : * struct ecc64 struct boundary) this function can cope with the first</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * byte in dst not being the first byte in src.</a>
+<a name="239"><span class="lineNum"> 239 </span> : : *</a>
+<a name="240"><span class="lineNum"> 240 </span> : : * Note: src MUST still be aligned to a struct ecc64 otherwise ECC</a>
+<a name="241"><span class="lineNum"> 241 </span> : : * calculations are impossible.</a>
+<a name="242"><span class="lineNum"> 242 </span> : : *</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * The alignment parameter species the number of bytes present at the</a>
+<a name="244"><span class="lineNum"> 244 </span> : : * start of src that should be skipped and not written to dst. Once</a>
+<a name="245"><span class="lineNum"> 245 </span> : : * again, these bytes must be in src otherwise the ECC cannot be</a>
+<a name="246"><span class="lineNum"> 246 </span> : : * checked.</a>
+<a name="247"><span class="lineNum"> 247 </span> : : *</a>
+<a name="248"><span class="lineNum"> 248 </span> : : * len also doesn't have any value limitation for this function. Of</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * course src must contain an exact multiple of struct ecc64 otherwise</a>
+<a name="250"><span class="lineNum"> 250 </span> : : * ECC calculation cannot be performed but this function won't copy</a>
+<a name="251"><span class="lineNum"> 251 </span> : : * the entirety of the last src data word if len is not mutiple of 8</a>
+<a name="252"><span class="lineNum"> 252 </span> : : *</a>
+<a name="253"><span class="lineNum"> 253 </span> : : * @dst: destination buffer without ECC</a>
+<a name="254"><span class="lineNum"> 254 </span> : : * @src: source buffer with ECC</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * @len: number of bytes of data to copy (without ecc).</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * @alignment: number of leading bytes in src which shouldn't be</a>
+<a name="257"><span class="lineNum"> 257 </span> : : * copied to dst</a>
+<a name="258"><span class="lineNum"> 258 </span> : : * @return: Success or error</a>
+<a name="259"><span class="lineNum"> 259 </span> : : *</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * @retval: 0 - success</a>
+<a name="261"><span class="lineNum"> 261 </span> : : * @retfal: other - fail</a>
+<a name="262"><span class="lineNum"> 262 </span> : : */</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 99 : int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src,</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="265"><span class="lineNum"> 265 </span> : : {</a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 89 : char data[BYTES_PER_ECC];</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 89 : uint8_t bytes_wanted;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 89 : int rc;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 99 : if (alignment &gt; 8)</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 99 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /*</a>
+<a name="276"><span class="lineNum"> 276 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * required - otherwise jump straight to memcpy_from_ecc()</a>
+<a name="278"><span class="lineNum"> 278 </span> : : */</a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 99 : if (alignment) {</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 5 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 5 : if (rc)</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 5 : memcpy(dst, &amp;data[alignment], bytes_wanted);</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 5 : src = inc_ecc64_by(src, sizeof(struct ecc64));</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 5 : dst = inc_beint64_by(dst, bytes_wanted);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 5 : len -= bytes_wanted;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : }</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 99 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 96 : rc = memcpy_from_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 96 : if (rc)</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> : : /*</a>
+<a name="297"><span class="lineNum"> 297 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * here, (dst and src are different types)</a>
+<a name="299"><span class="lineNum"> 299 </span> : : */</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 96 : dst += whole_ecc_structs(len);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 96 : src += whole_ecc_structs(len);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 96 : len -= whole_ecc_bytes(len);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 99 : if (len) {</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 7 : rc = eccbyte((beint64_t *)data, src);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 7 : if (rc)</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 7 : memcpy(dst, data, len);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : }</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 10 : return 0;</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : }</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> : : /**</a>
+<a name="317"><span class="lineNum"> 317 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="318"><span class="lineNum"> 318 </span> : : *</a>
+<a name="319"><span class="lineNum"> 319 </span> : : * @dst: destination buffer with ECC</a>
+<a name="320"><span class="lineNum"> 320 </span> : : * @src: source buffer without ECC</a>
+<a name="321"><span class="lineNum"> 321 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="322"><span class="lineNum"> 322 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="323"><span class="lineNum"> 323 </span> : : * Must be 8 byte aligned.</a>
+<a name="324"><span class="lineNum"> 324 </span> : : *</a>
+<a name="325"><span class="lineNum"> 325 </span> : : * @return: success or failure</a>
+<a name="326"><span class="lineNum"> 326 </span> : : *</a>
+<a name="327"><span class="lineNum"> 327 </span> : : * @retval: 0 - success</a>
+<a name="328"><span class="lineNum"> 328 </span> : : * @retfal: other - fail</a>
+<a name="329"><span class="lineNum"> 329 </span> : : */</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 21 : int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len)</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : {</a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 12 : struct ecc64 ecc_word;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 12 : uint64_t i;</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 21 : if (len &amp; 0x7) {</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : /* TODO: we could probably handle this */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 2 : FL_ERR(&quot;Data to add ECC bytes to must be 8 byte aligned length: %&quot;</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : PRIx64 &quot;\n&quot;, len);</a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 2 : return -1;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> : : </a>
+<a name="342"><span class="lineNum"> 342 </span> : : /* Handle in chunks of 8 bytes, so adjust the length */</a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 19 : len &gt;&gt;= 3;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 13253 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 13234 : ecc_word.ecc = eccgenerate(be64_to_cpu(*(src + i)));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 13234 : ecc_word.data = *(src + i);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : </a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 13234 : *(dst + i) = ecc_word;</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : }</a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 7 : return 0;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : }</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> : : /**</a>
+<a name="356"><span class="lineNum"> 356 </span> : : * Copy data from an input buffer without ECC to an output buffer with ECC.</a>
+<a name="357"><span class="lineNum"> 357 </span> : : *</a>
+<a name="358"><span class="lineNum"> 358 </span> : : * Unlike memcmp_to_ecc() which requires that the first byte in src be</a>
+<a name="359"><span class="lineNum"> 359 </span> : : * the first byte of a struct ecc64 structure this function does not</a>
+<a name="360"><span class="lineNum"> 360 </span> : : * have this requirement.</a>
+<a name="361"><span class="lineNum"> 361 </span> : : *</a>
+<a name="362"><span class="lineNum"> 362 </span> : : * Like memcpy_to_ecc_unaligned() the alignment parameter specfies the</a>
+<a name="363"><span class="lineNum"> 363 </span> : : * number of bytes in the first src word that are missing and would be</a>
+<a name="364"><span class="lineNum"> 364 </span> : : * required to form a struct ecc64 structure.</a>
+<a name="365"><span class="lineNum"> 365 </span> : : *</a>
+<a name="366"><span class="lineNum"> 366 </span> : : * It must be noted here that extra work IN THE CALLER must be done</a>
+<a name="367"><span class="lineNum"> 367 </span> : : * if your data is unaligned. In order to peform ECC calculations</a>
+<a name="368"><span class="lineNum"> 368 </span> : : * whatever portions of the ecc words are missing in src must be in</a>
+<a name="369"><span class="lineNum"> 369 </span> : : * dst.</a>
+<a name="370"><span class="lineNum"> 370 </span> : : *</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * For example, if there is an alignment value of 1 then this means</a>
+<a name="372"><span class="lineNum"> 372 </span> : : * there is 1 byte (of the total of 8 bytes) missing in src which is</a>
+<a name="373"><span class="lineNum"> 373 </span> : : * needed to calculate the first ECC byte. Therefore the first byte of</a>
+<a name="374"><span class="lineNum"> 374 </span> : : * dst MUST CONTAIN IT!</a>
+<a name="375"><span class="lineNum"> 375 </span> : : *</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * The same problem exists for the end of the buffer where src may not</a>
+<a name="377"><span class="lineNum"> 377 </span> : : * end exactly aligned, if this is the case dst must contain the</a>
+<a name="378"><span class="lineNum"> 378 </span> : : * required bytes to calculate the last ECC byte - they should be in</a>
+<a name="379"><span class="lineNum"> 379 </span> : : * dst where they would normally be found if src did contain those</a>
+<a name="380"><span class="lineNum"> 380 </span> : : * bytes.</a>
+<a name="381"><span class="lineNum"> 381 </span> : : *</a>
+<a name="382"><span class="lineNum"> 382 </span> : : * @dst: destination buffer with ECC</a>
+<a name="383"><span class="lineNum"> 383 </span> : : * @src: source buffer without ECC</a>
+<a name="384"><span class="lineNum"> 384 </span> : : * @len: number of bytes of data to copy (without ecc, length of src).</a>
+<a name="385"><span class="lineNum"> 385 </span> : : * @alignment: The number of bytes 'missing' from the start of src to</a>
+<a name="386"><span class="lineNum"> 386 </span> : : * be struct ecc64 aligned</a>
+<a name="387"><span class="lineNum"> 387 </span> : : *</a>
+<a name="388"><span class="lineNum"> 388 </span> : : * Note: dst must be big enough to hold ecc bytes as well.</a>
+<a name="389"><span class="lineNum"> 389 </span> : : * Must be 8 byte aligned.</a>
+<a name="390"><span class="lineNum"> 390 </span> : : *</a>
+<a name="391"><span class="lineNum"> 391 </span> : : * @return: success or failure</a>
+<a name="392"><span class="lineNum"> 392 </span> : : *</a>
+<a name="393"><span class="lineNum"> 393 </span> : : * @retval: 0 - success</a>
+<a name="394"><span class="lineNum"> 394 </span> : : * @retfal: other - fail</a>
+<a name="395"><span class="lineNum"> 395 </span> : : */</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 2 : int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src,</span></a>
+<a name="398"><span class="lineNum"> 398 </span> : : uint64_t len, uint8_t alignment)</a>
+<a name="399"><span class="lineNum"> 399 </span> : : {</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : struct ecc64 ecc_word;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : uint8_t bytes_wanted;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 2 : bytes_wanted = BYTES_PER_ECC - alignment;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> : : /*</a>
+<a name="407"><span class="lineNum"> 407 </span> : : * Only actually do the first calculation if an alignment is</a>
+<a name="408"><span class="lineNum"> 408 </span> : : * required - otherwise jump straight to memcpy_to_ecc()</a>
+<a name="409"><span class="lineNum"> 409 </span> : : */</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 2 : if (alignment) {</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 2 : ecc_word.data = dst-&gt;data;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 2 : memcpy(inc_uint64_by(&amp;ecc_word.data, alignment), src, bytes_wanted);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 2 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 2 : memcpy(dst, inc_ecc64_by(&amp;ecc_word, alignment),</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : sizeof(struct ecc64) - alignment);</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 2 : dst = inc_ecc64_by(dst, sizeof(struct ecc64) - alignment);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineCov"> 2 : src = inc_beint64_by(src, bytes_wanted);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 2 : len -= bytes_wanted;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 2 : if (len &gt;= BYTES_PER_ECC) {</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 2 : rc = memcpy_to_ecc(dst, src, whole_ecc_bytes(len));</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : </a>
+<a name="428"><span class="lineNum"> 428 </span> : : /*</a>
+<a name="429"><span class="lineNum"> 429 </span> : : * It helps to let the compiler to the pointer arithmetic</a>
+<a name="430"><span class="lineNum"> 430 </span> : : * here, (dst and src are different types)</a>
+<a name="431"><span class="lineNum"> 431 </span> : : */</a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 2 : dst += whole_ecc_structs(len);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 2 : src += whole_ecc_structs(len);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 2 : len -= whole_ecc_bytes(len);</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 2 : if (len) {</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineCov"> 1 : bytes_wanted = BYTES_PER_ECC - len;</span></a>
+<a name="439"><span class="lineNum"> 439 </span> : : </a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 1 : ecc_word.data = *src;</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 1 : memcpy(inc_uint64_by(&amp;ecc_word.data, len), inc_ecc64_by(dst, len),</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : bytes_wanted);</a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineCov"> 1 : ecc_word.ecc = eccgenerate(be64_to_cpu(ecc_word.data));</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 1 : *dst = ecc_word;</span></a>
+<a name="446"><span class="lineNum"> 446 </span> : : }</a>
+<a name="447"><span class="lineNum"> 447 </span> : : </a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ecc.h.func-sort-c.html b/coverage-report/libflash/ecc.h.func-sort-c.html
new file mode 100644
index 0000000..5c0feb5
--- /dev/null
+++ b/coverage-report/libflash/ecc.h.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ecc.h.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#52">ecc_buffer_size_minus_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#42">ecc_buffer_size</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#37">ecc_size</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#57">ecc_buffer_align</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ecc.h.func.html b/coverage-report/libflash/ecc.h.func.html
new file mode 100644
index 0000000..5df76c6
--- /dev/null
+++ b/coverage-report/libflash/ecc.h.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ecc.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ecc.h<span style="font-size: 80%;"> (<a href="ecc.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ecc.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#57">ecc_buffer_align</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#42">ecc_buffer_size</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#52">ecc_buffer_size_minus_ecc</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ecc.h.gcov.html#37">ecc_size</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ecc.h.gcov.html b/coverage-report/libflash/ecc.h.gcov.html
new file mode 100644
index 0000000..3937664
--- /dev/null
+++ b/coverage-report/libflash/ecc.h.gcov.html
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ecc.h</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ecc.h<span style="font-size: 80%;"> (source / <a href="ecc.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">8</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * This is based on the hostboot ecc code</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #ifndef __ECC_H</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #define __ECC_H</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct ecc64 {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : beint64_t data;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : uint8_t ecc;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : } __attribute__((__packed__));</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : extern int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len);</a>
+<a name="20"><span class="lineNum"> 20 </span> : : extern int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src, uint64_t len,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint8_t alignment);</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : extern int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len);</a>
+<a name="24"><span class="lineNum"> 24 </span> : : extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src, uint64_t len,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : uint8_t alignment);</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /*</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * Calculate the size of a buffer if ECC is added</a>
+<a name="29"><span class="lineNum"> 29 </span> : : *</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * We add 1 byte of ecc for every 8 bytes of data. So we need to round up to 8</a>
+<a name="31"><span class="lineNum"> 31 </span> : : * bytes length and then add 1/8</a>
+<a name="32"><span class="lineNum"> 32 </span> : : */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #ifndef ALIGN_UP</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define ALIGN_UP(_v, _a) (((_v) + (_a) - 1) &amp; ~((_a) - 1))</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #endif</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define BYTES_PER_ECC 8</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 119 : static inline uint64_t ecc_size(uint64_t len)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 119 : return ALIGN_UP(len, BYTES_PER_ECC) &gt;&gt; 3;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 119 : static inline uint64_t ecc_buffer_size(uint64_t len)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 119 : return ALIGN_UP(len, BYTES_PER_ECC) + ecc_size(len);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : }</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : static inline int ecc_buffer_size_check(uint64_t len)</a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> : : return len % (BYTES_PER_ECC + 1);</a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : static inline uint64_t ecc_buffer_size_minus_ecc(uint64_t len)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : return len * BYTES_PER_ECC / (BYTES_PER_ECC + 1);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : }</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 123 : static inline uint64_t ecc_buffer_align(uint64_t start, uint64_t pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : {</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 123 : return pos - ((pos - start) % (BYTES_PER_ECC + 1));</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : }</a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : #endif</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/file.c.func-sort-c.html b/coverage-report/libflash/file.c.func-sort-c.html
new file mode 100644
index 0000000..33dbdc4
--- /dev/null
+++ b/coverage-report/libflash/file.c.func-sort-c.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">108</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">58.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="file.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnHi">43</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnHi">107</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">3330</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">3353</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/file.c.func.html b/coverage-report/libflash/file.c.func.html
new file mode 100644
index 0000000..eabf7e5
--- /dev/null
+++ b/coverage-report/libflash/file.c.func.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/file.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - file.c<span style="font-size: 80%;"> (<a href="file.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">108</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">58.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="file.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#104">file_erase</a></td>
+ <td class="coverFnHi">3330</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#364">file_exit</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#376">file_exit_close</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#239">file_get_info</a></td>
+ <td class="coverFnHi">43</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#265">file_init</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#322">file_init_path</a></td>
+ <td class="coverFnHi">34</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#38">file_reacquire</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#50">file_read</a></td>
+ <td class="coverFnHi">107</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#30">file_release</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#73">file_write</a></td>
+ <td class="coverFnHi">3353</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#177">get_info_name</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#122">mtd_erase</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="file.c.gcov.html#212">mtd_get_info</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/file.c.gcov.html b/coverage-report/libflash/file.c.gcov.html
new file mode 100644
index 0000000..3287e7c
--- /dev/null
+++ b/coverage-report/libflash/file.c.gcov.html
@@ -0,0 +1,471 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/file.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - file.c<span style="font-size: 80%;"> (source / <a href="file.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">108</td>
+ <td class="headerCovTableEntry">184</td>
+ <td class="headerCovTableEntryLo">58.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntryLo">69.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define _GNU_SOURCE</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;errno.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/ioctl.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;fcntl.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;limits.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;mtd/mtd-abi.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;libflash/file.h&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct file_data {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : int fd;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : char *name;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : char *path;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct blocklevel_device bl;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : };</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : static int file_release(struct blocklevel_device *bl)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : close(file_data-&gt;fd);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = -1;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : static int file_reacquire(struct blocklevel_device *bl)</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : int fd;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : fd = open(file_data-&gt;path, O_RDWR);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : if (fd == -1)</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : file_data-&gt;fd = fd;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 107 : static int file_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 107 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 107 : int rc, count = 0;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 107 : rc = lseek(file_data-&gt;fd, pos, SEEK_SET);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : /* errno should remain set */</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 107 : if (rc != pos)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 214 : while (count &lt; len) {</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 107 : rc = read(file_data-&gt;fd, buf, len - count);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* errno should remain set */</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 107 : if (rc == -1 || rc == 0)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 107 : buf += rc;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 107 : count += rc;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : return 0;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 3353 : static int file_write(struct blocklevel_device *bl, uint64_t dst, const void *src,</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : uint64_t len)</a>
+<a name="77"><span class="lineNum"> 77 </span> : : {</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 3353 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 3353 : int rc, count = 0;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 3353 : rc = lseek(file_data-&gt;fd, dst, SEEK_SET);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : /* errno should remain set */</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 3353 : if (rc != dst)</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 6706 : while (count &lt; len) {</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 3353 : rc = write(file_data-&gt;fd, src, len - count);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* errno should remain set */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 3353 : if (rc == -1)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 3353 : src += rc;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 3353 : count += rc;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : }</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> : : return 0;</a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /*</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * Due to to the fact these interfaces are ultimately supposed to deal with</a>
+<a name="101"><span class="lineNum"> 101 </span> : : * flash, an erase function must be implemented even when the flash images</a>
+<a name="102"><span class="lineNum"> 102 </span> : : * are backed by regular files.</a>
+<a name="103"><span class="lineNum"> 103 </span> : : * Also, erasing flash leaves all the bits set to 1. This may be expected</a>
+<a name="104"><span class="lineNum"> 104 </span> : : * by higher level functions so this function should also emulate that</a>
+<a name="105"><span class="lineNum"> 105 </span> : : */</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 3330 : static int file_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 3330 : static char buf[4096];</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 3330 : int i = 0;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 3330 : int rc;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 3330 : memset(buf, ~0, sizeof(buf));</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 6668 : while (len - i &gt; 0) {</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 3338 : rc = file_write(bl, dst + i, buf, len - i &gt; sizeof(buf) ? sizeof(buf) : len - i);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 3338 : if (rc)</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 3338 : i += (len - i &gt; sizeof(buf)) ? sizeof(buf) : len - i;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : return 0;</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : static int mtd_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : {</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : int err;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s: dst: 0x%&quot; PRIx64 &quot;, len: 0x%&quot; PRIx64 &quot;\n&quot;, __func__, dst, len);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : /*</a>
+<a name="132"><span class="lineNum"> 132 </span> : : * Some kernels that pflash supports do not know about the 64bit</a>
+<a name="133"><span class="lineNum"> 133 </span> : : * version of the ioctl() therefore we'll just use the 32bit (which</a>
+<a name="134"><span class="lineNum"> 134 </span> : : * should always be supported...) unless we MUST use the 64bit and</a>
+<a name="135"><span class="lineNum"> 135 </span> : : * then lets just hope the kernel knows how to deal with it. If it</a>
+<a name="136"><span class="lineNum"> 136 </span> : : * is unsupported the ioctl() will fail and we'll report that -</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * there is no other option.</a>
+<a name="138"><span class="lineNum"> 138 </span> : : *</a>
+<a name="139"><span class="lineNum"> 139 </span> : : * Furthermore, even very recent MTD layers and drivers aren't</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * particularly good at not blocking in the kernel. This creates</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * unexpected behaviour in userspace tools using these functions.</a>
+<a name="142"><span class="lineNum"> 142 </span> : : * In the absence of significant work inside the kernel, we'll just</a>
+<a name="143"><span class="lineNum"> 143 </span> : : * split stuff up here for convenience.</a>
+<a name="144"><span class="lineNum"> 144 </span> : : * We can assume everything is aligned here.</a>
+<a name="145"><span class="lineNum"> 145 </span> : : */</a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : while (len) {</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineNoCov"> 0 : if (dst &gt; UINT_MAX || len &gt; UINT_MAX) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : struct erase_info_user64 erase_info = {</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : .start = dst,</a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : };</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE64, &amp;erase_info) == -1) {</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : if (err == 25) /* Kernel doesn't do 64bit MTD erase ioctl() */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Attempted a 64bit erase on a kernel which doesn't support it\n&quot;);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : } else {</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : struct erase_info_user erase_info = {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : .start = dst,</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : .length = file_data-&gt;bl.erase_mask + 1</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : };</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : if (ioctl(file_data-&gt;fd, MEMERASE, &amp;erase_info) == -1) {</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : err = errno;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;%s: IOCTL to kernel failed! %s\n&quot;, __func__, strerror(err));</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : errno = err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : }</a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : dst += file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : len -= file_data-&gt;bl.erase_mask + 1;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : }</a>
+<a name="176"><span class="lineNum"> 176 </span> : : return 0;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 11 : static int get_info_name(struct file_data *file_data, char **name)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : {</a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 11 : char *path, *lpath;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 11 : int len;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 11 : struct stat st;</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 11 : if (asprintf(&amp;path, &quot;/proc/self/fd/%d&quot;, file_data-&gt;fd) == -1)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 11 : if (lstat(path, &amp;st)) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 11 : lpath = malloc(st.st_size + 1);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 11 : if (!lpath) {</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : }</a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 11 : len = readlink(path, lpath, st.st_size +1);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 11 : if (len == -1) {</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineNoCov"> 0 : free(path);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineNoCov"> 0 : free(lpath);</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 11 : lpath[len] = '\0';</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 11 : *name = lpath;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : </a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 11 : free(path);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 11 : return 0;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : static int mtd_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : struct mtd_info_user mtd_info;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : </a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : rc = ioctl(file_data-&gt;fd, MEMGETINFO, &amp;mtd_info);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : if (rc == -1)</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : return FLASH_ERR_BAD_READ;</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : if (total_size)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : *total_size = mtd_info.size;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : if (erase_granule)</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : *erase_granule = mtd_info.erasesize;</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : if (name) {</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : return rc;</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : *name = file_data-&gt;name;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : }</a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : return 0;</a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 43 : static int file_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="243"><span class="lineNum"> 243 </span> : : {</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 43 : struct file_data *file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 43 : struct stat st;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 43 : int rc;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 43 : if (fstat(file_data-&gt;fd, &amp;st))</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 43 : if (total_size)</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 43 : *total_size = st.st_size;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : </a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 43 : if (erase_granule)</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 11 : *erase_granule = 1;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 43 : if (name) {</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 11 : rc = get_info_name(file_data, &amp;(file_data-&gt;name));</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : return rc;</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 11 : *name = file_data-&gt;name;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> : : return 0;</a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 34 : int file_init(int fd, struct blocklevel_device **bl)</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : {</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 34 : struct file_data *file_data;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 34 : struct stat sbuf;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 34 : if (!bl)</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 34 : *bl = NULL;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 34 : file_data = calloc(1, sizeof(struct file_data));</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 34 : if (!file_data)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 34 : file_data-&gt;fd = fd;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.reacquire = &amp;file_reacquire;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.release = &amp;file_release;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.read = &amp;file_read;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.write = &amp;file_write;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.erase = &amp;file_erase;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.get_info = &amp;file_get_info;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.erase_mask = 0;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> : : /*</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * If the blocklevel_device is only inited with file_init() then keep</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * alive is assumed, as fd will change otherwise and this may break</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * callers assumptions.</a>
+<a name="294"><span class="lineNum"> 294 </span> : : */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.keep_alive = 1;</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : </a>
+<a name="297"><span class="lineNum"> 297 </span> : : /*</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * Unfortunately not all file descriptors are created equal...</a>
+<a name="299"><span class="lineNum"> 299 </span> : : * Here we check to see if the file descriptor is to an MTD device, in</a>
+<a name="300"><span class="lineNum"> 300 </span> : : * which case we have to erase and get the size of it differently.</a>
+<a name="301"><span class="lineNum"> 301 </span> : : */</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 34 : if (fstat(file_data-&gt;fd, &amp;sbuf) == -1)</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : /* Won't be able to handle other than MTD devices for now */</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 34 : if (S_ISCHR(sbuf.st_mode)) {</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase = &amp;mtd_erase;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.get_info = &amp;mtd_get_info;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : mtd_get_info(&amp;file_data-&gt;bl, NULL, NULL, &amp;(file_data-&gt;bl.erase_mask));</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : file_data-&gt;bl.erase_mask--;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 34 : } else if (!S_ISREG(sbuf.st_mode)) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : /* If not a char device or a regular file something went wrong */</a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : }</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 34 : *bl = &amp;(file_data-&gt;bl);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 34 : return 0;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : free(file_data);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : }</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 34 : int file_init_path(const char *path, int *r_fd, bool keep_alive,</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : struct blocklevel_device **bl)</a>
+<a name="326"><span class="lineNum"> 326 </span> : : {</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 34 : int fd, rc;</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 34 : char *path_ptr = NULL;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 34 : struct file_data *file_data;</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 34 : if (!path || !bl)</span></a>
+<a name="332"><span class="lineNum"> 332 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 34 : fd = open(path, O_RDWR);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 34 : if (fd == -1)</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> : : /*</a>
+<a name="339"><span class="lineNum"> 339 </span> : : * strdup() first so don't have to deal with malloc failure after</a>
+<a name="340"><span class="lineNum"> 340 </span> : : * file_init()</a>
+<a name="341"><span class="lineNum"> 341 </span> : : */</a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 34 : path_ptr = strdup(path);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 34 : if (!path_ptr) {</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : }</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 34 : rc = file_init(fd, bl);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 34 : if (rc)</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 34 : file_data = container_of(*bl, struct file_data, bl);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 34 : file_data-&gt;bl.keep_alive = keep_alive;</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 34 : file_data-&gt;path = path_ptr;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 34 : if (r_fd)</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : *r_fd = fd;</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : </a>
+<a name="359"><span class="lineNum"> 359 </span> : : return rc;</a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : free(path_ptr);</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineNoCov"> 0 : close(fd);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : }</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 34 : void file_exit(struct blocklevel_device *bl)</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : {</a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 34 : struct file_data *file_data;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 34 : if (bl) {</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 34 : free(bl-&gt;ecc_prot.prot);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 34 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 34 : free(file_data-&gt;name);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 34 : free(file_data-&gt;path);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 34 : free(file_data);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> : : }</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 34 : }</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : </a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 34 : void file_exit_close(struct blocklevel_device *bl)</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : {</a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 34 : struct file_data *file_data;</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 34 : if (bl) {</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 34 : file_data = container_of(bl, struct file_data, bl);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 34 : close(file_data-&gt;fd);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 34 : file_exit(bl);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 34 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/index-sort-b.html b/coverage-report/libflash/index-sort-b.html
new file mode 100644
index 0000000..fea9aaa
--- /dev/null
+++ b/coverage-report/libflash/index-sort-b.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1733</td>
+ <td class="headerCovTableEntry">2603</td>
+ <td class="headerCovTableEntryLo">66.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">145</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">84.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.3%"><img src="../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="59.2%"><img src="../snow.png" width=41 height=10 alt="59.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.2&nbsp;%</td>
+ <td class="coverNumLo">241 / 407</td>
+ <td class="coverPerHi">93.3&nbsp;%</td>
+ <td class="coverNumHi">14 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=75 height=10 alt="75.0%"><img src="../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-hiomap.c.gcov.html">ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.9%"><img src="../snow.png" width=8 height=10 alt="91.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.9&nbsp;%</td>
+ <td class="coverNumHi">453 / 493</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=90 height=10 alt="89.7%"><img src="../snow.png" width=10 height=10 alt="89.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.7&nbsp;%</td>
+ <td class="coverNumMed">105 / 117</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="58.7%"><img src="../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="51.9%"><img src="../snow.png" width=48 height=10 alt="51.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.9&nbsp;%</td>
+ <td class="coverNumLo">240 / 462</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">18 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-flash.c.gcov.html">mbox-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=74 height=10 alt="74.3%"><img src="../snow.png" width=26 height=10 alt="74.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.3&nbsp;%</td>
+ <td class="coverNumLo">372 / 501</td>
+ <td class="coverPerHi">93.8&nbsp;%</td>
+ <td class="coverNumHi">45 / 48</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/index-sort-f.html b/coverage-report/libflash/index-sort-f.html
new file mode 100644
index 0000000..a26ec33
--- /dev/null
+++ b/coverage-report/libflash/index-sort-f.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1733</td>
+ <td class="headerCovTableEntry">2603</td>
+ <td class="headerCovTableEntryLo">66.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">145</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">84.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.3%"><img src="../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="58.7%"><img src="../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=75 height=10 alt="75.0%"><img src="../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="51.9%"><img src="../snow.png" width=48 height=10 alt="51.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.9&nbsp;%</td>
+ <td class="coverNumLo">240 / 462</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">18 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="59.2%"><img src="../snow.png" width=41 height=10 alt="59.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.2&nbsp;%</td>
+ <td class="coverNumLo">241 / 407</td>
+ <td class="coverPerHi">93.3&nbsp;%</td>
+ <td class="coverNumHi">14 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-flash.c.gcov.html">mbox-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=74 height=10 alt="74.3%"><img src="../snow.png" width=26 height=10 alt="74.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.3&nbsp;%</td>
+ <td class="coverNumLo">372 / 501</td>
+ <td class="coverPerHi">93.8&nbsp;%</td>
+ <td class="coverNumHi">45 / 48</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=90 height=10 alt="89.7%"><img src="../snow.png" width=10 height=10 alt="89.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.7&nbsp;%</td>
+ <td class="coverNumMed">105 / 117</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-hiomap.c.gcov.html">ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.9%"><img src="../snow.png" width=8 height=10 alt="91.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.9&nbsp;%</td>
+ <td class="coverNumHi">453 / 493</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/index-sort-l.html b/coverage-report/libflash/index-sort-l.html
new file mode 100644
index 0000000..597a770
--- /dev/null
+++ b/coverage-report/libflash/index-sort-l.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1733</td>
+ <td class="headerCovTableEntry">2603</td>
+ <td class="headerCovTableEntryLo">66.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">145</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">84.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.3%"><img src="../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="51.9%"><img src="../snow.png" width=48 height=10 alt="51.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.9&nbsp;%</td>
+ <td class="coverNumLo">240 / 462</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">18 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="58.7%"><img src="../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="59.2%"><img src="../snow.png" width=41 height=10 alt="59.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.2&nbsp;%</td>
+ <td class="coverNumLo">241 / 407</td>
+ <td class="coverPerHi">93.3&nbsp;%</td>
+ <td class="coverNumHi">14 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-flash.c.gcov.html">mbox-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=74 height=10 alt="74.3%"><img src="../snow.png" width=26 height=10 alt="74.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.3&nbsp;%</td>
+ <td class="coverNumLo">372 / 501</td>
+ <td class="coverPerHi">93.8&nbsp;%</td>
+ <td class="coverNumHi">45 / 48</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=75 height=10 alt="75.0%"><img src="../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=90 height=10 alt="89.7%"><img src="../snow.png" width=10 height=10 alt="89.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.7&nbsp;%</td>
+ <td class="coverNumMed">105 / 117</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-hiomap.c.gcov.html">ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.9%"><img src="../snow.png" width=8 height=10 alt="91.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.9&nbsp;%</td>
+ <td class="coverNumHi">453 / 493</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/index.html b/coverage-report/libflash/index.html
new file mode 100644
index 0000000..9cdf52f
--- /dev/null
+++ b/coverage-report/libflash/index.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libflash</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1733</td>
+ <td class="headerCovTableEntry">2603</td>
+ <td class="headerCovTableEntryLo">66.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">145</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">84.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="blocklevel.c.gcov.html">blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="59.2%"><img src="../snow.png" width=41 height=10 alt="59.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">59.2&nbsp;%</td>
+ <td class="coverNumLo">241 / 407</td>
+ <td class="coverPerHi">93.3&nbsp;%</td>
+ <td class="coverNumHi">14 / 15</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.c.gcov.html">ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=90 height=10 alt="89.7%"><img src="../snow.png" width=10 height=10 alt="89.7%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">89.7&nbsp;%</td>
+ <td class="coverNumMed">105 / 117</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">13 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ecc.h.gcov.html">ecc.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=75 height=10 alt="75.0%"><img src="../snow.png" width=25 height=10 alt="75.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">6 / 8</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">3 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="file.c.gcov.html">file.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=59 height=10 alt="58.7%"><img src="../snow.png" width=41 height=10 alt="58.7%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">58.7&nbsp;%</td>
+ <td class="coverNumLo">108 / 184</td>
+ <td class="coverPerLo">69.2&nbsp;%</td>
+ <td class="coverNumLo">9 / 13</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="ipmi-hiomap.c.gcov.html">ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.9%"><img src="../snow.png" width=8 height=10 alt="91.9%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">91.9&nbsp;%</td>
+ <td class="coverNumHi">453 / 493</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">26 / 26</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libffs.c.gcov.html">libffs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=48 height=10 alt="48.3%"><img src="../snow.png" width=52 height=10 alt="48.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.3&nbsp;%</td>
+ <td class="coverNumLo">208 / 431</td>
+ <td class="coverPerLo">60.7&nbsp;%</td>
+ <td class="coverNumLo">17 / 28</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="libflash.c.gcov.html">libflash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=52 height=10 alt="51.9%"><img src="../snow.png" width=48 height=10 alt="51.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.9&nbsp;%</td>
+ <td class="coverNumLo">240 / 462</td>
+ <td class="coverPerMed">75.0&nbsp;%</td>
+ <td class="coverNumMed">18 / 24</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-flash.c.gcov.html">mbox-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=74 height=10 alt="74.3%"><img src="../snow.png" width=26 height=10 alt="74.3%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">74.3&nbsp;%</td>
+ <td class="coverNumLo">372 / 501</td>
+ <td class="coverPerHi">93.8&nbsp;%</td>
+ <td class="coverNumHi">45 / 48</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ipmi-hiomap.c.func-sort-c.html b/coverage-report/libflash/ipmi-hiomap.c.func-sort-c.html
new file mode 100644
index 0000000..4ef6ae9
--- /dev/null
+++ b/coverage-report/libflash/ipmi-hiomap.c.func-sort-c.html
@@ -0,0 +1,185 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ipmi-hiomap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ipmi-hiomap.c<span style="font-size: 80%;"> (<a href="ipmi-hiomap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">453</td>
+ <td class="headerCovTableEntry">493</td>
+ <td class="headerCovTableEntryHi">91.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ipmi-hiomap.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#895">ipmi_hiomap_get_flash_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#552">lpc_window_read</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#474">hiomap_erase</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#364">hiomap_mark_dirty</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#597">lpc_window_write</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#788">ipmi_hiomap_write</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#849">ipmi_hiomap_erase</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#742">ipmi_hiomap_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#409">hiomap_flush</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#541">hiomap_event</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#518">hiomap_reset</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#998">ipmi_hiomap_exit</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#291">hiomap_window_move</a></td>
+ <td class="coverFnHi">53</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#645">ipmi_hiomap_handle_events</a></td>
+ <td class="coverFnHi">54</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#266">hiomap_get_flash_info</a></td>
+ <td class="coverFnHi">55</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#227">hiomap_init</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#924">ipmi_hiomap_init</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#238">hiomap_get_info</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#88">hiomap_window_valid</a></td>
+ <td class="coverFnHi">66</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#445">hiomap_ack</a></td>
+ <td class="coverFnHi">67</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#32">bytes_to_blocks</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#37">bytes_to_blocks_align_up</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#27">blocks_to_bytes</a></td>
+ <td class="coverFnHi">222</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#53">hiomap_protocol_ready</a></td>
+ <td class="coverFnHi">282</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#63">hiomap_queue_msg_sync</a></td>
+ <td class="coverFnHi">282</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#107">ipmi_hiomap_cmd_cb</a></td>
+ <td class="coverFnHi">320</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ipmi-hiomap.c.func.html b/coverage-report/libflash/ipmi-hiomap.c.func.html
new file mode 100644
index 0000000..ac44b25
--- /dev/null
+++ b/coverage-report/libflash/ipmi-hiomap.c.func.html
@@ -0,0 +1,185 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ipmi-hiomap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ipmi-hiomap.c<span style="font-size: 80%;"> (<a href="ipmi-hiomap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">453</td>
+ <td class="headerCovTableEntry">493</td>
+ <td class="headerCovTableEntryHi">91.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ipmi-hiomap.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#27">blocks_to_bytes</a></td>
+ <td class="coverFnHi">222</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#32">bytes_to_blocks</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#37">bytes_to_blocks_align_up</a></td>
+ <td class="coverFnHi">80</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#445">hiomap_ack</a></td>
+ <td class="coverFnHi">67</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#474">hiomap_erase</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#541">hiomap_event</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#409">hiomap_flush</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#266">hiomap_get_flash_info</a></td>
+ <td class="coverFnHi">55</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#238">hiomap_get_info</a></td>
+ <td class="coverFnHi">58</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#227">hiomap_init</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#364">hiomap_mark_dirty</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#53">hiomap_protocol_ready</a></td>
+ <td class="coverFnHi">282</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#63">hiomap_queue_msg_sync</a></td>
+ <td class="coverFnHi">282</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#518">hiomap_reset</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#291">hiomap_window_move</a></td>
+ <td class="coverFnHi">53</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#88">hiomap_window_valid</a></td>
+ <td class="coverFnHi">66</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#107">ipmi_hiomap_cmd_cb</a></td>
+ <td class="coverFnHi">320</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#849">ipmi_hiomap_erase</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#998">ipmi_hiomap_exit</a></td>
+ <td class="coverFnHi">46</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#895">ipmi_hiomap_get_flash_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#645">ipmi_hiomap_handle_events</a></td>
+ <td class="coverFnHi">54</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#924">ipmi_hiomap_init</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#742">ipmi_hiomap_read</a></td>
+ <td class="coverFnHi">18</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#788">ipmi_hiomap_write</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#552">lpc_window_read</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="ipmi-hiomap.c.gcov.html#597">lpc_window_write</a></td>
+ <td class="coverFnHi">15</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/ipmi-hiomap.c.gcov.html b/coverage-report/libflash/ipmi-hiomap.c.gcov.html
new file mode 100644
index 0000000..54b35e2
--- /dev/null
+++ b/coverage-report/libflash/ipmi-hiomap.c.gcov.html
@@ -0,0 +1,1097 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/ipmi-hiomap.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - ipmi-hiomap.c<span style="font-size: 80%;"> (source / <a href="ipmi-hiomap.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">453</td>
+ <td class="headerCovTableEntry">493</td>
+ <td class="headerCovTableEntryHi">91.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2018-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define pr_fmt(fmt) &quot;HIOMAP: &quot; fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;hiomap.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;ipmi.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;lpc.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;mem_region-malloc.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;string.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;errors.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;ipmi-hiomap.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define CMD_OP_HIOMAP_EVENT 0x0f</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct ipmi_hiomap_result {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : int16_t cc;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : };</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define RESULT_INIT(_name, _ctx) struct ipmi_hiomap_result _name = { _ctx, -1 }</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 222 : static inline uint32_t blocks_to_bytes(struct ipmi_hiomap *ctx, uint16_t blocks)</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : {</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 222 : return blocks &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 80 : static inline uint16_t bytes_to_blocks(struct ipmi_hiomap *ctx, uint32_t bytes)</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : {</a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 80 : return bytes &gt;&gt; ctx-&gt;block_size_shift;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : }</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 80 : static inline uint16_t bytes_to_blocks_align_up(struct ipmi_hiomap *ctx,</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t pos, uint32_t len)</a>
+<a name="41"><span class="lineNum"> 41 </span> : : {</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 80 : uint32_t block_size = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 80 : uint32_t delta = pos &amp; (block_size - 1);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 80 : uint32_t aligned = ALIGN_UP((len + delta), block_size);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 80 : uint32_t blocks = aligned &gt;&gt; ctx-&gt;block_size_shift;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : /* Our protocol can handle block count &lt; sizeof(u16) */</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 80 : uint32_t mask = ((1 &lt;&lt; 16) - 1);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 80 : assert(!(blocks &amp; ~mask));</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 80 : return blocks &amp; mask;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : }</a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : /* Call under ctx-&gt;lock */</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 282 : static int hiomap_protocol_ready(struct ipmi_hiomap *ctx)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 282 : if (!(ctx-&gt;bmc_state &amp; HIOMAP_E_DAEMON_READY))</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 2 : return FLASH_ERR_DEVICE_GONE;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 280 : if (ctx-&gt;bmc_state &amp; HIOMAP_E_FLASH_LOST)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 6 : return FLASH_ERR_AGAIN;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 274 : return 0;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 282 : static int hiomap_queue_msg_sync(struct ipmi_hiomap *ctx, struct ipmi_msg *msg)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : {</a>
+<a name="67"><span class="lineNum"> 67 </span> : : int rc;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /*</a>
+<a name="70"><span class="lineNum"> 70 </span> : : * There's an unavoidable TOCTOU race here with the BMC sending an</a>
+<a name="71"><span class="lineNum"> 71 </span> : : * event saying it's no-longer available right after we test but before</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * we call into the IPMI stack to send the message.</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * hiomap_queue_msg_sync() exists to capture the race in a single</a>
+<a name="74"><span class="lineNum"> 74 </span> : : * location.</a>
+<a name="75"><span class="lineNum"> 75 </span> : : */</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 282 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 282 : rc = hiomap_protocol_ready(ctx);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 282 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 282 : if (rc) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 8 : ipmi_free_msg(msg);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 8 : return rc;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 274 : ipmi_queue_msg_sync(msg);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 274 : return 0;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* Call under ctx-&gt;lock */</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 66 : static int hiomap_window_valid(struct ipmi_hiomap *ctx, uint64_t pos,</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : uint64_t len)</a>
+<a name="92"><span class="lineNum"> 92 </span> : : {</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 66 : if (ctx-&gt;bmc_state &amp; HIOMAP_E_FLASH_LOST)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 5 : return FLASH_ERR_AGAIN;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 61 : if (ctx-&gt;bmc_state &amp; HIOMAP_E_PROTOCOL_RESET)</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 61 : if (ctx-&gt;bmc_state &amp; HIOMAP_E_WINDOW_RESET)</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 61 : if (ctx-&gt;window_state == closed_window)</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 41 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 20 : if (pos &lt; ctx-&gt;current.cur_pos)</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 20 : if ((pos + len) &gt; (ctx-&gt;current.cur_pos + ctx-&gt;current.size))</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 5 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 15 : return 0;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : }</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 320 : static void ipmi_hiomap_cmd_cb(struct ipmi_msg *msg)</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : {</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 320 : struct ipmi_hiomap_result *res = msg-&gt;user_data;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 320 : struct ipmi_hiomap *ctx = res-&gt;ctx;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 320 : res-&gt;cc = msg-&gt;cc;</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 320 : if (msg-&gt;cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 12 : ipmi_free_msg(msg);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 12 : return;</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : }</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /* We at least need the command and sequence */</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 308 : if (msg-&gt;resp_size &lt; 2) {</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 4 : prerror(&quot;Illegal response size: %u\n&quot;, msg-&gt;resp_size);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 4 : res-&gt;cc = IPMI_ERR_UNSPECIFIED;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 4 : ipmi_free_msg(msg);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 4 : return;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : }</a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 304 : if (msg-&gt;data[1] != ctx-&gt;seq) {</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : prerror(&quot;Unmatched sequence number: wanted %u got %u\n&quot;,</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : ctx-&gt;seq, msg-&gt;data[1]);</a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : res-&gt;cc = IPMI_ERR_UNSPECIFIED;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : ipmi_free_msg(msg);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 1 : return;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 303 : switch (msg-&gt;data[0]) {</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 56 : case HIOMAP_C_GET_INFO:</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : {</a>
+<a name="139"><span class="lineNum"> 139 </span> : : struct hiomap_v2_info *parms;</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 56 : if (msg-&gt;resp_size != 6) {</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 2 : prerror(&quot;%u: Unexpected response size: %u\n&quot;, msg-&gt;data[0],</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : msg-&gt;resp_size);</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 2 : res-&gt;cc = IPMI_ERR_UNSPECIFIED;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : }</a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 54 : ctx-&gt;version = msg-&gt;data[2];</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 54 : if (ctx-&gt;version &lt; 2) {</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Failed to negotiate protocol v2 or higher: %d\n&quot;,</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : ctx-&gt;version);</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : res-&gt;cc = IPMI_ERR_UNSPECIFIED;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : }</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 54 : parms = (struct hiomap_v2_info *)&amp;msg-&gt;data[3];</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 54 : ctx-&gt;block_size_shift = parms-&gt;block_size_shift;</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 54 : ctx-&gt;timeout = le16_to_cpu(parms-&gt;timeout);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 54 : break;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 53 : case HIOMAP_C_GET_FLASH_INFO:</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : {</a>
+<a name="163"><span class="lineNum"> 163 </span> : : struct hiomap_v2_flash_info *parms;</a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 53 : if (msg-&gt;resp_size != 6) {</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 2 : prerror(&quot;%u: Unexpected response size: %u\n&quot;, msg-&gt;data[0],</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : msg-&gt;resp_size);</a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 2 : res-&gt;cc = IPMI_ERR_UNSPECIFIED;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 51 : parms = (struct hiomap_v2_flash_info *)&amp;msg-&gt;data[2];</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 51 : ctx-&gt;total_size =</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 51 : blocks_to_bytes(ctx, le16_to_cpu(parms-&gt;total_size));</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 51 : ctx-&gt;erase_granule =</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 51 : blocks_to_bytes(ctx, le16_to_cpu(parms-&gt;erase_granule));</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 51 : break;</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : }</a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 44 : case HIOMAP_C_CREATE_READ_WINDOW:</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : case HIOMAP_C_CREATE_WRITE_WINDOW:</a>
+<a name="181"><span class="lineNum"> 181 </span> : : {</a>
+<a name="182"><span class="lineNum"> 182 </span> : : struct hiomap_v2_create_window *parms;</a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 44 : if (msg-&gt;resp_size != 8) {</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 4 : prerror(&quot;%u: Unexpected response size: %u\n&quot;, msg-&gt;data[0],</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : msg-&gt;resp_size);</a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 4 : res-&gt;cc = IPMI_ERR_UNSPECIFIED;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : }</a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 40 : parms = (struct hiomap_v2_create_window *)&amp;msg-&gt;data[2];</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 40 : ctx-&gt;current.lpc_addr =</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 40 : blocks_to_bytes(ctx, le16_to_cpu(parms-&gt;lpc_addr));</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 40 : ctx-&gt;current.size =</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 40 : blocks_to_bytes(ctx, le16_to_cpu(parms-&gt;size));</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 40 : ctx-&gt;current.cur_pos =</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 40 : blocks_to_bytes(ctx, le16_to_cpu(parms-&gt;offset));</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 40 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 40 : if (msg-&gt;data[0] == HIOMAP_C_CREATE_READ_WINDOW)</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 12 : ctx-&gt;window_state = read_window;</span></a>
+<a name="203"><span class="lineNum"> 203 </span> : : else</a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 28 : ctx-&gt;window_state = write_window;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 40 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : </a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 40 : break;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : }</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 150 : case HIOMAP_C_MARK_DIRTY:</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : case HIOMAP_C_FLUSH:</a>
+<a name="211"><span class="lineNum"> 211 </span> : : case HIOMAP_C_ACK:</a>
+<a name="212"><span class="lineNum"> 212 </span> : : case HIOMAP_C_ERASE:</a>
+<a name="213"><span class="lineNum"> 213 </span> : : case HIOMAP_C_RESET:</a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 150 : if (msg-&gt;resp_size != 2) {</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 4 : prerror(&quot;%u: Unexpected response size: %u\n&quot;, msg-&gt;data[0],</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : msg-&gt;resp_size);</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 4 : res-&gt;cc = IPMI_ERR_UNSPECIFIED;</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : }</a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 146 : break;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : prlog(PR_WARNING, &quot;Unimplemented command handler: %u\n&quot;,</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : msg-&gt;data[0]);</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : };</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 303 : ipmi_free_msg(msg);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 57 : static void hiomap_init(struct ipmi_hiomap *ctx)</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : {</a>
+<a name="231"><span class="lineNum"> 231 </span> : : /*</a>
+<a name="232"><span class="lineNum"> 232 </span> : : * Speculatively mark the daemon as available so we attempt to perform</a>
+<a name="233"><span class="lineNum"> 233 </span> : : * the handshake without immediately bailing out.</a>
+<a name="234"><span class="lineNum"> 234 </span> : : */</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 57 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 57 : ctx-&gt;bmc_state = HIOMAP_E_DAEMON_READY;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 57 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 57 : }</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 58 : static int hiomap_get_info(struct ipmi_hiomap *ctx)</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : {</a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 58 : RESULT_INIT(res, ctx);</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : unsigned char req[3];</a>
+<a name="244"><span class="lineNum"> 244 </span> : : struct ipmi_msg *msg;</a>
+<a name="245"><span class="lineNum"> 245 </span> : : int rc;</a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> : : /* Negotiate protocol version 2 */</a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 58 : req[0] = HIOMAP_C_GET_INFO;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 58 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 58 : req[2] = HIOMAP_V2;</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 58 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 58 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req), 6);</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 58 : rc = hiomap_queue_msg_sync(ctx, msg);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 58 : if (rc)</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 58 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 4 : prerror(&quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 4 : return FLASH_ERR_PARM_ERROR; /* XXX: Find something better? */</span></a>
+<a name="263"><span class="lineNum"> 263 </span> : : }</a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 54 : return 0;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 55 : static int hiomap_get_flash_info(struct ipmi_hiomap *ctx)</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 55 : RESULT_INIT(res, ctx);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : unsigned char req[2];</a>
+<a name="272"><span class="lineNum"> 272 </span> : : struct ipmi_msg *msg;</a>
+<a name="273"><span class="lineNum"> 273 </span> : : int rc;</a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 55 : req[0] = HIOMAP_C_GET_FLASH_INFO;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 55 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 55 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 55 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req), 2 + 2 + 2);</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 55 : rc = hiomap_queue_msg_sync(ctx, msg);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 55 : if (rc)</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 55 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 4 : prerror(&quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 4 : return FLASH_ERR_PARM_ERROR; /* XXX: Find something better? */</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : }</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 51 : return 0;</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : }</a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 53 : static int hiomap_window_move(struct ipmi_hiomap *ctx, uint8_t command,</span></a>
+<a name="294"><span class="lineNum"> 294 </span> : : uint64_t pos, uint64_t len, uint64_t *size)</a>
+<a name="295"><span class="lineNum"> 295 </span> : : {</a>
+<a name="296"><span class="lineNum"> 296 </span> : : enum lpc_window_state want_state;</a>
+<a name="297"><span class="lineNum"> 297 </span> : : struct hiomap_v2_range *range;</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 53 : RESULT_INIT(res, ctx);</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : unsigned char req[6];</a>
+<a name="300"><span class="lineNum"> 300 </span> : : struct ipmi_msg *msg;</a>
+<a name="301"><span class="lineNum"> 301 </span> : : bool valid_state;</a>
+<a name="302"><span class="lineNum"> 302 </span> : : bool is_read;</a>
+<a name="303"><span class="lineNum"> 303 </span> : : int rc;</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 53 : is_read = (command == HIOMAP_C_CREATE_READ_WINDOW);</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 53 : want_state = is_read ? read_window : write_window;</span></a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 53 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 53 : valid_state = want_state == ctx-&gt;window_state;</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 53 : rc = hiomap_window_valid(ctx, pos, len);</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 53 : if (valid_state &amp;&amp; !rc) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 3 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 3 : *size = len;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 3 : return 0;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : }</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 50 : ctx-&gt;window_state = closed_window;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 50 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> : : </a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 50 : req[0] = command;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 50 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="324"><span class="lineNum"> 324 </span> : : </a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 50 : range = (struct hiomap_v2_range *)&amp;req[2];</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 50 : range-&gt;offset = cpu_to_le16(bytes_to_blocks(ctx, pos));</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 50 : range-&gt;size = cpu_to_le16(bytes_to_blocks_align_up(ctx, pos, len));</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : </a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 50 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 50 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req),</a>
+<a name="332"><span class="lineNum"> 332 </span> : : 2 + 2 + 2 + 2);</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 50 : rc = hiomap_queue_msg_sync(ctx, msg);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 50 : if (rc)</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 46 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 6 : prlog(PR_INFO, &quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 6 : return FLASH_ERR_PARM_ERROR; /* XXX: Find something better? */</span></a>
+<a name="341"><span class="lineNum"> 341 </span> : : }</a>
+<a name="342"><span class="lineNum"> 342 </span> : : </a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 40 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 40 : *size = len;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : /* Is length past the end of the window? */</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 40 : if ((pos + len) &gt; (ctx-&gt;current.cur_pos + ctx-&gt;current.size))</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : /* Adjust size to meet current window */</a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 5 : *size = (ctx-&gt;current.cur_pos + ctx-&gt;current.size) - pos;</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 40 : if (len != 0 &amp;&amp; *size == 0) {</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Invalid window properties: len: %&quot;PRIu64&quot;, size: %&quot;PRIu64&quot;\n&quot;,</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : len, *size);</a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : }</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 40 : prlog(PR_DEBUG, &quot;Opened %s window from 0x%x for %u bytes at 0x%x\n&quot;,</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : (command == HIOMAP_C_CREATE_READ_WINDOW) ? &quot;read&quot; : &quot;write&quot;,</a>
+<a name="359"><span class="lineNum"> 359 </span> : : ctx-&gt;current.cur_pos, ctx-&gt;current.size, ctx-&gt;current.lpc_addr);</a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 40 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 40 : return 0;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : }</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 15 : static int hiomap_mark_dirty(struct ipmi_hiomap *ctx, uint64_t offset,</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : uint64_t size)</a>
+<a name="368"><span class="lineNum"> 368 </span> : : {</a>
+<a name="369"><span class="lineNum"> 369 </span> : : struct hiomap_v2_range *range;</a>
+<a name="370"><span class="lineNum"> 370 </span> : : enum lpc_window_state state;</a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 15 : RESULT_INIT(res, ctx);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> : : unsigned char req[6];</a>
+<a name="373"><span class="lineNum"> 373 </span> : : struct ipmi_msg *msg;</a>
+<a name="374"><span class="lineNum"> 374 </span> : : uint32_t pos;</a>
+<a name="375"><span class="lineNum"> 375 </span> : : int rc;</a>
+<a name="376"><span class="lineNum"> 376 </span> : : </a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 15 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 15 : state = ctx-&gt;window_state;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 15 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 15 : if (state != write_window)</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : </a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 15 : req[0] = HIOMAP_C_MARK_DIRTY;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 15 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 15 : pos = offset - ctx-&gt;current.cur_pos;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineCov"> 15 : range = (struct hiomap_v2_range *)&amp;req[2];</span></a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 15 : range-&gt;offset = cpu_to_le16(bytes_to_blocks(ctx, pos));</span></a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 15 : range-&gt;size = cpu_to_le16(bytes_to_blocks_align_up(ctx, pos, size));</span></a>
+<a name="391"><span class="lineNum"> 391 </span> : : </a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 15 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 15 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req), 2);</a>
+<a name="395"><span class="lineNum"> 395 </span> : : </a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineCov"> 15 : rc = hiomap_queue_msg_sync(ctx, msg);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 15 : if (rc)</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : </a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 14 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 3 : prerror(&quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 3 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : }</a>
+<a name="404"><span class="lineNum"> 404 </span> : : </a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 11 : prlog(PR_DEBUG, &quot;Marked flash dirty at 0x%&quot; PRIx64 &quot; for %&quot; PRIu64 &quot;\n&quot;,</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : offset, size);</a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 11 : return 0;</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : }</a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 22 : static int hiomap_flush(struct ipmi_hiomap *ctx)</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : {</a>
+<a name="413"><span class="lineNum"> 413 </span> : : enum lpc_window_state state;</a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 22 : RESULT_INIT(res, ctx);</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : unsigned char req[2];</a>
+<a name="416"><span class="lineNum"> 416 </span> : : struct ipmi_msg *msg;</a>
+<a name="417"><span class="lineNum"> 417 </span> : : int rc;</a>
+<a name="418"><span class="lineNum"> 418 </span> : : </a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineCov"> 22 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 22 : state = ctx-&gt;window_state;</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineCov"> 22 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 22 : if (state != write_window)</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : </a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 22 : req[0] = HIOMAP_C_FLUSH;</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 22 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 22 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 22 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="431"><span class="lineNum"> 431 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req), 2);</a>
+<a name="432"><span class="lineNum"> 432 </span> : : </a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 22 : rc = hiomap_queue_msg_sync(ctx, msg);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 22 : if (rc)</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 22 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineCov"> 3 : prerror(&quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 3 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : }</a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 19 : prlog(PR_DEBUG, &quot;Flushed writes\n&quot;);</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 19 : return 0;</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 67 : static int hiomap_ack(struct ipmi_hiomap *ctx, uint8_t ack)</span></a>
+<a name="448"><span class="lineNum"> 448 </span> : : {</a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineCov"> 67 : RESULT_INIT(res, ctx);</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : unsigned char req[3];</a>
+<a name="451"><span class="lineNum"> 451 </span> : : struct ipmi_msg *msg;</a>
+<a name="452"><span class="lineNum"> 452 </span> : : int rc;</a>
+<a name="453"><span class="lineNum"> 453 </span> : : </a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 67 : req[0] = HIOMAP_C_ACK;</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 67 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineCov"> 67 : req[2] = ack;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : </a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 67 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 67 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req), 2);</a>
+<a name="461"><span class="lineNum"> 461 </span> : : </a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 67 : rc = hiomap_queue_msg_sync(ctx, msg);</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 67 : if (rc)</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 2 : return rc;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 65 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 6 : prlog(PR_DEBUG, &quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 6 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="469"><span class="lineNum"> 469 </span> : : }</a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 59 : prlog(PR_DEBUG, &quot;Acked events: 0x%x\n&quot;, ack);</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : </a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 59 : return 0;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : }</a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 15 : static int hiomap_erase(struct ipmi_hiomap *ctx, uint64_t offset,</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : uint64_t size)</a>
+<a name="478"><span class="lineNum"> 478 </span> : : {</a>
+<a name="479"><span class="lineNum"> 479 </span> : : struct hiomap_v2_range *range;</a>
+<a name="480"><span class="lineNum"> 480 </span> : : enum lpc_window_state state;</a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineCov"> 15 : RESULT_INIT(res, ctx);</span></a>
+<a name="482"><span class="lineNum"> 482 </span> : : unsigned char req[6];</a>
+<a name="483"><span class="lineNum"> 483 </span> : : struct ipmi_msg *msg;</a>
+<a name="484"><span class="lineNum"> 484 </span> : : uint32_t pos;</a>
+<a name="485"><span class="lineNum"> 485 </span> : : int rc;</a>
+<a name="486"><span class="lineNum"> 486 </span> : : </a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 15 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineCov"> 15 : state = ctx-&gt;window_state;</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 15 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="490"><span class="lineNum"> 490 </span> : : </a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 15 : if (state != write_window)</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="493"><span class="lineNum"> 493 </span> : : </a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 15 : req[0] = HIOMAP_C_ERASE;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineCov"> 15 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> : : </a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 15 : pos = offset - ctx-&gt;current.cur_pos;</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineCov"> 15 : range = (struct hiomap_v2_range *)&amp;req[2];</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 15 : range-&gt;offset = cpu_to_le16(bytes_to_blocks(ctx, pos));</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineCov"> 15 : range-&gt;size = cpu_to_le16(bytes_to_blocks_align_up(ctx, pos, size));</span></a>
+<a name="501"><span class="lineNum"> 501 </span> : : </a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 15 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 15 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="504"><span class="lineNum"> 504 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req), 2);</a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineCov"> 15 : rc = hiomap_queue_msg_sync(ctx, msg);</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineCov"> 15 : if (rc)</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 14 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 3 : prerror(&quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 3 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : }</a>
+<a name="513"><span class="lineNum"> 513 </span> : : </a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 11 : prlog(PR_DEBUG, &quot;Erased flash at 0x%&quot; PRIx64 &quot; for %&quot; PRIu64 &quot;\n&quot;,</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : offset, size);</a>
+<a name="516"><span class="lineNum"> 516 </span> : : </a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 11 : return 0;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : }</a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 46 : static bool hiomap_reset(struct ipmi_hiomap *ctx)</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : {</a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 46 : RESULT_INIT(res, ctx);</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : unsigned char req[2];</a>
+<a name="524"><span class="lineNum"> 524 </span> : : struct ipmi_msg *msg;</a>
+<a name="525"><span class="lineNum"> 525 </span> : : </a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineCov"> 46 : prlog(PR_NOTICE, &quot;Reset\n&quot;);</span></a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 46 : req[0] = HIOMAP_C_RESET;</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 46 : req[1] = ++ctx-&gt;seq;</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 46 : msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 46 : bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd,</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : ipmi_hiomap_cmd_cb, &amp;res, req, sizeof(req), 2);</a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineCov"> 46 : ipmi_queue_msg_sync(msg);</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : </a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineCov"> 46 : if (res.cc != IPMI_CC_NO_ERROR) {</span></a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;%s failed: %d\n&quot;, __func__, res.cc);</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="538"><span class="lineNum"> 538 </span> : : }</a>
+<a name="539"><span class="lineNum"> 539 </span> : : </a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 46 : return true;</span></a>
+<a name="541"><span class="lineNum"> 541 </span> : : }</a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 24 : static void hiomap_event(uint8_t events, void *context)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : {</a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 24 : struct ipmi_hiomap *ctx = context;</span></a>
+<a name="546"><span class="lineNum"> 546 </span> : : </a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineCov"> 24 : prlog(PR_DEBUG, &quot;Received events: 0x%x\n&quot;, events);</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 24 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineCov"> 24 : ctx-&gt;bmc_state = events | (ctx-&gt;bmc_state &amp; HIOMAP_E_ACK_MASK);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineCov"> 24 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineCov"> 24 : }</span></a>
+<a name="553"><span class="lineNum"> 553 </span> : : </a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineCov"> 13 : static int lpc_window_read(struct ipmi_hiomap *ctx, uint32_t pos,</span></a>
+<a name="555"><span class="lineNum"> 555 </span> : : void *buf, uint32_t len)</a>
+<a name="556"><span class="lineNum"> 556 </span> : : {</a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineCov"> 13 : uint32_t off = ctx-&gt;current.lpc_addr + (pos - ctx-&gt;current.cur_pos);</span></a>
+<a name="558"><span class="lineNum"> 558 </span> : : int rc;</a>
+<a name="559"><span class="lineNum"> 559 </span> : : </a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineCov"> 13 : if ((ctx-&gt;current.lpc_addr + ctx-&gt;current.size) &lt; (off + len))</span></a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="562"><span class="lineNum"> 562 </span> : : </a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineCov"> 13 : prlog(PR_TRACE, &quot;Reading at 0x%08x for 0x%08x offset: 0x%08x\n&quot;,</span></a>
+<a name="564"><span class="lineNum"> 564 </span> : : pos, len, off);</a>
+<a name="565"><span class="lineNum"> 565 </span> : : </a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 15375 : while(len) {</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : uint32_t chunk;</a>
+<a name="568"><span class="lineNum"> 568 </span> : : uint32_t dat;</a>
+<a name="569"><span class="lineNum"> 569 </span> : : </a>
+<a name="570"><span class="lineNum"> 570 </span> : : /* XXX: make this read until it's aligned */</a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineCov"> 15362 : if (len &gt; 3 &amp;&amp; !(off &amp; 3)) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineCov"> 15360 : rc = lpc_read(OPAL_LPC_FW, off, &amp;dat, 4);</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineCov"> 15360 : if (!rc) {</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : /*</a>
+<a name="575"><span class="lineNum"> 575 </span> : : * lpc_read swaps to CPU endian but it's not</a>
+<a name="576"><span class="lineNum"> 576 </span> : : * really a 32-bit value, so convert back.</a>
+<a name="577"><span class="lineNum"> 577 </span> : : */</a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineCov"> 15360 : *(__be32 *)buf = cpu_to_be32(dat);</span></a>
+<a name="579"><span class="lineNum"> 579 </span> : : }</a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineCov"> 15360 : chunk = 4;</span></a>
+<a name="581"><span class="lineNum"> 581 </span> : : } else {</a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineCov"> 2 : rc = lpc_read(OPAL_LPC_FW, off, &amp;dat, 1);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineCov"> 2 : if (!rc)</span></a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineCov"> 2 : *(uint8_t *)buf = dat;</span></a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineCov"> 2 : chunk = 1;</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : }</a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 15362 : if (rc) {</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;lpc_read failure %d to FW 0x%08x\n&quot;, rc, off);</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> : : }</a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineCov"> 15362 : len -= chunk;</span></a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 15362 : off += chunk;</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 15362 : buf += chunk;</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : }</a>
+<a name="595"><span class="lineNum"> 595 </span> : : </a>
+<a name="596"><span class="lineNum"> 596 </span> :<span class="lineCov"> 13 : return 0;</span></a>
+<a name="597"><span class="lineNum"> 597 </span> : : }</a>
+<a name="598"><span class="lineNum"> 598 </span> : : </a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineCov"> 15 : static int lpc_window_write(struct ipmi_hiomap *ctx, uint32_t pos,</span></a>
+<a name="600"><span class="lineNum"> 600 </span> : : const void *buf, uint32_t len)</a>
+<a name="601"><span class="lineNum"> 601 </span> : : {</a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 15 : uint32_t off = ctx-&gt;current.lpc_addr + (pos - ctx-&gt;current.cur_pos);</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : enum lpc_window_state state;</a>
+<a name="604"><span class="lineNum"> 604 </span> : : int rc;</a>
+<a name="605"><span class="lineNum"> 605 </span> : : </a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineCov"> 15 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineCov"> 15 : state = ctx-&gt;window_state;</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineCov"> 15 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="609"><span class="lineNum"> 609 </span> : : </a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineCov"> 15 : if (state != write_window)</span></a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="612"><span class="lineNum"> 612 </span> : : </a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineCov"> 15 : if ((ctx-&gt;current.lpc_addr + ctx-&gt;current.size) &lt; (off + len))</span></a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="615"><span class="lineNum"> 615 </span> : : </a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineCov"> 15 : prlog(PR_TRACE, &quot;Writing at 0x%08x for 0x%08x offset: 0x%08x\n&quot;,</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : pos, len, off);</a>
+<a name="618"><span class="lineNum"> 618 </span> : : </a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineCov"> 13329 : while(len) {</span></a>
+<a name="620"><span class="lineNum"> 620 </span> : : uint32_t chunk;</a>
+<a name="621"><span class="lineNum"> 621 </span> : : </a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineCov"> 13314 : if (len &gt; 3 &amp;&amp; !(off &amp; 3)) {</span></a>
+<a name="623"><span class="lineNum"> 623 </span> : : /* endian swap: see lpc_window_write */</a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineCov"> 13312 : uint32_t dat = be32_to_cpu(*(__be32 *)buf);</span></a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineCov"> 13312 : rc = lpc_write(OPAL_LPC_FW, off, dat, 4);</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 13312 : chunk = 4;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : } else {</a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 2 : uint8_t dat = *(uint8_t *)buf;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : </a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 2 : rc = lpc_write(OPAL_LPC_FW, off, dat, 1);</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 2 : chunk = 1;</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : }</a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 13314 : if (rc) {</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;lpc_write failure %d to FW 0x%08x\n&quot;, rc, off);</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="637"><span class="lineNum"> 637 </span> : : }</a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineCov"> 13314 : len -= chunk;</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineCov"> 13314 : off += chunk;</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineCov"> 13314 : buf += chunk;</span></a>
+<a name="641"><span class="lineNum"> 641 </span> : : }</a>
+<a name="642"><span class="lineNum"> 642 </span> : : </a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 15 : return 0;</span></a>
+<a name="644"><span class="lineNum"> 644 </span> : : }</a>
+<a name="645"><span class="lineNum"> 645 </span> : : </a>
+<a name="646"><span class="lineNum"> 646 </span> : : /* Best-effort asynchronous event handling by blocklevel callbacks */</a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 54 : static int ipmi_hiomap_handle_events(struct ipmi_hiomap *ctx)</span></a>
+<a name="648"><span class="lineNum"> 648 </span> : : {</a>
+<a name="649"><span class="lineNum"> 649 </span> : : uint8_t status;</a>
+<a name="650"><span class="lineNum"> 650 </span> : : int rc;</a>
+<a name="651"><span class="lineNum"> 651 </span> : : </a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 54 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 54 : status = ctx-&gt;bmc_state;</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : </a>
+<a name="656"><span class="lineNum"> 656 </span> : : /*</a>
+<a name="657"><span class="lineNum"> 657 </span> : : * Immediately clear the ackable events to make sure we don't race to</a>
+<a name="658"><span class="lineNum"> 658 </span> : : * clear them after dropping the lock, as we may lose protocol or</a>
+<a name="659"><span class="lineNum"> 659 </span> : : * window state if a race materialises. In the event of a failure where</a>
+<a name="660"><span class="lineNum"> 660 </span> : : * we haven't completed the recovery, the state we mask out below gets</a>
+<a name="661"><span class="lineNum"> 661 </span> : : * OR'ed back in to avoid losing it.</a>
+<a name="662"><span class="lineNum"> 662 </span> : : */</a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 54 : ctx-&gt;bmc_state &amp;= ~HIOMAP_E_ACK_MASK;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> : : </a>
+<a name="665"><span class="lineNum"> 665 </span> : : /*</a>
+<a name="666"><span class="lineNum"> 666 </span> : : * We won't be attempting to restore window state -</a>
+<a name="667"><span class="lineNum"> 667 </span> : : * ipmi_hiomap_handle_events() is followed by hiomap_window_move() in</a>
+<a name="668"><span class="lineNum"> 668 </span> : : * all cases. Attempting restoration after HIOMAP_E_PROTOCOL_RESET or</a>
+<a name="669"><span class="lineNum"> 669 </span> : : * HIOMAP_E_WINDOW_RESET can be wasteful if we immediately shift the</a>
+<a name="670"><span class="lineNum"> 670 </span> : : * window elsewhere, and if it does not need to be shifted with respect</a>
+<a name="671"><span class="lineNum"> 671 </span> : : * to the subsequent request then hiomap_window_move() will handle</a>
+<a name="672"><span class="lineNum"> 672 </span> : : * re-opening it from the closed state.</a>
+<a name="673"><span class="lineNum"> 673 </span> : : *</a>
+<a name="674"><span class="lineNum"> 674 </span> : : * Therefore it is enough to mark the window as closed to consider it</a>
+<a name="675"><span class="lineNum"> 675 </span> : : * recovered.</a>
+<a name="676"><span class="lineNum"> 676 </span> : : */</a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineCov"> 54 : if (status &amp; (HIOMAP_E_PROTOCOL_RESET | HIOMAP_E_WINDOW_RESET))</span></a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineCov"> 10 : ctx-&gt;window_state = closed_window;</span></a>
+<a name="679"><span class="lineNum"> 679 </span> : : </a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineCov"> 54 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : </a>
+<a name="682"><span class="lineNum"> 682 </span> : : /*</a>
+<a name="683"><span class="lineNum"> 683 </span> : : * If there's anything to acknowledge, do so in the one request to</a>
+<a name="684"><span class="lineNum"> 684 </span> : : * minimise overhead. By sending the ACK prior to performing the</a>
+<a name="685"><span class="lineNum"> 685 </span> : : * protocol recovery we ensure that even with coalesced resets we still</a>
+<a name="686"><span class="lineNum"> 686 </span> : : * end up in the recovered state and not unknowingly stuck in a reset</a>
+<a name="687"><span class="lineNum"> 687 </span> : : * state. We may receive reset events after the ACK but prior to the</a>
+<a name="688"><span class="lineNum"> 688 </span> : : * recovery procedures being run, but this just means that we will</a>
+<a name="689"><span class="lineNum"> 689 </span> : : * needlessly perform recovery on the following invocation of</a>
+<a name="690"><span class="lineNum"> 690 </span> : : * ipmi_hiomap_handle_events(). If the reset event is a</a>
+<a name="691"><span class="lineNum"> 691 </span> : : * HIOMAP_E_WINDOW_RESET it is enough that the window is already marked</a>
+<a name="692"><span class="lineNum"> 692 </span> : : * as closed above - future accesses will force it to be re-opened and</a>
+<a name="693"><span class="lineNum"> 693 </span> : : * the BMC's cache must be valid if opening the window is successful.</a>
+<a name="694"><span class="lineNum"> 694 </span> : : */</a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 54 : if (status &amp; HIOMAP_E_ACK_MASK) {</span></a>
+<a name="696"><span class="lineNum"> 696 </span> : : /* ACK is unversioned, can send it if the daemon is ready */</a>
+<a name="697"><span class="lineNum"> 697 </span> :<span class="lineCov"> 10 : rc = hiomap_ack(ctx, status &amp; HIOMAP_E_ACK_MASK);</span></a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineCov"> 10 : if (rc) {</span></a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineCov"> 3 : prlog(PR_DEBUG, &quot;Failed to ack events: 0x%x\n&quot;,</span></a>
+<a name="700"><span class="lineNum"> 700 </span> : : status &amp; HIOMAP_E_ACK_MASK);</a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineCov"> 3 : goto restore;</span></a>
+<a name="702"><span class="lineNum"> 702 </span> : : }</a>
+<a name="703"><span class="lineNum"> 703 </span> : : }</a>
+<a name="704"><span class="lineNum"> 704 </span> : : </a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineCov"> 51 : if (status &amp; HIOMAP_E_PROTOCOL_RESET) {</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 6 : prlog(PR_INFO, &quot;Protocol was reset\n&quot;);</span></a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineCov"> 6 : rc = hiomap_get_info(ctx);</span></a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineCov"> 6 : if (rc) {</span></a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 1 : prerror(&quot;Failure to renegotiate after protocol reset\n&quot;);</span></a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineCov"> 1 : goto restore;</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : }</a>
+<a name="713"><span class="lineNum"> 713 </span> : : </a>
+<a name="714"><span class="lineNum"> 714 </span> :<span class="lineCov"> 5 : rc = hiomap_get_flash_info(ctx);</span></a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineCov"> 5 : if (rc) {</span></a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineCov"> 1 : prerror(&quot;Failure to fetch flash info after protocol reset\n&quot;);</span></a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 1 : goto restore;</span></a>
+<a name="718"><span class="lineNum"> 718 </span> : : }</a>
+<a name="719"><span class="lineNum"> 719 </span> : : </a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 4 : prlog(PR_INFO, &quot;Restored state after protocol reset\n&quot;);</span></a>
+<a name="721"><span class="lineNum"> 721 </span> : : }</a>
+<a name="722"><span class="lineNum"> 722 </span> : : </a>
+<a name="723"><span class="lineNum"> 723 </span> : : /*</a>
+<a name="724"><span class="lineNum"> 724 </span> : : * As there's no change to the protocol on HIOMAP_E_WINDOW_RESET we</a>
+<a name="725"><span class="lineNum"> 725 </span> : : * simply need to open a window to recover, which as mentioned above is</a>
+<a name="726"><span class="lineNum"> 726 </span> : : * handled by hiomap_window_move() after our cleanup here.</a>
+<a name="727"><span class="lineNum"> 727 </span> : : */</a>
+<a name="728"><span class="lineNum"> 728 </span> : : </a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineCov"> 49 : return 0;</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineCov"> 5 : restore:</span></a>
+<a name="732"><span class="lineNum"> 732 </span> : : /*</a>
+<a name="733"><span class="lineNum"> 733 </span> : : * Conservatively restore the events to the un-acked state to avoid</a>
+<a name="734"><span class="lineNum"> 734 </span> : : * losing events due to races. It might cause us to restore state more</a>
+<a name="735"><span class="lineNum"> 735 </span> : : * than necessary, but never less than necessary.</a>
+<a name="736"><span class="lineNum"> 736 </span> : : */</a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineCov"> 5 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="738"><span class="lineNum"> 738 </span> :<span class="lineCov"> 5 : ctx-&gt;bmc_state |= (status &amp; HIOMAP_E_ACK_MASK);</span></a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineCov"> 5 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="740"><span class="lineNum"> 740 </span> : : </a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 5 : return rc;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> : : }</a>
+<a name="743"><span class="lineNum"> 743 </span> : : </a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineCov"> 18 : static int ipmi_hiomap_read(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="745"><span class="lineNum"> 745 </span> : : void *buf, uint64_t len)</a>
+<a name="746"><span class="lineNum"> 746 </span> : : {</a>
+<a name="747"><span class="lineNum"> 747 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="748"><span class="lineNum"> 748 </span> : : uint64_t size;</a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineCov"> 18 : int rc = 0;</span></a>
+<a name="750"><span class="lineNum"> 750 </span> : : </a>
+<a name="751"><span class="lineNum"> 751 </span> : : /* LPC is only 32bit */</a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineCov"> 18 : if (pos &gt; UINT_MAX || len &gt; UINT_MAX)</span></a>
+<a name="753"><span class="lineNum"> 753 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="754"><span class="lineNum"> 754 </span> : : </a>
+<a name="755"><span class="lineNum"> 755 </span> :<span class="lineCov"> 18 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineCov"> 18 : rc = ipmi_hiomap_handle_events(ctx);</span></a>
+<a name="758"><span class="lineNum"> 758 </span> :<span class="lineCov"> 18 : if (rc)</span></a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineCov"> 2 : return rc;</span></a>
+<a name="760"><span class="lineNum"> 760 </span> : : </a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineCov"> 16 : prlog(PR_TRACE, &quot;Flash read at %#&quot; PRIx64 &quot; for %#&quot; PRIx64 &quot;\n&quot;, pos,</span></a>
+<a name="762"><span class="lineNum"> 762 </span> : : len);</a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 28 : while (len &gt; 0) {</span></a>
+<a name="764"><span class="lineNum"> 764 </span> : : /* Move window and get a new size to read */</a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineCov"> 18 : rc = hiomap_window_move(ctx, HIOMAP_C_CREATE_READ_WINDOW, pos,</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : len, &amp;size);</a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineCov"> 18 : if (rc)</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineCov"> 5 : return rc;</span></a>
+<a name="769"><span class="lineNum"> 769 </span> : : </a>
+<a name="770"><span class="lineNum"> 770 </span> : : /* Perform the read for this window */</a>
+<a name="771"><span class="lineNum"> 771 </span> :<span class="lineCov"> 13 : rc = lpc_window_read(ctx, pos, buf, size);</span></a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineCov"> 13 : if (rc)</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : </a>
+<a name="775"><span class="lineNum"> 775 </span> : : /* Check we can trust what we read */</a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineCov"> 13 : lock(&amp;ctx-&gt;lock);</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 13 : rc = hiomap_window_valid(ctx, pos, size);</span></a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineCov"> 13 : unlock(&amp;ctx-&gt;lock);</span></a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineCov"> 13 : if (rc)</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 12 : len -= size;</span></a>
+<a name="783"><span class="lineNum"> 783 </span> :<span class="lineCov"> 12 : pos += size;</span></a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 12 : buf += size;</span></a>
+<a name="785"><span class="lineNum"> 785 </span> : : }</a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineCov"> 10 : return rc;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> : : </a>
+<a name="788"><span class="lineNum"> 788 </span> : : }</a>
+<a name="789"><span class="lineNum"> 789 </span> : : </a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineCov"> 17 : static int ipmi_hiomap_write(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : const void *buf, uint64_t len)</a>
+<a name="792"><span class="lineNum"> 792 </span> : : {</a>
+<a name="793"><span class="lineNum"> 793 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="794"><span class="lineNum"> 794 </span> : : uint64_t size;</a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineCov"> 17 : int rc = 0;</span></a>
+<a name="796"><span class="lineNum"> 796 </span> : : </a>
+<a name="797"><span class="lineNum"> 797 </span> : : /* LPC is only 32bit */</a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineCov"> 17 : if (pos &gt; UINT_MAX || len &gt; UINT_MAX)</span></a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineCov"> 17 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="802"><span class="lineNum"> 802 </span> : : </a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineCov"> 17 : rc = ipmi_hiomap_handle_events(ctx);</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineCov"> 17 : if (rc)</span></a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="806"><span class="lineNum"> 806 </span> : : </a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineCov"> 17 : prlog(PR_TRACE, &quot;Flash write at %#&quot; PRIx64 &quot; for %#&quot; PRIx64 &quot;\n&quot;, pos,</span></a>
+<a name="808"><span class="lineNum"> 808 </span> : : len);</a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineCov"> 25 : while (len &gt; 0) {</span></a>
+<a name="810"><span class="lineNum"> 810 </span> : : /* Move window and get a new size to read */</a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineCov"> 19 : rc = hiomap_window_move(ctx, HIOMAP_C_CREATE_WRITE_WINDOW, pos,</span></a>
+<a name="812"><span class="lineNum"> 812 </span> : : len, &amp;size);</a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineCov"> 19 : if (rc)</span></a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="815"><span class="lineNum"> 815 </span> : : </a>
+<a name="816"><span class="lineNum"> 816 </span> : : /* Perform the write for this window */</a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 15 : rc = lpc_window_write(ctx, pos, buf, size);</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 15 : if (rc)</span></a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="820"><span class="lineNum"> 820 </span> : : </a>
+<a name="821"><span class="lineNum"> 821 </span> : : /*</a>
+<a name="822"><span class="lineNum"> 822 </span> : : * Unlike ipmi_hiomap_read() we don't explicitly test if the</a>
+<a name="823"><span class="lineNum"> 823 </span> : : * window is still valid after completing the LPC accesses as</a>
+<a name="824"><span class="lineNum"> 824 </span> : : * the following hiomap_mark_dirty() will implicitly check for</a>
+<a name="825"><span class="lineNum"> 825 </span> : : * us. In the case of a read operation there's no requirement</a>
+<a name="826"><span class="lineNum"> 826 </span> : : * that a command that validates window state follows, so the</a>
+<a name="827"><span class="lineNum"> 827 </span> : : * read implementation explicitly performs a check.</a>
+<a name="828"><span class="lineNum"> 828 </span> : : */</a>
+<a name="829"><span class="lineNum"> 829 </span> : : </a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineCov"> 15 : rc = hiomap_mark_dirty(ctx, pos, size);</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineCov"> 15 : if (rc)</span></a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> : : </a>
+<a name="834"><span class="lineNum"> 834 </span> : : /*</a>
+<a name="835"><span class="lineNum"> 835 </span> : : * The BMC *should* flush if the window is implicitly closed,</a>
+<a name="836"><span class="lineNum"> 836 </span> : : * but do an explicit flush here to be sure.</a>
+<a name="837"><span class="lineNum"> 837 </span> : : *</a>
+<a name="838"><span class="lineNum"> 838 </span> : : * XXX: Removing this could improve performance</a>
+<a name="839"><span class="lineNum"> 839 </span> : : */</a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineCov"> 11 : rc = hiomap_flush(ctx);</span></a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineCov"> 3 : return rc;</span></a>
+<a name="843"><span class="lineNum"> 843 </span> : : </a>
+<a name="844"><span class="lineNum"> 844 </span> :<span class="lineCov"> 8 : len -= size;</span></a>
+<a name="845"><span class="lineNum"> 845 </span> :<span class="lineCov"> 8 : pos += size;</span></a>
+<a name="846"><span class="lineNum"> 846 </span> :<span class="lineCov"> 8 : buf += size;</span></a>
+<a name="847"><span class="lineNum"> 847 </span> : : }</a>
+<a name="848"><span class="lineNum"> 848 </span> :<span class="lineCov"> 6 : return rc;</span></a>
+<a name="849"><span class="lineNum"> 849 </span> : : }</a>
+<a name="850"><span class="lineNum"> 850 </span> : : </a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineCov"> 18 : static int ipmi_hiomap_erase(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="852"><span class="lineNum"> 852 </span> : : uint64_t len)</a>
+<a name="853"><span class="lineNum"> 853 </span> : : {</a>
+<a name="854"><span class="lineNum"> 854 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="855"><span class="lineNum"> 855 </span> : : int rc;</a>
+<a name="856"><span class="lineNum"> 856 </span> : : </a>
+<a name="857"><span class="lineNum"> 857 </span> : : /* LPC is only 32bit */</a>
+<a name="858"><span class="lineNum"> 858 </span> :<span class="lineCov"> 18 : if (pos &gt; UINT_MAX || len &gt; UINT_MAX)</span></a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="860"><span class="lineNum"> 860 </span> : : </a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineCov"> 18 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="862"><span class="lineNum"> 862 </span> : : </a>
+<a name="863"><span class="lineNum"> 863 </span> :<span class="lineCov"> 18 : rc = ipmi_hiomap_handle_events(ctx);</span></a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineCov"> 18 : if (rc)</span></a>
+<a name="865"><span class="lineNum"> 865 </span> :<span class="lineCov"> 3 : return rc;</span></a>
+<a name="866"><span class="lineNum"> 866 </span> : : </a>
+<a name="867"><span class="lineNum"> 867 </span> :<span class="lineCov"> 15 : prlog(PR_TRACE, &quot;Flash erase at 0x%08x for 0x%08x\n&quot;, (u32) pos,</span></a>
+<a name="868"><span class="lineNum"> 868 </span> : : (u32) len);</a>
+<a name="869"><span class="lineNum"> 869 </span> :<span class="lineCov"> 26 : while (len &gt; 0) {</span></a>
+<a name="870"><span class="lineNum"> 870 </span> : : uint64_t size;</a>
+<a name="871"><span class="lineNum"> 871 </span> : : </a>
+<a name="872"><span class="lineNum"> 872 </span> : : /* Move window and get a new size to erase */</a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineCov"> 16 : rc = hiomap_window_move(ctx, HIOMAP_C_CREATE_WRITE_WINDOW, pos,</span></a>
+<a name="874"><span class="lineNum"> 874 </span> : : len, &amp;size);</a>
+<a name="875"><span class="lineNum"> 875 </span> :<span class="lineCov"> 16 : if (rc)</span></a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineCov"> 5 : return rc;</span></a>
+<a name="877"><span class="lineNum"> 877 </span> : : </a>
+<a name="878"><span class="lineNum"> 878 </span> :<span class="lineCov"> 15 : rc = hiomap_erase(ctx, pos, size);</span></a>
+<a name="879"><span class="lineNum"> 879 </span> :<span class="lineCov"> 15 : if (rc)</span></a>
+<a name="880"><span class="lineNum"> 880 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="881"><span class="lineNum"> 881 </span> : : </a>
+<a name="882"><span class="lineNum"> 882 </span> : : /*</a>
+<a name="883"><span class="lineNum"> 883 </span> : : * Flush directly, don't mark that region dirty otherwise it</a>
+<a name="884"><span class="lineNum"> 884 </span> : : * isn't clear if a write happened there or not</a>
+<a name="885"><span class="lineNum"> 885 </span> : : */</a>
+<a name="886"><span class="lineNum"> 886 </span> :<span class="lineCov"> 11 : rc = hiomap_flush(ctx);</span></a>
+<a name="887"><span class="lineNum"> 887 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="888"><span class="lineNum"> 888 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="889"><span class="lineNum"> 889 </span> : : </a>
+<a name="890"><span class="lineNum"> 890 </span> :<span class="lineCov"> 11 : len -= size;</span></a>
+<a name="891"><span class="lineNum"> 891 </span> :<span class="lineCov"> 11 : pos += size;</span></a>
+<a name="892"><span class="lineNum"> 892 </span> : : }</a>
+<a name="893"><span class="lineNum"> 893 </span> : : </a>
+<a name="894"><span class="lineNum"> 894 </span> :<span class="lineCov"> 10 : return 0;</span></a>
+<a name="895"><span class="lineNum"> 895 </span> : : }</a>
+<a name="896"><span class="lineNum"> 896 </span> : : </a>
+<a name="897"><span class="lineNum"> 897 </span> :<span class="lineCov"> 1 : static int ipmi_hiomap_get_flash_info(struct blocklevel_device *bl,</span></a>
+<a name="898"><span class="lineNum"> 898 </span> : : const char **name, uint64_t *total_size,</a>
+<a name="899"><span class="lineNum"> 899 </span> : : uint32_t *erase_granule)</a>
+<a name="900"><span class="lineNum"> 900 </span> : : {</a>
+<a name="901"><span class="lineNum"> 901 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="902"><span class="lineNum"> 902 </span> : : int rc;</a>
+<a name="903"><span class="lineNum"> 903 </span> : : </a>
+<a name="904"><span class="lineNum"> 904 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="905"><span class="lineNum"> 905 </span> : : </a>
+<a name="906"><span class="lineNum"> 906 </span> :<span class="lineCov"> 1 : rc = ipmi_hiomap_handle_events(ctx);</span></a>
+<a name="907"><span class="lineNum"> 907 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="908"><span class="lineNum"> 908 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="909"><span class="lineNum"> 909 </span> : : </a>
+<a name="910"><span class="lineNum"> 910 </span> :<span class="lineCov"> 1 : rc = hiomap_get_flash_info(ctx);</span></a>
+<a name="911"><span class="lineNum"> 911 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="912"><span class="lineNum"> 912 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="913"><span class="lineNum"> 913 </span> : : </a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineCov"> 1 : ctx-&gt;bl.erase_mask = ctx-&gt;erase_granule - 1;</span></a>
+<a name="915"><span class="lineNum"> 915 </span> : : </a>
+<a name="916"><span class="lineNum"> 916 </span> :<span class="lineCov"> 1 : if (name)</span></a>
+<a name="917"><span class="lineNum"> 917 </span> :<span class="lineCov"> 1 : *name = NULL;</span></a>
+<a name="918"><span class="lineNum"> 918 </span> :<span class="lineCov"> 1 : if (total_size)</span></a>
+<a name="919"><span class="lineNum"> 919 </span> :<span class="lineCov"> 1 : *total_size = ctx-&gt;total_size;</span></a>
+<a name="920"><span class="lineNum"> 920 </span> :<span class="lineCov"> 1 : if (erase_granule)</span></a>
+<a name="921"><span class="lineNum"> 921 </span> :<span class="lineCov"> 1 : *erase_granule = ctx-&gt;erase_granule;</span></a>
+<a name="922"><span class="lineNum"> 922 </span> : : </a>
+<a name="923"><span class="lineNum"> 923 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="924"><span class="lineNum"> 924 </span> : : }</a>
+<a name="925"><span class="lineNum"> 925 </span> : : </a>
+<a name="926"><span class="lineNum"> 926 </span> :<span class="lineCov"> 57 : int ipmi_hiomap_init(struct blocklevel_device **bl)</span></a>
+<a name="927"><span class="lineNum"> 927 </span> : : {</a>
+<a name="928"><span class="lineNum"> 928 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="929"><span class="lineNum"> 929 </span> : : int rc;</a>
+<a name="930"><span class="lineNum"> 930 </span> : : </a>
+<a name="931"><span class="lineNum"> 931 </span> :<span class="lineCov"> 57 : if (!bmc_platform-&gt;sw-&gt;ipmi_oem_hiomap_cmd)</span></a>
+<a name="932"><span class="lineNum"> 932 </span> : : /* FIXME: Find a better error code */</a>
+<a name="933"><span class="lineNum"> 933 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_DEVICE_GONE;</span></a>
+<a name="934"><span class="lineNum"> 934 </span> : : </a>
+<a name="935"><span class="lineNum"> 935 </span> :<span class="lineCov"> 57 : if (!bl)</span></a>
+<a name="936"><span class="lineNum"> 936 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="937"><span class="lineNum"> 937 </span> : : </a>
+<a name="938"><span class="lineNum"> 938 </span> :<span class="lineCov"> 57 : *bl = NULL;</span></a>
+<a name="939"><span class="lineNum"> 939 </span> : : </a>
+<a name="940"><span class="lineNum"> 940 </span> :<span class="lineCov"> 57 : ctx = zalloc(sizeof(struct ipmi_hiomap));</span></a>
+<a name="941"><span class="lineNum"> 941 </span> :<span class="lineCov"> 57 : if (!ctx)</span></a>
+<a name="942"><span class="lineNum"> 942 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="943"><span class="lineNum"> 943 </span> : : </a>
+<a name="944"><span class="lineNum"> 944 </span> :<span class="lineCov"> 57 : init_lock(&amp;ctx-&gt;lock);</span></a>
+<a name="945"><span class="lineNum"> 945 </span> : : </a>
+<a name="946"><span class="lineNum"> 946 </span> :<span class="lineCov"> 57 : ctx-&gt;bl.read = &amp;ipmi_hiomap_read;</span></a>
+<a name="947"><span class="lineNum"> 947 </span> :<span class="lineCov"> 57 : ctx-&gt;bl.write = &amp;ipmi_hiomap_write;</span></a>
+<a name="948"><span class="lineNum"> 948 </span> :<span class="lineCov"> 57 : ctx-&gt;bl.erase = &amp;ipmi_hiomap_erase;</span></a>
+<a name="949"><span class="lineNum"> 949 </span> :<span class="lineCov"> 57 : ctx-&gt;bl.get_info = &amp;ipmi_hiomap_get_flash_info;</span></a>
+<a name="950"><span class="lineNum"> 950 </span> :<span class="lineCov"> 57 : ctx-&gt;bl.exit = &amp;ipmi_hiomap_exit;</span></a>
+<a name="951"><span class="lineNum"> 951 </span> : : </a>
+<a name="952"><span class="lineNum"> 952 </span> :<span class="lineCov"> 57 : hiomap_init(ctx);</span></a>
+<a name="953"><span class="lineNum"> 953 </span> : : </a>
+<a name="954"><span class="lineNum"> 954 </span> : : /* Ack all pending ack-able events to avoid spurious failures */</a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineCov"> 57 : rc = hiomap_ack(ctx, HIOMAP_E_ACK_MASK);</span></a>
+<a name="956"><span class="lineNum"> 956 </span> :<span class="lineCov"> 57 : if (rc) {</span></a>
+<a name="957"><span class="lineNum"> 957 </span> :<span class="lineCov"> 5 : prlog(PR_DEBUG, &quot;Failed to ack events: 0x%x\n&quot;,</span></a>
+<a name="958"><span class="lineNum"> 958 </span> : : HIOMAP_E_ACK_MASK);</a>
+<a name="959"><span class="lineNum"> 959 </span> :<span class="lineCov"> 5 : goto err;</span></a>
+<a name="960"><span class="lineNum"> 960 </span> : : }</a>
+<a name="961"><span class="lineNum"> 961 </span> : : </a>
+<a name="962"><span class="lineNum"> 962 </span> :<span class="lineCov"> 52 : rc = ipmi_sel_register(CMD_OP_HIOMAP_EVENT, hiomap_event, ctx);</span></a>
+<a name="963"><span class="lineNum"> 963 </span> :<span class="lineCov"> 52 : if (rc &lt; 0)</span></a>
+<a name="964"><span class="lineNum"> 964 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="965"><span class="lineNum"> 965 </span> : : </a>
+<a name="966"><span class="lineNum"> 966 </span> : : /* Negotiate protocol behaviour */</a>
+<a name="967"><span class="lineNum"> 967 </span> :<span class="lineCov"> 52 : rc = hiomap_get_info(ctx);</span></a>
+<a name="968"><span class="lineNum"> 968 </span> :<span class="lineCov"> 52 : if (rc) {</span></a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineCov"> 3 : prerror(&quot;Failed to get hiomap parameters: %d\n&quot;, rc);</span></a>
+<a name="970"><span class="lineNum"> 970 </span> :<span class="lineCov"> 3 : goto err;</span></a>
+<a name="971"><span class="lineNum"> 971 </span> : : }</a>
+<a name="972"><span class="lineNum"> 972 </span> : : </a>
+<a name="973"><span class="lineNum"> 973 </span> : : /* Grab the flash parameters */</a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 49 : rc = hiomap_get_flash_info(ctx);</span></a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineCov"> 49 : if (rc) {</span></a>
+<a name="976"><span class="lineNum"> 976 </span> :<span class="lineCov"> 3 : prerror(&quot;Failed to get flash parameters: %d\n&quot;, rc);</span></a>
+<a name="977"><span class="lineNum"> 977 </span> :<span class="lineCov"> 3 : goto err;</span></a>
+<a name="978"><span class="lineNum"> 978 </span> : : }</a>
+<a name="979"><span class="lineNum"> 979 </span> : : </a>
+<a name="980"><span class="lineNum"> 980 </span> :<span class="lineCov"> 46 : prlog(PR_NOTICE, &quot;Negotiated hiomap protocol v%u\n&quot;, ctx-&gt;version);</span></a>
+<a name="981"><span class="lineNum"> 981 </span> :<span class="lineCov"> 46 : prlog(PR_NOTICE, &quot;Block size is %uKiB\n&quot;,</span></a>
+<a name="982"><span class="lineNum"> 982 </span> : : 1 &lt;&lt; (ctx-&gt;block_size_shift - 10));</a>
+<a name="983"><span class="lineNum"> 983 </span> :<span class="lineCov"> 46 : prlog(PR_NOTICE, &quot;BMC suggested flash timeout of %us\n&quot;, ctx-&gt;timeout);</span></a>
+<a name="984"><span class="lineNum"> 984 </span> :<span class="lineCov"> 46 : prlog(PR_NOTICE, &quot;Flash size is %uMiB\n&quot;, ctx-&gt;total_size &gt;&gt; 20);</span></a>
+<a name="985"><span class="lineNum"> 985 </span> :<span class="lineCov"> 46 : prlog(PR_NOTICE, &quot;Erase granule size is %uKiB\n&quot;,</span></a>
+<a name="986"><span class="lineNum"> 986 </span> : : ctx-&gt;erase_granule &gt;&gt; 10);</a>
+<a name="987"><span class="lineNum"> 987 </span> : : </a>
+<a name="988"><span class="lineNum"> 988 </span> :<span class="lineCov"> 46 : ctx-&gt;bl.keep_alive = 0;</span></a>
+<a name="989"><span class="lineNum"> 989 </span> : : </a>
+<a name="990"><span class="lineNum"> 990 </span> :<span class="lineCov"> 46 : *bl = &amp;(ctx-&gt;bl);</span></a>
+<a name="991"><span class="lineNum"> 991 </span> : : </a>
+<a name="992"><span class="lineNum"> 992 </span> :<span class="lineCov"> 46 : return 0;</span></a>
+<a name="993"><span class="lineNum"> 993 </span> : : </a>
+<a name="994"><span class="lineNum"> 994 </span> :<span class="lineCov"> 11 : err:</span></a>
+<a name="995"><span class="lineNum"> 995 </span> :<span class="lineCov"> 11 : free(ctx);</span></a>
+<a name="996"><span class="lineNum"> 996 </span> : : </a>
+<a name="997"><span class="lineNum"> 997 </span> :<span class="lineCov"> 11 : return rc;</span></a>
+<a name="998"><span class="lineNum"> 998 </span> : : }</a>
+<a name="999"><span class="lineNum"> 999 </span> : : </a>
+<a name="1000"><span class="lineNum"> 1000 </span> :<span class="lineCov"> 46 : bool ipmi_hiomap_exit(struct blocklevel_device *bl)</span></a>
+<a name="1001"><span class="lineNum"> 1001 </span> : : {</a>
+<a name="1002"><span class="lineNum"> 1002 </span> :<span class="lineCov"> 46 : bool status = true;</span></a>
+<a name="1003"><span class="lineNum"> 1003 </span> : : </a>
+<a name="1004"><span class="lineNum"> 1004 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1005"><span class="lineNum"> 1005 </span> :<span class="lineCov"> 46 : if (bl) {</span></a>
+<a name="1006"><span class="lineNum"> 1006 </span> :<span class="lineCov"> 46 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1007"><span class="lineNum"> 1007 </span> :<span class="lineCov"> 46 : status = hiomap_reset(ctx);</span></a>
+<a name="1008"><span class="lineNum"> 1008 </span> :<span class="lineCov"> 46 : free(ctx);</span></a>
+<a name="1009"><span class="lineNum"> 1009 </span> : : }</a>
+<a name="1010"><span class="lineNum"> 1010 </span> : : </a>
+<a name="1011"><span class="lineNum"> 1011 </span> :<span class="lineCov"> 46 : return status;</span></a>
+<a name="1012"><span class="lineNum"> 1012 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/libffs.c.func-sort-c.html b/coverage-report/libflash/libffs.c.func-sort-c.html
new file mode 100644
index 0000000..c4c65de
--- /dev/null
+++ b/coverage-report/libflash/libffs.c.func-sort-c.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">208</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">48.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">60.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libffs.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/libffs.c.func.html b/coverage-report/libflash/libffs.c.func.html
new file mode 100644
index 0000000..81e591f
--- /dev/null
+++ b/coverage-report/libflash/libffs.c.func.html
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/libffs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - libffs.c<span style="font-size: 80%;"> (<a href="libffs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">208</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">48.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">60.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libffs.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#430">__hdr_free</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#58">ffs_check_convert_header</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#448">ffs_close</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#547">ffs_entry_add</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#266">ffs_entry_get</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#729">ffs_entry_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#274">ffs_entry_put</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#750">ffs_entry_set_act_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#139">ffs_entry_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#103">ffs_entry_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#719">ffs_entry_user_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#688">ffs_entry_user_set</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#92">ffs_entry_user_to_cpu</a></td>
+ <td class="coverFnHi">59</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#81">ffs_entry_user_to_flash</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#160">ffs_entry_user_to_string</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#518">ffs_equal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#630">ffs_hdr_finalise</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#442">ffs_hdr_free</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#763">ffs_hdr_new</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#293">ffs_init</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#458">ffs_lookup_part</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#525">ffs_next_side</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#51">ffs_num_entries</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#477">ffs_part_info</a></td>
+ <td class="coverFnHi">22</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#204">ffs_string_to_entry_user</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#811">ffs_update_act_size</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#288">has_ecc</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libffs.c.gcov.html#254">has_flag</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/libffs.c.gcov.html b/coverage-report/libflash/libffs.c.gcov.html
new file mode 100644
index 0000000..d7fb8a1
--- /dev/null
+++ b/coverage-report/libflash/libffs.c.gcov.html
@@ -0,0 +1,927 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/libffs.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - libffs.c<span style="font-size: 80%;"> (source / <a href="libffs.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">208</td>
+ <td class="headerCovTableEntry">431</td>
+ <td class="headerCovTableEntryLo">48.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">17</td>
+ <td class="headerCovTableEntry">28</td>
+ <td class="headerCovTableEntryLo">60.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;limits.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #ifndef __SKIBOOT__</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #endif</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;ffs.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define __unused __attribute__((unused))</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define HDR_ENTRIES_NUM 30</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct ffs_handle {</a>
+<a name="20"><span class="lineNum"> 20 </span> : : struct ffs_hdr hdr; /* Converted header */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint32_t toc_offset;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : uint32_t max_size;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : /* The converted header knows how big this is */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : struct __ffs_hdr *cache;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : struct blocklevel_device *bl;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : };</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 59 : static uint32_t ffs_checksum(void* data, size_t size)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : {</a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 59 : uint32_t i, csum = 0;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1947 : for (i = csum = 0; i &lt; (size/4); i++)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 2028 : csum ^= ((uint32_t *)data)[i];</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 69 : return csum;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : /* Helper functions for typesafety and size safety */</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : static uint32_t ffs_hdr_checksum(struct __ffs_hdr *hdr)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : return ffs_checksum(hdr, sizeof(struct __ffs_hdr));</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 60 : static uint32_t ffs_entry_checksum(struct __ffs_entry *ent)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : {</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 33 : return ffs_checksum(ent, sizeof(struct __ffs_entry));</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 2 : static size_t ffs_hdr_raw_size(int num_entries)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : {</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 2 : return sizeof(struct __ffs_hdr) + num_entries * sizeof(struct __ffs_entry);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : static int ffs_num_entries(struct ffs_hdr *hdr)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == 0)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;%s returned zero!\n&quot;, __func__);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : return hdr-&gt;count;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : }</a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 9 : static int ffs_check_convert_header(struct ffs_hdr *dst, struct __ffs_hdr *src)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 9 : if (be32_to_cpu(src-&gt;magic) != FFS_MAGIC)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : return FFS_ERR_BAD_MAGIC;</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 9 : dst-&gt;version = be32_to_cpu(src-&gt;version);</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 9 : if (dst-&gt;version != FFS_VERSION_1)</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : return FFS_ERR_BAD_VERSION;</a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 117 : if (ffs_hdr_checksum(src) != 0)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 9 : if (be32_to_cpu(src-&gt;entry_size) != sizeof(struct __ffs_entry))</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 9 : if ((be32_to_cpu(src-&gt;entry_size) * be32_to_cpu(src-&gt;entry_count)) &gt;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 9 : (be32_to_cpu(src-&gt;block_size) * be32_to_cpu(src-&gt;size)))</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 9 : dst-&gt;block_size = be32_to_cpu(src-&gt;block_size);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 9 : dst-&gt;size = be32_to_cpu(src-&gt;size) * dst-&gt;block_size;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 9 : dst-&gt;block_count = be32_to_cpu(src-&gt;block_count);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 9 : dst-&gt;entries_size = be32_to_cpu(src-&gt;entry_count);</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 9 : return 0;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : }</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : static int ffs_entry_user_to_flash(struct ffs_hdr *hdr __unused,</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : struct __ffs_entry_user *dst, struct ffs_entry_user *src)</a>
+<a name="85"><span class="lineNum"> 85 </span> : : {</a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : memset(dst, 0, sizeof(struct __ffs_entry_user));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : dst-&gt;datainteg = cpu_to_be16(src-&gt;datainteg);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 59 : static int ffs_entry_user_to_cpu(struct ffs_hdr *hdr __unused,</span></a>
+<a name="95"><span class="lineNum"> 95 </span> : : struct ffs_entry_user *dst, struct __ffs_entry_user *src)</a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 59 : memset(dst, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 59 : dst-&gt;datainteg = be16_to_cpu(src-&gt;datainteg);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 59 : dst-&gt;vercheck = src-&gt;vercheck;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 59 : dst-&gt;miscflags = src-&gt;miscflags;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 59 : return 0;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : }</a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : static int ffs_entry_to_flash(struct ffs_hdr *hdr,</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : struct __ffs_entry *dst, struct ffs_entry *src)</a>
+<a name="107"><span class="lineNum"> 107 </span> : : {</a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : int rc, index;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : if (!hdr || !dst || !src)</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : return -1;</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 2 : for (index = 0; index &lt; hdr-&gt;count &amp;&amp; hdr-&gt;entries[index] != src; index++);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : if (index == hdr-&gt;count)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : index++; /* On flash indexes start at 1 */</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : /*</a>
+<a name="119"><span class="lineNum"> 119 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * dst-&gt;checksum must be zero before calling ffs_entry_checksum()</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * appears the reserved fields are always zero.</a>
+<a name="123"><span class="lineNum"> 123 </span> : : */</a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : memset(dst, 0, sizeof(*dst));</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : dst-&gt;base = cpu_to_be32(src-&gt;base / hdr-&gt;block_size);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : dst-&gt;size = cpu_to_be32(src-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : dst-&gt;pid = cpu_to_be32(src-&gt;pid);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : dst-&gt;id = cpu_to_be32(index);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : dst-&gt;type = cpu_to_be32(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 1 : dst-&gt;flags = cpu_to_be32(src-&gt;flags);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : dst-&gt;actual = cpu_to_be32(src-&gt;actual);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : rc = ffs_entry_user_to_flash(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : dst-&gt;checksum = ffs_entry_checksum(dst);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 59 : static int ffs_entry_to_cpu(struct ffs_hdr *hdr,</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : struct ffs_entry *dst, struct __ffs_entry *src)</a>
+<a name="143"><span class="lineNum"> 143 </span> : : {</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 59 : int rc;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 118 : if (ffs_entry_checksum(src) != 0)</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : return FFS_ERR_BAD_CKSUM;</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 59 : memcpy(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 59 : dst-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 59 : dst-&gt;base = be32_to_cpu(src-&gt;base) * hdr-&gt;block_size;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 59 : dst-&gt;size = be32_to_cpu(src-&gt;size) * hdr-&gt;block_size;</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 59 : dst-&gt;actual = be32_to_cpu(src-&gt;actual);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 59 : dst-&gt;pid = be32_to_cpu(src-&gt;pid);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 59 : dst-&gt;type = be32_to_cpu(src-&gt;type); /* TODO: Check that it is valid? */</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 59 : dst-&gt;flags = be32_to_cpu(src-&gt;flags);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 59 : rc = ffs_entry_user_to_cpu(hdr, &amp;dst-&gt;user, &amp;src-&gt;user);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 59 : return rc;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> : : }</a>
+<a name="161"><span class="lineNum"> 161 </span> : : </a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 7 : char *ffs_entry_user_to_string(struct ffs_entry_user *user)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : {</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 7 : char *ret;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 7 : if (!user)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : return NULL;</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 7 : ret = strdup(&quot;----------&quot;);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 7 : if (!ret)</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : return NULL;</a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 7 : if (user-&gt;datainteg &amp; FFS_ENRY_INTEG_ECC)</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 4 : ret[0] = 'E';</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : </a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 7 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512V)</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 1 : ret[1] = 'L';</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : </a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 7 : if (user-&gt;vercheck &amp; FFS_VERCHECK_SHA512EC)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : ret[2] = 'I';</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_PRESERVED)</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineNoCov"> 0 : ret[3] = 'P';</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_READONLY)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : ret[4] = 'R';</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_BACKUP)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : ret[5] = 'B';</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_REPROVISION)</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 3 : ret[6] = 'F';</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_GOLDEN)</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : ret[7] = 'G';</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_CLEARECC)</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 1 : ret[8] = 'C';</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 7 : if (user-&gt;miscflags &amp; FFS_MISCFLAGS_VOLATILE)</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 1 : ret[9] = 'V';</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : return ret;</a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : int ffs_string_to_entry_user(const char *flags, int nflags,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : struct ffs_entry_user *user)</a>
+<a name="208"><span class="lineNum"> 208 </span> : : {</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : if (!user || !flags)</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : memset(user, 0, sizeof(struct ffs_entry_user));</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; nflags; i++) {</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : switch (flags[i]) {</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineNoCov"> 0 : case 'E':</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : user-&gt;datainteg |= FFS_ENRY_INTEG_ECC;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : case 'L':</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : user-&gt;vercheck |= FFS_VERCHECK_SHA512V;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : case 'I':</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineNoCov"> 0 : user-&gt;vercheck |= FFS_VERCHECK_SHA512EC;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : case 'P':</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_PRESERVED;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineNoCov"> 0 : case 'R':</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_READONLY;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : case 'B':</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_BACKUP;</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : case 'F':</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_REPROVISION;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : case 'G':</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_GOLDEN;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : case 'C':</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_CLEARECC;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineNoCov"> 0 : case 'V':</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : user-&gt;miscflags |= FFS_MISCFLAGS_VOLATILE;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;Unknown flag '%c'\n&quot;, flags[i]);</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="250"><span class="lineNum"> 250 </span> : : }</a>
+<a name="251"><span class="lineNum"> 251 </span> : : }</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> : : return 0;</a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 36 : bool has_flag(struct ffs_entry *ent, uint16_t flag)</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 36 : return ((ent-&gt;user.miscflags &amp; flag) != 0);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : }</a>
+<a name="260"><span class="lineNum"> 260 </span> : : </a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 40 : static struct ffs_entry *__ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : {</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 40 : if (index &gt;= ffs-&gt;hdr.count)</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : return NULL;</a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 39 : return ffs-&gt;hdr.entries[index];</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 16 : struct ffs_entry *ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 16 : struct ffs_entry *ret = __ffs_entry_get(ffs, index);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 16 : if (ret)</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 16 : ret-&gt;ref++;</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 16 : return ret;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 72 : struct ffs_entry *ffs_entry_put(struct ffs_entry *ent)</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : {</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 72 : if (!ent)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : return NULL;</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 72 : ent-&gt;ref--;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 72 : if (ent-&gt;ref == 0) {</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 57 : free(ent);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 57 : ent = NULL;</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : }</a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> : : return ent;</a>
+<a name="288"><span class="lineNum"> 288 </span> : : }</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 14 : bool has_ecc(struct ffs_entry *ent)</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : {</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 14 : return ((ent-&gt;user.datainteg &amp; FFS_ENRY_INTEG_ECC) != 0);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 9 : int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : struct ffs_handle **ffs, bool mark_ecc)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 9 : struct __ffs_hdr blank_hdr;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 9 : struct __ffs_hdr raw_hdr;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 9 : struct ffs_handle *f;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 9 : uint64_t total_size;</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 9 : int rc, i;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 9 : if (!ffs || !bl)</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 9 : *ffs = NULL;</span></a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 9 : rc = blocklevel_get_info(bl, NULL, &amp;total_size, NULL);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d retrieving flash info\n&quot;, rc);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : }</a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 9 : if (total_size &gt; UINT_MAX)</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : return FLASH_ERR_VERIFY_FAILURE;</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 9 : if ((offset + max_size) &lt; offset)</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 9 : if ((max_size &gt; total_size))</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Read flash header */</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 9 : rc = blocklevel_read(bl, offset, &amp;raw_hdr, sizeof(raw_hdr));</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash header\n&quot;, rc);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /*</a>
+<a name="329"><span class="lineNum"> 329 </span> : : * Flash controllers can get deconfigured or otherwise upset, when this</a>
+<a name="330"><span class="lineNum"> 330 </span> : : * happens they return all 0xFF bytes.</a>
+<a name="331"><span class="lineNum"> 331 </span> : : * An __ffs_hdr consisting of all 0xFF cannot be valid and it would be</a>
+<a name="332"><span class="lineNum"> 332 </span> : : * nice to drop a hint to the user to help with debugging. This will</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * help quickly differentiate between flash corruption and standard</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * type 'reading from the wrong place' errors vs controller errors or</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * reading erased data.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 9 : memset(&amp;blank_hdr, UINT_MAX, sizeof(struct __ffs_hdr));</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 9 : if (memcmp(&amp;blank_hdr, &amp;raw_hdr, sizeof(struct __ffs_hdr)) == 0) {</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Reading the flash has returned all 0xFF.\n&quot;);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Are you reading erased flash?\n&quot;);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot; Is something else using the flash controller?\n&quot;);</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_BAD_READ;</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : }</a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> : : /* Allocate ffs_handle structure and start populating */</a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 9 : f = calloc(1, sizeof(*f));</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 9 : if (!f)</span></a>
+<a name="348"><span class="lineNum"> 348 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 9 : f-&gt;toc_offset = offset;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 9 : f-&gt;max_size = max_size;</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 9 : f-&gt;bl = bl;</span></a>
+<a name="353"><span class="lineNum"> 353 </span> : : </a>
+<a name="354"><span class="lineNum"> 354 </span> : : /* Convert and check flash header */</a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 9 : rc = ffs_check_convert_header(&amp;f-&gt;hdr, &amp;raw_hdr);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : FL_INF(&quot;FFS: Flash header not found. Code: %d\n&quot;, rc);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> : : }</a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Check header is sane */</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 9 : if ((f-&gt;hdr.block_count * f-&gt;hdr.block_size) &gt; max_size) {</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Flash header exceeds max flash size\n&quot;);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : }</a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 9 : f-&gt;hdr.entries = calloc(f-&gt;hdr.entries_size, sizeof(struct ffs_entry *));</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> : : /*</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * Grab the entire partition header</a>
+<a name="372"><span class="lineNum"> 372 </span> : : */</a>
+<a name="373"><span class="lineNum"> 373 </span> : : /* Check for overflow or a silly size */</a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 9 : if (!f-&gt;hdr.size || f-&gt;hdr.size % f-&gt;hdr.block_size != 0) {</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Cache size overflow (0x%x * 0x%x)\n&quot;,</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : f-&gt;hdr.block_size, f-&gt;hdr.size);</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : }</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 9 : FL_DBG(&quot;FFS: Partition map size: 0x%x\n&quot;, f-&gt;hdr.size);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : </a>
+<a name="383"><span class="lineNum"> 383 </span> : : /* Allocate cache */</a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 9 : f-&gt;cache = malloc(f-&gt;hdr.size);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 9 : if (!f-&gt;cache) {</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> : : /* Read the cached map */</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 9 : rc = blocklevel_read(bl, offset, f-&gt;cache, f-&gt;hdr.size);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 9 : if (rc) {</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;FFS: Error %d reading flash partition map\n&quot;, rc);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 68 : for (i = 0; i &lt; f-&gt;hdr.entries_size; i++) {</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 59 : struct ffs_entry *ent = calloc(1, sizeof(struct ffs_entry));</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineCov"> 59 : if (!ent) {</span></a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : }</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 59 : f-&gt;hdr.entries[f-&gt;hdr.count++] = ent;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 59 : ent-&gt;ref = 1;</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 59 : rc = ffs_entry_to_cpu(&amp;f-&gt;hdr, ent, &amp;f-&gt;cache-&gt;entries[i]);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineCov"> 59 : if (rc) {</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Failed checksum for partition %s\n&quot;,</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : f-&gt;cache-&gt;entries[i].name);</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : }</a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 59 : if (mark_ecc &amp;&amp; has_ecc(ent)) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_ecc_protect(bl, ent-&gt;base, ent-&gt;size);</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;Failed to blocklevel_ecc_protect(0x%08x, 0x%08x)\n&quot;,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : ent-&gt;base, ent-&gt;size);</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : }</a>
+<a name="420"><span class="lineNum"> 420 </span> : : }</a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 9 : out:</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 9 : if (rc == 0)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 9 : *ffs = f;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : else</a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : ffs_close(f);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : return rc;</a>
+<a name="430"><span class="lineNum"> 430 </span> : : }</a>
+<a name="431"><span class="lineNum"> 431 </span> : : </a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 9 : static void __hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="433"><span class="lineNum"> 433 </span> : : {</a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 9 : int i;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineCov"> 9 : if (!hdr)</span></a>
+<a name="437"><span class="lineNum"> 437 </span> : : return;</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 68 : for (i = 0; i &lt; hdr-&gt;count; i++)</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 59 : ffs_entry_put(hdr-&gt;entries[i]);</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 9 : free(hdr-&gt;entries);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : }</a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : void ffs_hdr_free(struct ffs_hdr *hdr)</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : __hdr_free(hdr);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineNoCov"> 0 : free(hdr);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineCov"> 9 : void ffs_close(struct ffs_handle *ffs)</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : {</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 9 : __hdr_free(&amp;ffs-&gt;hdr);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> : : </a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 9 : if (ffs-&gt;cache)</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 9 : free(ffs-&gt;cache);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : </a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 9 : free(ffs);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 9 : }</span></a>
+<a name="459"><span class="lineNum"> 459 </span> : : </a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 2 : int ffs_lookup_part(struct ffs_handle *ffs, const char *name,</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : uint32_t *part_idx)</a>
+<a name="462"><span class="lineNum"> 462 </span> : : {</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 2 : struct ffs_entry **ents = ffs-&gt;hdr.entries;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 2 : int i;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 2 : for (i = 0;</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 4 : i &lt; ffs-&gt;hdr.count &amp;&amp;</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 4 : strncmp(name, ents[i]-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 2 : i++);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 2 : if (i == ffs-&gt;hdr.count)</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 2 : if (part_idx)</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineCov"> 2 : *part_idx = i;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> : : return 0;</a>
+<a name="477"><span class="lineNum"> 477 </span> : : }</a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineCov"> 22 : int ffs_part_info(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : char **name, uint32_t *start,</a>
+<a name="481"><span class="lineNum"> 481 </span> : : uint32_t *total_size, uint32_t *act_size, bool *ecc)</a>
+<a name="482"><span class="lineNum"> 482 </span> : : {</a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 22 : struct ffs_entry *ent;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 22 : char *n;</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineCov"> 22 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 21 : if (!ent)</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : return FFS_ERR_PART_NOT_FOUND;</a>
+<a name="489"><span class="lineNum"> 489 </span> : : </a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 21 : if (start)</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 21 : *start = ent-&gt;base;</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 21 : if (total_size)</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 21 : *total_size = ent-&gt;size;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 21 : if (act_size)</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineCov"> 21 : *act_size = ent-&gt;actual;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 21 : if (ecc)</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 8 : *ecc = has_ecc(ent);</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 21 : if (name) {</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineCov"> 13 : n = calloc(1, FFS_PART_NAME_MAX + 1);</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 13 : if (!n)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 13 : memcpy(n, ent-&gt;name, FFS_PART_NAME_MAX);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 13 : *name = n;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : return 0;</a>
+<a name="507"><span class="lineNum"> 507 </span> : : }</a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> : : /*</a>
+<a name="510"><span class="lineNum"> 510 </span> : : * There are quite a few ways one might consider two ffs_handles to be the</a>
+<a name="511"><span class="lineNum"> 511 </span> : : * same. For the purposes of this function we are trying to detect a fairly</a>
+<a name="512"><span class="lineNum"> 512 </span> : : * specific scenario:</a>
+<a name="513"><span class="lineNum"> 513 </span> : : * Consecutive calls to ffs_next_side() may succeed but have gone circular.</a>
+<a name="514"><span class="lineNum"> 514 </span> : : * It is possible that the OTHER_SIDE partition in one TOC actually points</a>
+<a name="515"><span class="lineNum"> 515 </span> : : * back to the TOC to first ffs_handle.</a>
+<a name="516"><span class="lineNum"> 516 </span> : : * This function compares for this case, therefore the requirements are</a>
+<a name="517"><span class="lineNum"> 517 </span> : : * simple, the underlying blocklevel_devices must be the same along with</a>
+<a name="518"><span class="lineNum"> 518 </span> : : * the toc_offset and the max_size.</a>
+<a name="519"><span class="lineNum"> 519 </span> : : */</a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : bool ffs_equal(struct ffs_handle *one, struct ffs_handle *two)</span></a>
+<a name="521"><span class="lineNum"> 521 </span> : : {</a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : return (!one &amp;&amp; !two) || (one &amp;&amp; two &amp;&amp; one-&gt;bl == two-&gt;bl</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : &amp;&amp; one-&gt;toc_offset == two-&gt;toc_offset</a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : &amp;&amp; one-&gt;max_size == two-&gt;max_size);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : }</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineNoCov"> 0 : int ffs_next_side(struct ffs_handle *ffs, struct ffs_handle **new_ffs,</span></a>
+<a name="528"><span class="lineNum"> 528 </span> : : bool mark_ecc)</a>
+<a name="529"><span class="lineNum"> 529 </span> : : {</a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : uint32_t index, offset, max_size;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : </a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : if (!ffs || !new_ffs)</span></a>
+<a name="534"><span class="lineNum"> 534 </span> : : return FLASH_ERR_PARM_ERROR;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : </a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : *new_ffs = NULL;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : </a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : rc = ffs_lookup_part(ffs, &quot;OTHER_SIDE&quot;, &amp;index);</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : return rc;</a>
+<a name="541"><span class="lineNum"> 541 </span> : : </a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : rc = ffs_part_info(ffs, index, NULL, &amp;offset, &amp;max_size, NULL, NULL);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : return rc;</a>
+<a name="545"><span class="lineNum"> 545 </span> : : </a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : return ffs_init(offset, max_size, ffs-&gt;bl, new_ffs, mark_ecc);</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : }</a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineNoCov"> 0 : int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : {</a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : const char *smallest_name;</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineNoCov"> 0 : uint32_t smallest_base, toc_base;</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : int i;</span></a>
+<a name="554"><span class="lineNum"> 554 </span> : : </a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFFS: Adding '%s' at 0x%08x..0x%08x\n&quot;,</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : entry-&gt;name, entry-&gt;base, entry-&gt;base + entry-&gt;size);</a>
+<a name="557"><span class="lineNum"> 557 </span> : : </a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == 0) {</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFFS: Adding an entry to an empty header\n&quot;);</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : }</a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base + entry-&gt;size &gt; hdr-&gt;block_size * hdr-&gt;block_count)</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="564"><span class="lineNum"> 564 </span> : : </a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : smallest_base = entry-&gt;base;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : smallest_name = entry-&gt;name;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : toc_base = 0;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : /*</a>
+<a name="569"><span class="lineNum"> 569 </span> : : * TODO: This may have assumed entries was sorted</a>
+<a name="570"><span class="lineNum"> 570 </span> : : */</a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ent = hdr-&gt;entries[i];</span></a>
+<a name="573"><span class="lineNum"> 573 </span> : : </a>
+<a name="574"><span class="lineNum"> 574 </span> : : /* Don't allow same names to differ only by case */</a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineNoCov"> 0 : if (strncasecmp(entry-&gt;name, ent-&gt;name, FFS_PART_NAME_MAX) == 0)</span></a>
+<a name="576"><span class="lineNum"> 576 </span> : : return FFS_ERR_BAD_PART_NAME;</a>
+<a name="577"><span class="lineNum"> 577 </span> : : </a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base &gt;= ent-&gt;base &amp;&amp; entry-&gt;base &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="579"><span class="lineNum"> 579 </span> : : return FFS_ERR_BAD_PART_BASE;</a>
+<a name="580"><span class="lineNum"> 580 </span> : : </a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;base + entry-&gt;size &gt; ent-&gt;base &amp;&amp;</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : entry-&gt;base + entry-&gt;size &lt; ent-&gt;base + ent-&gt;size)</span></a>
+<a name="583"><span class="lineNum"> 583 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;actual &gt; entry-&gt;size)</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="587"><span class="lineNum"> 587 </span> : : </a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : if (entry-&gt;pid != FFS_PID_TOPLEVEL)</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : return FFS_ERR_BAD_PART_PID;</a>
+<a name="590"><span class="lineNum"> 590 </span> : : </a>
+<a name="591"><span class="lineNum"> 591 </span> : : /* First partition is the partition table */</a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineNoCov"> 0 : if (i == 0) {</span></a>
+<a name="593"><span class="lineNum"> 593 </span> : : toc_base = ent-&gt;base;</a>
+<a name="594"><span class="lineNum"> 594 </span> : : } else {</a>
+<a name="595"><span class="lineNum"> 595 </span> : : /*</a>
+<a name="596"><span class="lineNum"> 596 </span> : : * We're looking for the partition directly</a>
+<a name="597"><span class="lineNum"> 597 </span> : : * after the toc to make sure we don't</a>
+<a name="598"><span class="lineNum"> 598 </span> : : * overflow onto it.</a>
+<a name="599"><span class="lineNum"> 599 </span> : : */</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineNoCov"> 0 : if (ent-&gt;base &lt; smallest_base &amp;&amp; ent-&gt;base &gt; toc_base) {</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : smallest_base = ent-&gt;base;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : smallest_name = ent-&gt;name;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : }</a>
+<a name="604"><span class="lineNum"> 604 </span> : : }</a>
+<a name="605"><span class="lineNum"> 605 </span> : : }</a>
+<a name="606"><span class="lineNum"> 606 </span> : : /* If the smallest base is before the TOC, don't worry */</a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : if (smallest_base &gt; toc_base &amp;&amp; (hdr-&gt;count + 1) * sizeof(struct __ffs_entry) +</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineNoCov"> 0 : sizeof(struct __ffs_hdr) + toc_base &gt; smallest_base) {</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Adding partition '%s' would cause partition '%s' at &quot;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : &quot;0x%08x to overlap with the header\n&quot;, entry-&gt;name, smallest_name,</a>
+<a name="611"><span class="lineNum"> 611 </span> : : smallest_base);</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_BAD_PART_BASE;</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : }</a>
+<a name="614"><span class="lineNum"> 614 </span> : : </a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : if (hdr-&gt;count == hdr-&gt;entries_size) {</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : struct ffs_entry **old = hdr-&gt;entries;</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = realloc(hdr-&gt;entries,</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : (HDR_ENTRIES_NUM + hdr-&gt;entries_size) * sizeof(struct ffs_entry *));</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : if (!hdr-&gt;entries) {</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries = old;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="623"><span class="lineNum"> 623 </span> : : }</a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries_size += HDR_ENTRIES_NUM;</span></a>
+<a name="625"><span class="lineNum"> 625 </span> : : }</a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : entry-&gt;ref++;</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : hdr-&gt;entries[hdr-&gt;count++] = entry;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : </a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : int ffs_hdr_finalise(struct blocklevel_device *bl, struct ffs_hdr *hdr)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : {</a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : int num_entries, i, rc = 0;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : struct __ffs_hdr *real_hdr;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : num_entries = ffs_num_entries(hdr);</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /* A TOC shouldn't have zero partitions */</a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : if (num_entries == 0)</span></a>
+<a name="641"><span class="lineNum"> 641 </span> : : return FFS_ERR_BAD_SIZE;</a>
+<a name="642"><span class="lineNum"> 642 </span> : : </a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : real_hdr = malloc(ffs_hdr_raw_size(num_entries));</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : if (!real_hdr)</span></a>
+<a name="645"><span class="lineNum"> 645 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="646"><span class="lineNum"> 646 </span> : : </a>
+<a name="647"><span class="lineNum"> 647 </span> : : /*</a>
+<a name="648"><span class="lineNum"> 648 </span> : : * So that the checksum gets calculated correctly at least the</a>
+<a name="649"><span class="lineNum"> 649 </span> : : * real_hdr-&gt;checksum must be zero before calling ffs_hdr_checksum()</a>
+<a name="650"><span class="lineNum"> 650 </span> : : * memset()ting the entire struct to zero is probably wise as it</a>
+<a name="651"><span class="lineNum"> 651 </span> : : * appears the reserved fields are always zero.</a>
+<a name="652"><span class="lineNum"> 652 </span> : : */</a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : memset(real_hdr, 0, sizeof(*real_hdr));</span></a>
+<a name="654"><span class="lineNum"> 654 </span> : : </a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : hdr-&gt;part-&gt;size = ffs_hdr_raw_size(num_entries) + hdr-&gt;block_size;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : /*</a>
+<a name="657"><span class="lineNum"> 657 </span> : : * So actual is in bytes. ffs_entry_to_flash() don't do the</a>
+<a name="658"><span class="lineNum"> 658 </span> : : * block_size division that we're relying on</a>
+<a name="659"><span class="lineNum"> 659 </span> : : */</a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineNoCov"> 0 : hdr-&gt;part-&gt;actual = (hdr-&gt;part-&gt;size / hdr-&gt;block_size) * hdr-&gt;block_size;</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;magic = cpu_to_be32(FFS_MAGIC);</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;version = cpu_to_be32(hdr-&gt;version);</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;size = cpu_to_be32(hdr-&gt;part-&gt;size / hdr-&gt;block_size);</span></a>
+<a name="664"><span class="lineNum"> 664 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;entry_size = cpu_to_be32(sizeof(struct __ffs_entry));</span></a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;entry_count = cpu_to_be32(num_entries);</span></a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;block_size = cpu_to_be32(hdr-&gt;block_size);</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;block_count = cpu_to_be32(hdr-&gt;block_count);</span></a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineNoCov"> 0 : real_hdr-&gt;checksum = ffs_hdr_checksum(real_hdr);</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : </a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; hdr-&gt;count; i++) {</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_to_flash(hdr, real_hdr-&gt;entries + i, hdr-&gt;entries[i]);</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;Couldn't format all entries for new TOC\n&quot;);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : }</a>
+<a name="676"><span class="lineNum"> 676 </span> : : }</a>
+<a name="677"><span class="lineNum"> 677 </span> : : </a>
+<a name="678"><span class="lineNum"> 678 </span> : : /* Don't really care if this fails */</a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : blocklevel_erase(bl, hdr-&gt;part-&gt;base, hdr-&gt;size);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : rc = blocklevel_write(bl, hdr-&gt;part-&gt;base, real_hdr,</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : ffs_hdr_raw_size(num_entries));</a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="684"><span class="lineNum"> 684 </span> : : </a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : free(real_hdr);</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="688"><span class="lineNum"> 688 </span> : : }</a>
+<a name="689"><span class="lineNum"> 689 </span> : : </a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : int ffs_entry_user_set(struct ffs_entry *ent, struct ffs_entry_user *user)</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : {</a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineNoCov"> 0 : if (!ent || !user)</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : return -1;</a>
+<a name="694"><span class="lineNum"> 694 </span> : : </a>
+<a name="695"><span class="lineNum"> 695 </span> : : /*</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * Don't allow the user to specify anything we dont't know about.</a>
+<a name="697"><span class="lineNum"> 697 </span> : : * Rationale: This is the library providing access to the FFS structures.</a>
+<a name="698"><span class="lineNum"> 698 </span> : : * If the consumer of the library knows more about FFS structures then</a>
+<a name="699"><span class="lineNum"> 699 </span> : : * questions need to be asked.</a>
+<a name="700"><span class="lineNum"> 700 </span> : : * The other possibility is that they've unknowningly supplied invalid</a>
+<a name="701"><span class="lineNum"> 701 </span> : : * flags, we should tell them.</a>
+<a name="702"><span class="lineNum"> 702 </span> : : */</a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : if (user-&gt;chip)</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : return -1;</a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : if (user-&gt;compresstype)</span></a>
+<a name="706"><span class="lineNum"> 706 </span> : : return -1;</a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineNoCov"> 0 : if (user-&gt;datainteg &amp; ~(FFS_ENRY_INTEG_ECC))</span></a>
+<a name="708"><span class="lineNum"> 708 </span> : : return -1;</a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineNoCov"> 0 : if (user-&gt;vercheck &amp; ~(FFS_VERCHECK_SHA512V | FFS_VERCHECK_SHA512EC))</span></a>
+<a name="710"><span class="lineNum"> 710 </span> : : return -1;</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (user-&gt;miscflags &amp; ~(FFS_MISCFLAGS_PRESERVED | FFS_MISCFLAGS_BACKUP |</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : FFS_MISCFLAGS_READONLY | FFS_MISCFLAGS_REPROVISION |</a>
+<a name="713"><span class="lineNum"> 713 </span> : : FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_GOLDEN |</a>
+<a name="714"><span class="lineNum"> 714 </span> : : FFS_MISCFLAGS_CLEARECC))</a>
+<a name="715"><span class="lineNum"> 715 </span> : : return -1;</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;ent-&gt;user, user, sizeof(*user));</span></a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> : : }</a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 10 : struct ffs_entry_user ffs_entry_user_get(struct ffs_entry *ent)</span></a>
+<a name="722"><span class="lineNum"> 722 </span> : : {</a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 10 : struct ffs_entry_user user = { 0 };</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : </a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineCov"> 10 : if (ent)</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineCov"> 10 : memcpy(&amp;user, &amp;ent-&gt;user, sizeof(user));</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : </a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineCov"> 10 : return user;</span></a>
+<a name="729"><span class="lineNum"> 729 </span> : : }</a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineNoCov"> 0 : int ffs_entry_new(const char *name, uint32_t base, uint32_t size, struct ffs_entry **r)</span></a>
+<a name="732"><span class="lineNum"> 732 </span> : : {</a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *ret;</span></a>
+<a name="734"><span class="lineNum"> 734 </span> : : </a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="738"><span class="lineNum"> 738 </span> : : </a>
+<a name="739"><span class="lineNum"> 739 </span> :<span class="lineNoCov"> 0 : strncpy(ret-&gt;name, name, FFS_PART_NAME_MAX);</span></a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineNoCov"> 0 : ret-&gt;name[FFS_PART_NAME_MAX] = '\0';</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineNoCov"> 0 : ret-&gt;base = base;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : ret-&gt;size = size;</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : ret-&gt;actual = size;</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineNoCov"> 0 : ret-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineNoCov"> 0 : ret-&gt;type = FFS_TYPE_DATA;</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : ret-&gt;ref = 1;</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineNoCov"> 0 : *r = ret;</span></a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="750"><span class="lineNum"> 750 </span> : : }</a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> :<span class="lineNoCov"> 0 : int ffs_entry_set_act_size(struct ffs_entry *ent, uint32_t actual_size)</span></a>
+<a name="753"><span class="lineNum"> 753 </span> : : {</a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineNoCov"> 0 : if (!ent)</span></a>
+<a name="755"><span class="lineNum"> 755 </span> : : return -1;</a>
+<a name="756"><span class="lineNum"> 756 </span> : : </a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineNoCov"> 0 : if (actual_size &gt; ent-&gt;size)</span></a>
+<a name="758"><span class="lineNum"> 758 </span> : : return FFS_ERR_BAD_PART_SIZE;</a>
+<a name="759"><span class="lineNum"> 759 </span> : : </a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineNoCov"> 0 : ent-&gt;actual = actual_size;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : </a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : </a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineNoCov"> 0 : int ffs_hdr_new(uint32_t block_size, uint32_t block_count,</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : struct ffs_entry **e, struct ffs_hdr **r)</a>
+<a name="767"><span class="lineNum"> 767 </span> : : {</a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineNoCov"> 0 : struct ffs_hdr *ret;</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineNoCov"> 0 : struct ffs_entry *part_table;</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : </a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : ret = calloc(1, sizeof(*ret));</span></a>
+<a name="773"><span class="lineNum"> 773 </span> :<span class="lineNoCov"> 0 : if (!ret)</span></a>
+<a name="774"><span class="lineNum"> 774 </span> : : return FLASH_ERR_MALLOC_FAILED;</a>
+<a name="775"><span class="lineNum"> 775 </span> : : </a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineNoCov"> 0 : ret-&gt;version = FFS_VERSION_1;</span></a>
+<a name="777"><span class="lineNum"> 777 </span> :<span class="lineNoCov"> 0 : ret-&gt;block_size = block_size;</span></a>
+<a name="778"><span class="lineNum"> 778 </span> :<span class="lineNoCov"> 0 : ret-&gt;block_count = block_count;</span></a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries = calloc(HDR_ENTRIES_NUM, sizeof(struct ffs_entry *));</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries_size = HDR_ENTRIES_NUM;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineNoCov"> 0 : if (!e || !(*e)) {</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : /* Don't know how big it will be, ffs_hdr_finalise() will fix */</a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineNoCov"> 0 : rc = ffs_entry_new(&quot;part&quot;, 0, 0, &amp;part_table);</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineNoCov"> 0 : free(ret);</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="788"><span class="lineNum"> 788 </span> : : }</a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineNoCov"> 0 : if (e)</span></a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineNoCov"> 0 : *e = part_table;</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : } else {</a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineNoCov"> 0 : part_table = *e;</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : }</a>
+<a name="794"><span class="lineNum"> 794 </span> : : </a>
+<a name="795"><span class="lineNum"> 795 </span> : : /* If the user still holds a ref to e, then inc the refcount */</a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineNoCov"> 0 : if (e)</span></a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineNoCov"> 0 : part_table-&gt;ref++;</span></a>
+<a name="798"><span class="lineNum"> 798 </span> : : </a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : ret-&gt;part = part_table;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineNoCov"> 0 : part_table-&gt;pid = FFS_PID_TOPLEVEL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineNoCov"> 0 : part_table-&gt;type = FFS_TYPE_PARTITION;</span></a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineNoCov"> 0 : part_table-&gt;flags = FFS_FLAGS_PROTECTED;</span></a>
+<a name="804"><span class="lineNum"> 804 </span> : : </a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : ret-&gt;entries[0] = part_table;</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineNoCov"> 0 : ret-&gt;count = 1;</span></a>
+<a name="807"><span class="lineNum"> 807 </span> : : </a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineNoCov"> 0 : *r = ret;</span></a>
+<a name="809"><span class="lineNum"> 809 </span> : : </a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="811"><span class="lineNum"> 811 </span> : : }</a>
+<a name="812"><span class="lineNum"> 812 </span> : : </a>
+<a name="813"><span class="lineNum"> 813 </span> :<span class="lineCov"> 2 : int ffs_update_act_size(struct ffs_handle *ffs, uint32_t part_idx,</span></a>
+<a name="814"><span class="lineNum"> 814 </span> : : uint32_t act_size)</a>
+<a name="815"><span class="lineNum"> 815 </span> : : {</a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineCov"> 2 : struct ffs_entry *ent;</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineCov"> 2 : struct __ffs_entry raw_ent;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 2 : uint32_t offset;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> :<span class="lineCov"> 2 : int rc;</span></a>
+<a name="820"><span class="lineNum"> 820 </span> : : </a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 2 : ent = __ffs_entry_get(ffs, part_idx);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineCov"> 2 : if (!ent) {</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;FFS: Entry not found\n&quot;);</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineNoCov"> 0 : return FFS_ERR_PART_NOT_FOUND;</span></a>
+<a name="825"><span class="lineNum"> 825 </span> : : }</a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineCov"> 2 : offset = ffs-&gt;toc_offset + ffs_hdr_raw_size(part_idx);</span></a>
+<a name="827"><span class="lineNum"> 827 </span> :<span class="lineCov"> 2 : FL_DBG(&quot;FFS: part index %d at offset 0x%08x\n&quot;,</span></a>
+<a name="828"><span class="lineNum"> 828 </span> : : part_idx, offset);</a>
+<a name="829"><span class="lineNum"> 829 </span> : : </a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineCov"> 2 : if (ent-&gt;actual == act_size) {</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;FFS: ent-&gt;actual alrady matches: 0x%08x==0x%08x\n&quot;,</span></a>
+<a name="832"><span class="lineNum"> 832 </span> : : act_size, ent-&gt;actual);</a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> : : }</a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 1 : ent-&gt;actual = act_size;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> : : </a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineCov"> 1 : rc = ffs_entry_to_flash(&amp;ffs-&gt;hdr, &amp;raw_ent, ent);</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : return rc;</a>
+<a name="840"><span class="lineNum"> 840 </span> : : </a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 1 : return blocklevel_smart_write(ffs-&gt;bl, offset, &amp;raw_ent, sizeof(struct __ffs_entry));</span></a>
+<a name="842"><span class="lineNum"> 842 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/libflash.c.func-sort-c.html b/coverage-report/libflash/libflash.c.func-sort-c.html
new file mode 100644
index 0000000..6ef6490
--- /dev/null
+++ b/coverage-report/libflash/libflash.c.func-sort-c.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">240</td>
+ <td class="headerCovTableEntry">462</td>
+ <td class="headerCovTableEntryLo">51.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="libflash.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnHi">869</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnHi">7333</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnHi">8098</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnHi">8117</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnHi">8118</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnHi">24353</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/libflash.c.func.html b/coverage-report/libflash/libflash.c.func.html
new file mode 100644
index 0000000..77636da
--- /dev/null
+++ b/coverage-report/libflash/libflash.c.func.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/libflash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - libflash.c<span style="font-size: 80%;"> (<a href="libflash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">240</td>
+ <td class="headerCovTableEntry">462</td>
+ <td class="headerCovTableEntryLo">51.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="libflash.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#567">fl_chip_id</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#183">fl_get_best_erase</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#55">fl_micron_status</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#50">fl_read_stat</a></td>
+ <td class="coverFnHi">24353</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#68">fl_sync_wait_idle</a></td>
+ <td class="coverFnHi">8117</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#293">fl_wpage</a></td>
+ <td class="coverFnHi">8098</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#87">fl_wren</a></td>
+ <td class="coverFnHi">8118</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#714">flash_configure</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#215">flash_erase</a></td>
+ <td class="coverFnHi">19</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#264">flash_erase_chip</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#845">flash_exit</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#855">flash_exit_close</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#686">flash_force_4b_mode</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#777">flash_get_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#596">flash_identify</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#790">flash_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#111">flash_read</a></td>
+ <td class="coverFnHi">869</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#138">flash_read_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#666">flash_set_4b</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#440">flash_smart_comp</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#465">flash_smart_write</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#541">flash_smart_write_corrected</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#313">flash_write</a></td>
+ <td class="coverFnHi">7333</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="libflash.c.gcov.html#388">flash_write_corrected</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/libflash.c.gcov.html b/coverage-report/libflash/libflash.c.gcov.html
new file mode 100644
index 0000000..0d37ab5
--- /dev/null
+++ b/coverage-report/libflash/libflash.c.gcov.html
@@ -0,0 +1,949 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/libflash.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - libflash.c<span style="font-size: 80%;"> (source / <a href="libflash.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">240</td>
+ <td class="headerCovTableEntry">462</td>
+ <td class="headerCovTableEntryLo">51.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryMed">75.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;string.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;libflash.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;libflash-priv.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;ecc.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;blocklevel.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : static const struct flash_info flash_info[] = {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : { 0xc22018, 0x01000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL12835F&quot;},</a>
+<a name="16"><span class="lineNum"> 16 </span> : : { 0xc22019, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL25635F&quot;},</a>
+<a name="17"><span class="lineNum"> 17 </span> : : { 0xc2201a, 0x04000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MXxxL51235F&quot;},</a>
+<a name="18"><span class="lineNum"> 18 </span> : : { 0xc2201b, 0x08000000, FL_ERASE_ALL | FL_CAN_4B, &quot;Macronix MX66L1G45G&quot;},</a>
+<a name="19"><span class="lineNum"> 19 </span> : : { 0xef4018, 0x01000000, FL_ERASE_ALL, &quot;Winbond W25Q128BV&quot; },</a>
+<a name="20"><span class="lineNum"> 20 </span> : : { 0xef4019, 0x02000000, FL_ERASE_ALL | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="21"><span class="lineNum"> 21 </span> : : FL_ERASE_BULK,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : &quot;Winbond W25Q256BV&quot;},</a>
+<a name="23"><span class="lineNum"> 23 </span> : : { 0x20ba20, 0x04000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="24"><span class="lineNum"> 24 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="25"><span class="lineNum"> 25 </span> : : &quot;Micron N25Qx512Ax&quot; },</a>
+<a name="26"><span class="lineNum"> 26 </span> : : { 0x20ba19, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="27"><span class="lineNum"> 27 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="28"><span class="lineNum"> 28 </span> : : &quot;Micron N25Q256Ax&quot; },</a>
+<a name="29"><span class="lineNum"> 29 </span> : : { 0x1940ef, 0x02000000, FL_ERASE_4K | FL_ERASE_64K | FL_CAN_4B |</a>
+<a name="30"><span class="lineNum"> 30 </span> : : FL_ERASE_BULK | FL_MICRON_BUGS,</a>
+<a name="31"><span class="lineNum"> 31 </span> : : &quot;Micron N25Qx256Ax&quot; },</a>
+<a name="32"><span class="lineNum"> 32 </span> : : { 0x4d5444, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;File Abstraction&quot;},</a>
+<a name="33"><span class="lineNum"> 33 </span> : : { 0x55aa55, 0x00100000, FL_ERASE_ALL | FL_CAN_4B, &quot;TEST_FLASH&quot; },</a>
+<a name="34"><span class="lineNum"> 34 </span> : : { 0xaa55aa, 0x02000000, FL_ERASE_ALL | FL_CAN_4B, &quot;EMULATED_FLASH&quot;},</a>
+<a name="35"><span class="lineNum"> 35 </span> : : };</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : struct flash_chip {</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct spi_flash_ctrl *ctrl; /* Controller */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct flash_info info; /* Flash info */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t tsize; /* Corrected flash size */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint32_t min_erase_mask; /* Minimum erase size */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : bool mode_4b; /* Flash currently in 4b mode */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : struct flash_req *cur_req; /* Current request */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : void *smart_buf; /* Buffer for smart writes */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct blocklevel_device bl;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : };</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : #ifndef __SKIBOOT__</a>
+<a name="49"><span class="lineNum"> 49 </span> : : bool libflash_debug;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #endif</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 24353 : int fl_read_stat(struct spi_flash_ctrl *ct, uint8_t *stat)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 24353 : return ct-&gt;cmd_rd(ct, CMD_RDSR, false, 0, stat, 1);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : }</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : static void fl_micron_status(struct spi_flash_ctrl *ct)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : {</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : uint8_t flst;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /*</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * After a success status on a write or erase, we</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * need to do that command or some chip variants will</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * lock</a>
+<a name="65"><span class="lineNum"> 65 </span> : : */</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : ct-&gt;cmd_rd(ct, CMD_MIC_RDFLST, false, 0, &amp;flst, 1);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /* Synchronous write completion, probably need a yield hook */</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 16234 : int fl_sync_wait_idle(struct spi_flash_ctrl *ct)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : /* XXX Add timeout */</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : for (;;) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 16234 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 16234 : if (rc) return rc;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 16234 : if (!(stat &amp; STAT_WIP)) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 8117 : if (ct-&gt;finfo-&gt;flags &amp; FL_MICRON_BUGS)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : fl_micron_status(ct);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 8117 : return 0;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : /* return FLASH_ERR_WIP_TIMEOUT; */</a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : /* Exported for internal use */</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 8118 : int fl_wren(struct spi_flash_ctrl *ct)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : int i, rc;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* Some flashes need it to be hammered */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 8118 : for (i = 0; i &lt; 1000; i++) {</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 8118 : rc = ct-&gt;cmd_wr(ct, CMD_WREN, false, 0, NULL, 0);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 8118 : if (rc) return rc;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 8118 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 8118 : if (rc) return rc;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 8118 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: WREN has WIP status set !\n&quot;);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : continue;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : }</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 8118 : if (stat &amp; STAT_WEN)</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 8118 : return 0;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_WREN_TIMEOUT;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 869 : static int flash_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 869 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 869 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* XXX Add sanity/bound checking */</a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> : : /*</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * If the controller supports read and either we are in 3b mode</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * high level read.</a>
+<a name="124"><span class="lineNum"> 124 </span> : : */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 869 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;read)</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 869 : return ct-&gt;read(ct, pos, buf, len);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : if (!ct-&gt;cmd_rd)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : return ct-&gt;cmd_rd(ct, CMD_READ, true, pos, buf, len);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> : : }</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : #define COPY_BUFFER_LENGTH 4096</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /*</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * This provides a wrapper around flash_read on ECCed data</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * len is length of data without ECC attached</a>
+<a name="139"><span class="lineNum"> 139 </span> : : */</a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : int flash_read_corrected(struct blocklevel_device *bl, uint32_t pos, void *buf,</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : uint32_t len, bool ecc)</a>
+<a name="142"><span class="lineNum"> 142 </span> : : {</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : uint32_t copylen;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return flash_read(bl, pos, buf, len);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : /* Copy the buffer in chunks */</a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : /* What's left to copy? */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : /* Read ECCed data from flash */</a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : rc = flash_read(bl, pos, bufecc, ecc_buffer_size(copylen));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : </a>
+<a name="165"><span class="lineNum"> 165 </span> : : /* Extract data from ECCed data */</a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : ret = memcpy_from_ecc(buf, bufecc, copylen);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> : : /* Update for next copy */</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : len -= copylen;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : pos += ecc_buffer_size(copylen);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : rc = 0;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 19 : static void fl_get_best_erase(struct flash_chip *c, uint32_t dst, uint32_t size,</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : uint32_t *chunk, uint8_t *cmd)</a>
+<a name="187"><span class="lineNum"> 187 </span> : : {</a>
+<a name="188"><span class="lineNum"> 188 </span> : : /* Smaller than 32k, use 4k */</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 19 : if ((dst &amp; 0x7fff) || (size &lt; 0x8000)) {</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 18 : *chunk = 0x1000;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 18 : *cmd = CMD_SE;</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 18 : return;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> : : }</a>
+<a name="194"><span class="lineNum"> 194 </span> : : /* Smaller than 64k and 32k is supported, use it */</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1 : if ((c-&gt;info.flags &amp; FL_ERASE_32K) &amp;&amp;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 1 : ((dst &amp; 0xffff) || (size &lt; 0x10000))) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : }</a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* If 64K is not supported, use whatever smaller size is */</a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 1 : if (!(c-&gt;info.flags &amp; FL_ERASE_64K)) {</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_32K) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : *chunk = 0x8000;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_BE32K;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : } else {</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineNoCov"> 0 : *chunk = 0x1000;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : *cmd = CMD_SE;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : /* Allright, let's go for 64K */</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 1 : *chunk = 0x10000;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 1 : *cmd = CMD_BE;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 19 : static int flash_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t size)</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : {</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 19 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 19 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineNoCov"> 0 : uint8_t cmd;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> : : /* Some sanity checking */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 19 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /* Check boundaries fit erase blocks */</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 19 : if ((dst | size) &amp; c-&gt;min_erase_mask)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_ERASE_BOUNDARY;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 19 : FL_DBG(&quot;LIBFLASH: Erasing 0x%&quot; PRIx64&quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : dst, dst + size);</a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> : : /* Use controller erase if supported */</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 19 : if (ct-&gt;erase)</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, dst, size);</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /* Allright, loop as long as there's something to erase */</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 38 : while(size) {</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* How big can we make it based on alignent &amp; size */</a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 19 : fl_get_best_erase(c, dst, size, &amp;chunk, &amp;cmd);</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /* Poke write enable */</a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 19 : rc = fl_wren(ct);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 19 : if (rc)</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> : : /* Send erase command */</a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 19 : rc = ct-&gt;cmd_wr(ct, cmd, true, dst, NULL, 0);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 19 : if (rc)</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : /* Wait for write complete */</a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 19 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 19 : if (rc)</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 19 : size -= chunk;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 19 : dst += chunk;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 19 : return 0;</span></a>
+<a name="264"><span class="lineNum"> 264 </span> : : }</a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : int flash_erase_chip(struct flash_chip *c)</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : {</a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> : : /* XXX TODO: Fallback to using normal erases */</a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : if (!(c-&gt;info.flags &amp; (FL_ERASE_CHIP|FL_ERASE_BULK)))</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CHIP_ER_NOT_SUPPORTED;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Erasing chip...\n&quot;);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* Use controller erase if supported */</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;erase)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : return ct-&gt;erase(ct, 0, 0xffffffff);</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : rc = fl_wren(ct);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : if (rc) return rc;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> : : </a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineNoCov"> 0 : if (c-&gt;info.flags &amp; FL_ERASE_CHIP)</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_CE, false, 0, NULL, 0);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : else</a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;cmd_wr(ct, CMD_MIC_BULK_ERASE, false, 0, NULL, 0);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> : : /* Wait for write complete */</a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineNoCov"> 0 : return fl_sync_wait_idle(ct);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : }</a>
+<a name="294"><span class="lineNum"> 294 </span> : : </a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 8098 : static int fl_wpage(struct flash_chip *c, uint32_t dst, const void *src,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : uint32_t size)</a>
+<a name="297"><span class="lineNum"> 297 </span> : : {</a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 8098 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="300"><span class="lineNum"> 300 </span> : : </a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 8098 : if (size &lt; 1 || size &gt; 0x100)</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_BAD_PAGE_SIZE;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 8098 : rc = fl_wren(ct);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 8098 : if (rc) return rc;</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 8098 : rc = ct-&gt;cmd_wr(ct, CMD_PP, true, dst, src, size);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 8098 : if (rc)</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : </a>
+<a name="311"><span class="lineNum"> 311 </span> : : /* Wait for write complete */</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 8098 : return fl_sync_wait_idle(ct);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> : : }</a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 7333 : static int flash_write(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : uint32_t size, bool verify)</a>
+<a name="317"><span class="lineNum"> 317 </span> : : {</a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 7333 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 7333 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 7333 : uint32_t todo = size;</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 7333 : uint32_t d = dst;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 7333 : const void *s = src;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : uint8_t vbuf[0x100];</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : int rc; </span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> : : /* Some sanity checking */</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 7333 : if (((dst + size) &lt;= dst) || !size || (dst + size) &gt; c-&gt;tsize)</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 7333 : FL_DBG(&quot;LIBFLASH: Writing to 0x%08x..0%08x...\n&quot;, dst, dst + size);</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> : : /*</a>
+<a name="333"><span class="lineNum"> 333 </span> : : * If the controller supports write and either we are in 3b mode</a>
+<a name="334"><span class="lineNum"> 334 </span> : : * or we are in 4b *and* the controller supports it, then do a</a>
+<a name="335"><span class="lineNum"> 335 </span> : : * high level write.</a>
+<a name="336"><span class="lineNum"> 336 </span> : : */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 7333 : if ((!c-&gt;mode_4b || ct-&gt;set_4b) &amp;&amp; ct-&gt;write) {</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;write(ct, dst, src, size);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : goto writing_done;</span></a>
+<a name="342"><span class="lineNum"> 342 </span> : : }</a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> : : /* Otherwise, go manual if supported */</a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 7333 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CTRL_CMD_UNSUPPORTED;</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : /* Iterate for each page to write */</a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 15431 : while(todo) {</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : </a>
+<a name="352"><span class="lineNum"> 352 </span> : : /* Handle misaligned start */</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 8098 : chunk = 0x100 - (d &amp; 0xff);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 8098 : if (chunk &gt; todo)</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 7254 : chunk = todo;</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 8098 : rc = fl_wpage(c, d, s, chunk);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 8098 : if (rc) return rc;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 8098 : d += chunk;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 8098 : s += chunk;</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 8098 : todo -= chunk;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : }</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 7333 : writing_done:</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 7333 : if (!verify)</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 7281 : return 0;</span></a>
+<a name="367"><span class="lineNum"> 367 </span> : : </a>
+<a name="368"><span class="lineNum"> 368 </span> : : /* Verify */</a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 52 : FL_DBG(&quot;LIBFLASH: Verifying...\n&quot;);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> : : </a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 869 : while(size) {</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : uint32_t chunk;</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 817 : chunk = sizeof(vbuf);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 817 : if (chunk &gt; size)</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 1 : chunk = size;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 817 : rc = flash_read(bl, dst, vbuf, chunk);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 817 : if (rc) return rc;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 817 : if (memcmp(vbuf, src, chunk)) {</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Miscompare at 0x%08x\n&quot;, dst);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_VERIFY_FAILURE;</span></a>
+<a name="382"><span class="lineNum"> 382 </span> : : }</a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 817 : dst += chunk;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 817 : src += chunk;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 817 : size -= chunk;</span></a>
+<a name="386"><span class="lineNum"> 386 </span> : : }</a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 52 : return 0;</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : }</a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : int flash_write_corrected(struct blocklevel_device *bl, uint32_t pos, const void *buf,</span></a>
+<a name="391"><span class="lineNum"> 391 </span> : : uint32_t len, bool verify, bool ecc)</a>
+<a name="392"><span class="lineNum"> 392 </span> : : {</a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineNoCov"> 0 : struct ecc64 *bufecc;</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineNoCov"> 0 : uint32_t copylen, copylen_minus_ecc;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : uint8_t ret;</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : if (!ecc)</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineNoCov"> 0 : return flash_write(bl, pos, buf, len, verify);</span></a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> : : /* Copy the buffer in chunks */</a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : bufecc = malloc(ecc_buffer_size(COPY_BUFFER_LENGTH));</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : if (!bufecc)</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="405"><span class="lineNum"> 405 </span> : : </a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : while (len &gt; 0) {</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* What's left to copy? */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : copylen = MIN(len, COPY_BUFFER_LENGTH);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineNoCov"> 0 : copylen_minus_ecc = ecc_buffer_size_minus_ecc(copylen);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> : : /* Add the ecc byte to the data */</a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : ret = memcpy_to_ecc(bufecc, buf, copylen_minus_ecc);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : if (ret) {</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : }</a>
+<a name="417"><span class="lineNum"> 417 </span> : : </a>
+<a name="418"><span class="lineNum"> 418 </span> : : /* Write ECCed data to the flash */</a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : rc = flash_write(bl, pos, bufecc, copylen, verify);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : goto err;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> : : /* Update for next copy */</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : len -= copylen_minus_ecc;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : buf = (uint8_t *)buf + copylen_minus_ecc;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : pos += copylen;</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : }</a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : rc = 0;</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : </a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : err:</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : free(bufecc);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : }</a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> : : enum sm_comp_res {</a>
+<a name="437"><span class="lineNum"> 437 </span> : : sm_no_change,</a>
+<a name="438"><span class="lineNum"> 438 </span> : : sm_need_write,</a>
+<a name="439"><span class="lineNum"> 439 </span> : : sm_need_erase,</a>
+<a name="440"><span class="lineNum"> 440 </span> : : };</a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 52 : static enum sm_comp_res flash_smart_comp(struct flash_chip *c,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : const void *src,</a>
+<a name="444"><span class="lineNum"> 444 </span> : : uint32_t offset, uint32_t size)</a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 52 : uint8_t *b = c-&gt;smart_buf + offset;</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 52 : const uint8_t *s = src;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 52 : bool is_same = true;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : uint32_t i;</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : </a>
+<a name="451"><span class="lineNum"> 451 </span> : : /* SRC DEST NEED_ERASE</a>
+<a name="452"><span class="lineNum"> 452 </span> : : * 0 1 0</a>
+<a name="453"><span class="lineNum"> 453 </span> : : * 1 1 0</a>
+<a name="454"><span class="lineNum"> 454 </span> : : * 0 0 0</a>
+<a name="455"><span class="lineNum"> 455 </span> : : * 1 0 1</a>
+<a name="456"><span class="lineNum"> 456 </span> : : */</a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 135245 : for (i = 0; i &lt; size; i++) {</span></a>
+<a name="458"><span class="lineNum"> 458 </span> : : /* Any bit need to be set, need erase */</a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 135211 : if (s[i] &amp; ~b[i])</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 18 : return sm_need_erase;</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineCov"> 135193 : if (is_same &amp;&amp; (b[i] != s[i]))</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 36 : is_same = false;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : }</a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 34 : return is_same ? sm_no_change : sm_need_write;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : }</a>
+<a name="466"><span class="lineNum"> 466 </span> : : </a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 4 : static int flash_smart_write(struct blocklevel_device *bl, uint64_t dst, const void *src, uint64_t size)</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : {</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 4 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 4 : uint32_t er_size = c-&gt;min_erase_mask + 1;</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 4 : uint32_t end = dst + size;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> : : /* Some sanity checking */</a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineCov"> 4 : if (end &lt;= dst || !size || end &gt; c-&gt;tsize) {</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Smart write param error\n&quot;);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="478"><span class="lineNum"> 478 </span> : : }</a>
+<a name="479"><span class="lineNum"> 479 </span> : : </a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineCov"> 4 : FL_DBG(&quot;LIBFLASH: Smart writing to 0x%&quot; PRIx64 &quot;..0%&quot; PRIx64 &quot;...\n&quot;,</span></a>
+<a name="481"><span class="lineNum"> 481 </span> : : dst, dst + size);</a>
+<a name="482"><span class="lineNum"> 482 </span> : : </a>
+<a name="483"><span class="lineNum"> 483 </span> : : /* As long as we have something to write ... */</a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 56 : while(dst &lt; end) {</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : uint32_t page, off, chunk;</span></a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : enum sm_comp_res sr;</span></a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> : : /* Figure out which erase page we are in and read it */</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 52 : page = dst &amp; ~c-&gt;min_erase_mask;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 52 : off = dst &amp; c-&gt;min_erase_mask;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 52 : FL_DBG(&quot;LIBFLASH: reading page 0x%08x..0x%08x...\n&quot;,</span></a>
+<a name="492"><span class="lineNum"> 492 </span> : : page, page + er_size);</a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 52 : rc = flash_read(bl, page, c-&gt;smart_buf, er_size);</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 52 : if (rc) {</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...error %d!\n&quot;, rc);</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> : : }</a>
+<a name="498"><span class="lineNum"> 498 </span> : : </a>
+<a name="499"><span class="lineNum"> 499 </span> : : /* Locate the chunk of data we are working on */</a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineCov"> 52 : chunk = er_size - off;</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 52 : if (size &lt; chunk)</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 1 : chunk = size;</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> : : /* Compare against what we are writing and ff */</a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineCov"> 52 : sr = flash_smart_comp(c, src, off, chunk);</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineCov"> 52 : switch(sr) {</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : case sm_no_change:</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : /* Identical, skip it */</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: ...same !\n&quot;);</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 34 : case sm_need_write:</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : /* Just needs writing over */</a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 34 : FL_DBG(&quot;LIBFLASH: ...need write !\n&quot;);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 34 : rc = flash_write(bl, dst, src, chunk, true);</span></a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineCov"> 34 : if (rc) {</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Write error %d !\n&quot;, rc);</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : }</a>
+<a name="519"><span class="lineNum"> 519 </span> :<span class="lineCov"> 34 : break;</span></a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 18 : case sm_need_erase:</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineCov"> 18 : FL_DBG(&quot;LIBFLASH: ...need erase !\n&quot;);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 18 : rc = flash_erase(bl, page, er_size);</span></a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineCov"> 18 : if (rc) {</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: erase error %d !\n&quot;, rc);</span></a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="526"><span class="lineNum"> 526 </span> : : }</a>
+<a name="527"><span class="lineNum"> 527 </span> : : /* Then update the portion of the buffer and write the block */</a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 18 : memcpy(c-&gt;smart_buf + off, src, chunk);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 18 : rc = flash_write(bl, page, c-&gt;smart_buf, er_size, true);</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineCov"> 18 : if (rc) {</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: write error %d !\n&quot;, rc);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="533"><span class="lineNum"> 533 </span> : : }</a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineCov"> 18 : break;</span></a>
+<a name="535"><span class="lineNum"> 535 </span> : : }</a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineCov"> 52 : dst += chunk;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineCov"> 52 : src += chunk;</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineCov"> 52 : size -= chunk;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> : : }</a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 4 : return 0;</span></a>
+<a name="541"><span class="lineNum"> 541 </span> : : }</a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 1 : int flash_smart_write_corrected(struct blocklevel_device *bl, uint32_t dst, const void *src,</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : uint32_t size, bool ecc)</a>
+<a name="545"><span class="lineNum"> 545 </span> : : {</a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : struct ecc64 *buf;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : </a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 1 : if (!ecc)</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : return flash_smart_write(bl, dst, src, size);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineCov"> 1 : buf = malloc(ecc_buffer_size(size));</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineCov"> 1 : if (!buf)</span></a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="555"><span class="lineNum"> 555 </span> : : </a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineCov"> 1 : rc = memcpy_to_ecc(buf, src, size);</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_ECC_INVALID;</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> : : }</a>
+<a name="561"><span class="lineNum"> 561 </span> : : </a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineCov"> 1 : rc = flash_smart_write(bl, dst, buf, ecc_buffer_size(size));</span></a>
+<a name="563"><span class="lineNum"> 563 </span> : : </a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineCov"> 1 : out:</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : }</a>
+<a name="568"><span class="lineNum"> 568 </span> : : </a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineCov"> 1 : static int fl_chip_id(struct spi_flash_ctrl *ct, uint8_t *id_buf,</span></a>
+<a name="570"><span class="lineNum"> 570 </span> : : uint32_t *id_size)</a>
+<a name="571"><span class="lineNum"> 571 </span> : : {</a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : uint8_t stat;</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : </a>
+<a name="575"><span class="lineNum"> 575 </span> : : /* Check initial status */</a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineCov"> 1 : rc = fl_read_stat(ct, &amp;stat);</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="579"><span class="lineNum"> 579 </span> : : </a>
+<a name="580"><span class="lineNum"> 580 </span> : : /* If stuck writing, wait for idle */</a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineCov"> 1 : if (stat &amp; STAT_WIP) {</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash in writing state ! Waiting...\n&quot;);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : rc = fl_sync_wait_idle(ct);</span></a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : } else</a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;LIBFLASH: Init status: %02x\n&quot;, stat);</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : </a>
+<a name="589"><span class="lineNum"> 589 </span> : : /* Fallback to get ID manually */</a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 1 : rc = ct-&gt;cmd_rd(ct, CMD_RDID, false, 0, id_buf, 3);</span></a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 1 : *id_size = 3;</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : </a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : }</a>
+<a name="597"><span class="lineNum"> 597 </span> : : </a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineCov"> 1 : static int flash_identify(struct flash_chip *c)</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : {</a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineCov"> 1 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 1 : const struct flash_info *info = NULL;</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : uint32_t iid, id_size;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : #define MAX_ID_SIZE 16</a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineNoCov"> 0 : uint8_t id[MAX_ID_SIZE];</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : int rc, i;</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineCov"> 1 : if (ct-&gt;chip_id) {</span></a>
+<a name="608"><span class="lineNum"> 608 </span> : : /* High level controller interface */</a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : id_size = MAX_ID_SIZE;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;chip_id(ct, id, &amp;id_size);</span></a>
+<a name="611"><span class="lineNum"> 611 </span> : : } else</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineCov"> 1 : rc = fl_chip_id(ct, id, &amp;id_size);</span></a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 1 : if (id_size &lt; 3)</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CHIP_UNKNOWN;</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> : : /* Convert to a dword for lookup */</a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineCov"> 1 : iid = id[0];</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineCov"> 1 : iid = (iid &lt;&lt; 8) | id[1];</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineCov"> 1 : iid = (iid &lt;&lt; 8) | id[2];</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : </a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;LIBFLASH: Flash ID: %02x.%02x.%02x (%06x)\n&quot;,</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : id[0], id[1], id[2], iid);</a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> : : /* Lookup in flash_info */</a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 11 : for (i = 0; i &lt; ARRAY_SIZE(flash_info); i++) {</span></a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineCov"> 11 : info = &amp;flash_info[i];</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 11 : if (info-&gt;id == iid)</span></a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 1 : break; </span></a>
+<a name="631"><span class="lineNum"> 631 </span> : : }</a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 1 : if (!info || info-&gt;id != iid)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CHIP_UNKNOWN;</span></a>
+<a name="634"><span class="lineNum"> 634 </span> : : </a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineCov"> 1 : c-&gt;info = *info;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineCov"> 1 : c-&gt;tsize = info-&gt;size;</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineCov"> 1 : ct-&gt;finfo = &amp;c-&gt;info;</span></a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> : : /*</a>
+<a name="640"><span class="lineNum"> 640 </span> : : * Let controller know about our settings and possibly</a>
+<a name="641"><span class="lineNum"> 641 </span> : : * override them</a>
+<a name="642"><span class="lineNum"> 642 </span> : : */</a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 1 : if (ct-&gt;setup) {</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;setup(ct, &amp;c-&gt;tsize);</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="647"><span class="lineNum"> 647 </span> : : }</a>
+<a name="648"><span class="lineNum"> 648 </span> : : </a>
+<a name="649"><span class="lineNum"> 649 </span> : : /* Calculate min erase granularity */</a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineCov"> 1 : if (c-&gt;info.flags &amp; FL_ERASE_4K)</span></a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 1 : c-&gt;min_erase_mask = 0xfff;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_32K)</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0x7fff;</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : else if (c-&gt;info.flags &amp; FL_ERASE_64K)</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : c-&gt;min_erase_mask = 0xffff;</span></a>
+<a name="656"><span class="lineNum"> 656 </span> : : else {</a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* No erase size ? oops ... */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: No erase sizes !\n&quot;);</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_CTRL_CONFIG_MISMATCH;</span></a>
+<a name="660"><span class="lineNum"> 660 </span> : : }</a>
+<a name="661"><span class="lineNum"> 661 </span> : : </a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;LIBFLASH: Found chip %s size %dM erase granule: %dK\n&quot;,</span></a>
+<a name="663"><span class="lineNum"> 663 </span> : : c-&gt;info.name, c-&gt;tsize &gt;&gt; 20, (c-&gt;min_erase_mask + 1) &gt;&gt; 10);</a>
+<a name="664"><span class="lineNum"> 664 </span> : : </a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="666"><span class="lineNum"> 666 </span> : : }</a>
+<a name="667"><span class="lineNum"> 667 </span> : : </a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 1 : static int flash_set_4b(struct flash_chip *c, bool enable)</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : {</a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineCov"> 1 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> : : </a>
+<a name="673"><span class="lineNum"> 673 </span> : : /* Don't have low level interface, assume all is well */</a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineCov"> 1 : if (!ct-&gt;cmd_wr)</span></a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> : : /* Some flash chips want this */</a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineCov"> 1 : rc = fl_wren(ct);</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Error %d enabling write for set_4b\n&quot;, rc);</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : /* Ignore the error &amp; move on (could be wrprotect chip) */</a>
+<a name="682"><span class="lineNum"> 682 </span> : : }</a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> : : /* Ignore error in case chip is write protected */</a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineCov"> 1 : return ct-&gt;cmd_wr(ct, enable ? CMD_EN4B : CMD_EX4B, false, 0, NULL, 0);</span></a>
+<a name="686"><span class="lineNum"> 686 </span> : : }</a>
+<a name="687"><span class="lineNum"> 687 </span> : : </a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : int flash_force_4b_mode(struct flash_chip *c, bool enable_4b)</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : {</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineNoCov"> 0 : int rc = FLASH_ERR_4B_NOT_SUPPORTED;</span></a>
+<a name="692"><span class="lineNum"> 692 </span> : : </a>
+<a name="693"><span class="lineNum"> 693 </span> : : /*</a>
+<a name="694"><span class="lineNum"> 694 </span> : : * We only allow force 4b if both controller and flash do 4b</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * as this is mainly used if a 3rd party tries to directly</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * access a direct mapped read region</a>
+<a name="697"><span class="lineNum"> 697 </span> : : */</a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : if (enable_4b &amp;&amp; !((c-&gt;info.flags &amp; FL_CAN_4B) &amp;&amp; ct-&gt;set_4b))</span></a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="700"><span class="lineNum"> 700 </span> : : </a>
+<a name="701"><span class="lineNum"> 701 </span> : : /* Only send to flash directly on controllers that implement</a>
+<a name="702"><span class="lineNum"> 702 </span> : : * the low level callbacks</a>
+<a name="703"><span class="lineNum"> 703 </span> : : */</a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, enable_4b);</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="708"><span class="lineNum"> 708 </span> : : }</a>
+<a name="709"><span class="lineNum"> 709 </span> : : </a>
+<a name="710"><span class="lineNum"> 710 </span> : : /* Then inform the controller */</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b)</span></a>
+<a name="712"><span class="lineNum"> 712 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, enable_4b);</span></a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="714"><span class="lineNum"> 714 </span> : : }</a>
+<a name="715"><span class="lineNum"> 715 </span> : : </a>
+<a name="716"><span class="lineNum"> 716 </span> :<span class="lineCov"> 1 : static int flash_configure(struct flash_chip *c)</span></a>
+<a name="717"><span class="lineNum"> 717 </span> : : {</a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineCov"> 1 : struct spi_flash_ctrl *ct = c-&gt;ctrl;</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="720"><span class="lineNum"> 720 </span> : : </a>
+<a name="721"><span class="lineNum"> 721 </span> : : /* Crop flash size if necessary */</a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 1 : if (c-&gt;tsize &gt; 0x01000000 &amp;&amp; !(c-&gt;info.flags &amp; FL_CAN_4B)) {</span></a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash chip cropped to 16M, no 4b mode\n&quot;);</span></a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : c-&gt;tsize = 0x01000000;</span></a>
+<a name="725"><span class="lineNum"> 725 </span> : : }</a>
+<a name="726"><span class="lineNum"> 726 </span> : : </a>
+<a name="727"><span class="lineNum"> 727 </span> : : /* If flash chip &gt; 16M, enable 4b mode */</a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineCov"> 1 : if (c-&gt;tsize &gt; 0x01000000) {</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Flash &gt;16MB, enabling 4B mode...\n&quot;);</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> : : /* Set flash to 4b mode if we can */</a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;cmd_wr) {</span></a>
+<a name="733"><span class="lineNum"> 733 </span> :<span class="lineNoCov"> 0 : rc = flash_set_4b(c, true);</span></a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set flash 4b mode\n&quot;);</span></a>
+<a name="736"><span class="lineNum"> 736 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="737"><span class="lineNum"> 737 </span> : : }</a>
+<a name="738"><span class="lineNum"> 738 </span> : : }</a>
+<a name="739"><span class="lineNum"> 739 </span> : : </a>
+<a name="740"><span class="lineNum"> 740 </span> : : </a>
+<a name="741"><span class="lineNum"> 741 </span> : : /* Set controller to 4b mode if supported */</a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineNoCov"> 0 : if (ct-&gt;set_4b) {</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineNoCov"> 0 : FL_DBG(&quot;LIBFLASH: Enabling controller 4B mode...\n&quot;);</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineNoCov"> 0 : rc = ct-&gt;set_4b(ct, true);</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to set controller 4b mode\n&quot;);</span></a>
+<a name="747"><span class="lineNum"> 747 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="748"><span class="lineNum"> 748 </span> : : }</a>
+<a name="749"><span class="lineNum"> 749 </span> : : }</a>
+<a name="750"><span class="lineNum"> 750 </span> : : } else {</a>
+<a name="751"><span class="lineNum"> 751 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;LIBFLASH: Flash &lt;=16MB, disabling 4B mode...\n&quot;);</span></a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> : : /*</a>
+<a name="754"><span class="lineNum"> 754 </span> : : * If flash chip supports 4b mode, make sure we disable</a>
+<a name="755"><span class="lineNum"> 755 </span> : : * it in case it was left over by the previous user</a>
+<a name="756"><span class="lineNum"> 756 </span> : : */</a>
+<a name="757"><span class="lineNum"> 757 </span> :<span class="lineCov"> 1 : if (c-&gt;info.flags &amp; FL_CAN_4B) {</span></a>
+<a name="758"><span class="lineNum"> 758 </span> :<span class="lineCov"> 1 : rc = flash_set_4b(c, false);</span></a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="761"><span class="lineNum"> 761 </span> : : &quot; clear flash 4b mode\n&quot;);</a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : }</a>
+<a name="764"><span class="lineNum"> 764 </span> : : }</a>
+<a name="765"><span class="lineNum"> 765 </span> : : /* Set controller to 3b mode if mode switch is supported */</a>
+<a name="766"><span class="lineNum"> 766 </span> :<span class="lineCov"> 1 : if (ct-&gt;set_4b) {</span></a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineCov"> 1 : FL_DBG(&quot;LIBFLASH: Disabling controller 4B mode...\n&quot;);</span></a>
+<a name="768"><span class="lineNum"> 768 </span> :<span class="lineCov"> 1 : rc = ct-&gt;set_4b(ct, false);</span></a>
+<a name="769"><span class="lineNum"> 769 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to&quot;</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : &quot; clear controller 4b mode\n&quot;);</a>
+<a name="772"><span class="lineNum"> 772 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="773"><span class="lineNum"> 773 </span> : : }</a>
+<a name="774"><span class="lineNum"> 774 </span> : : }</a>
+<a name="775"><span class="lineNum"> 775 </span> : : }</a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="777"><span class="lineNum"> 777 </span> : : }</a>
+<a name="778"><span class="lineNum"> 778 </span> : : </a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineCov"> 1 : static int flash_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="780"><span class="lineNum"> 780 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="781"><span class="lineNum"> 781 </span> : : {</a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 1 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> :<span class="lineCov"> 1 : if (name)</span></a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 1 : *name = c-&gt;info.name;</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 1 : if (total_size)</span></a>
+<a name="786"><span class="lineNum"> 786 </span> :<span class="lineCov"> 1 : *total_size = c-&gt;tsize;</span></a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineCov"> 1 : if (erase_granule)</span></a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineCov"> 1 : *erase_granule = c-&gt;min_erase_mask + 1;</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : }</a>
+<a name="791"><span class="lineNum"> 791 </span> : : </a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineCov"> 1 : int flash_init(struct spi_flash_ctrl *ctrl, struct blocklevel_device **bl,</span></a>
+<a name="793"><span class="lineNum"> 793 </span> : : struct flash_chip **flash_chip)</a>
+<a name="794"><span class="lineNum"> 794 </span> : : {</a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c;</span></a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineNoCov"> 0 : int rc;</span></a>
+<a name="797"><span class="lineNum"> 797 </span> : : </a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineCov"> 1 : if (!bl)</span></a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineCov"> 1 : *bl = NULL;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> : : </a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineCov"> 1 : c = malloc(sizeof(struct flash_chip));</span></a>
+<a name="804"><span class="lineNum"> 804 </span> :<span class="lineCov"> 1 : if (!c)</span></a>
+<a name="805"><span class="lineNum"> 805 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="806"><span class="lineNum"> 806 </span> :<span class="lineCov"> 1 : memset(c, 0, sizeof(*c));</span></a>
+<a name="807"><span class="lineNum"> 807 </span> :<span class="lineCov"> 1 : c-&gt;ctrl = ctrl;</span></a>
+<a name="808"><span class="lineNum"> 808 </span> : : </a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineCov"> 1 : rc = flash_identify(c);</span></a>
+<a name="810"><span class="lineNum"> 810 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash identification failed\n&quot;);</span></a>
+<a name="812"><span class="lineNum"> 812 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="813"><span class="lineNum"> 813 </span> : : }</a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineCov"> 1 : c-&gt;smart_buf = malloc(c-&gt;min_erase_mask + 1);</span></a>
+<a name="815"><span class="lineNum"> 815 </span> :<span class="lineCov"> 1 : if (!c-&gt;smart_buf) {</span></a>
+<a name="816"><span class="lineNum"> 816 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Failed to allocate smart buffer !\n&quot;);</span></a>
+<a name="817"><span class="lineNum"> 817 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : }</a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineCov"> 1 : rc = flash_configure(c);</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="822"><span class="lineNum"> 822 </span> :<span class="lineNoCov"> 0 : FL_ERR(&quot;LIBFLASH: Flash configuration failed\n&quot;);</span></a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineCov"> 1 : bail:</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="825"><span class="lineNum"> 825 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="827"><span class="lineNum"> 827 </span> : : }</a>
+<a name="828"><span class="lineNum"> 828 </span> : : </a>
+<a name="829"><span class="lineNum"> 829 </span> : : /* The flash backend doesn't support reiniting it */</a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineCov"> 1 : c-&gt;bl.keep_alive = true;</span></a>
+<a name="831"><span class="lineNum"> 831 </span> :<span class="lineCov"> 1 : c-&gt;bl.reacquire = NULL;</span></a>
+<a name="832"><span class="lineNum"> 832 </span> :<span class="lineCov"> 1 : c-&gt;bl.release = NULL;</span></a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineCov"> 1 : c-&gt;bl.read = &amp;flash_read;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> :<span class="lineCov"> 1 : c-&gt;bl.write = &amp;flash_smart_write;</span></a>
+<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 1 : c-&gt;bl.erase = &amp;flash_erase;</span></a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineCov"> 1 : c-&gt;bl.get_info = &amp;flash_get_info;</span></a>
+<a name="837"><span class="lineNum"> 837 </span> :<span class="lineCov"> 1 : c-&gt;bl.erase_mask = c-&gt;min_erase_mask;</span></a>
+<a name="838"><span class="lineNum"> 838 </span> :<span class="lineCov"> 1 : c-&gt;bl.flags = WRITE_NEED_ERASE;</span></a>
+<a name="839"><span class="lineNum"> 839 </span> : : </a>
+<a name="840"><span class="lineNum"> 840 </span> :<span class="lineCov"> 1 : *bl = &amp;(c-&gt;bl);</span></a>
+<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 1 : if (flash_chip)</span></a>
+<a name="842"><span class="lineNum"> 842 </span> :<span class="lineNoCov"> 0 : *flash_chip = c;</span></a>
+<a name="843"><span class="lineNum"> 843 </span> : : </a>
+<a name="844"><span class="lineNum"> 844 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="845"><span class="lineNum"> 845 </span> : : }</a>
+<a name="846"><span class="lineNum"> 846 </span> : : </a>
+<a name="847"><span class="lineNum"> 847 </span> :<span class="lineCov"> 1 : void flash_exit(struct blocklevel_device *bl)</span></a>
+<a name="848"><span class="lineNum"> 848 </span> : : {</a>
+<a name="849"><span class="lineNum"> 849 </span> : : /* XXX Make sure we are idle etc... */</a>
+<a name="850"><span class="lineNum"> 850 </span> :<span class="lineCov"> 1 : if (bl) {</span></a>
+<a name="851"><span class="lineNum"> 851 </span> :<span class="lineCov"> 1 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="852"><span class="lineNum"> 852 </span> :<span class="lineCov"> 1 : free(c-&gt;smart_buf);</span></a>
+<a name="853"><span class="lineNum"> 853 </span> :<span class="lineCov"> 1 : free(c);</span></a>
+<a name="854"><span class="lineNum"> 854 </span> : : }</a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="856"><span class="lineNum"> 856 </span> : : </a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineNoCov"> 0 : void flash_exit_close(struct blocklevel_device *bl, void (*close)(struct spi_flash_ctrl *ctrl))</span></a>
+<a name="858"><span class="lineNum"> 858 </span> : : {</a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineNoCov"> 0 : if (bl) {</span></a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineNoCov"> 0 : struct flash_chip *c = container_of(bl, struct flash_chip, bl);</span></a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : close(c-&gt;ctrl);</span></a>
+<a name="862"><span class="lineNum"> 862 </span> :<span class="lineNoCov"> 0 : free(c);</span></a>
+<a name="863"><span class="lineNum"> 863 </span> : : }</a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/mbox-flash.c.func-sort-c.html b/coverage-report/libflash/mbox-flash.c.func-sort-c.html
new file mode 100644
index 0000000..a66e737
--- /dev/null
+++ b/coverage-report/libflash/mbox-flash.c.func-sort-c.html
@@ -0,0 +1,273 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/mbox-flash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - mbox-flash.c<span style="font-size: 80%;"> (<a href="mbox-flash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">372</td>
+ <td class="headerCovTableEntry">501</td>
+ <td class="headerCovTableEntryLo">74.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">48</td>
+ <td class="headerCovTableEntryHi">93.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="mbox-flash.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#504">mbox_flash_do_close_window</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#414">mbox_flash_do_illegal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#1083">mbox_flash_lock</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#458">mbox_flash_do_get_flash_info_v1</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#919">mbox_flash_erase_v1</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#1186">mbox_flash_exit</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#1140">mbox_flash_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#812">mbox_flash_reset</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#249">msg_get_u32</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#511">handle_reboot</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#358">mbox_flash_ack</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#938">mbox_flash_attn</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#451">mbox_flash_do_get_flash_info</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#600">mbox_flash_erase</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#877">mbox_flash_erase_v2</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#421">mbox_flash_do_get_mbox_info</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#834">mbox_flash_get_info</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#998">protocol_init</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#228">msg_get_u8</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#233">msg_put_u8</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#715">mbox_flash_write</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#495">mbox_flash_do_create_write_window_v1</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#254">msg_put_u32</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#485">mbox_flash_do_create_write_window</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#186">lpc_window_write</a></td>
+ <td class="coverFnHi">96</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#588">mbox_flash_dirty</a></td>
+ <td class="coverFnHi">96</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#612">mbox_flash_flush</a></td>
+ <td class="coverFnHi">99</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#550">mbox_flash_mark_write</a></td>
+ <td class="coverFnHi">99</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#476">mbox_flash_do_create_read_window_v1</a></td>
+ <td class="coverFnHi">164</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#409">mbox_flash_do_nop</a></td>
+ <td class="coverFnHi">202</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#768">mbox_flash_read</a></td>
+ <td class="coverFnHi">367</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#544">do_delayed_work</a></td>
+ <td class="coverFnHi">391</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#395">do_acks</a></td>
+ <td class="coverFnHi">394</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#466">mbox_flash_do_create_read_window</a></td>
+ <td class="coverFnHi">471</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#298">is_valid</a></td>
+ <td class="coverFnHi">659</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#144">lpc_window_read</a></td>
+ <td class="coverFnHi">659</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#223">mbox_flash_mask</a></td>
+ <td class="coverFnHi">734</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#648">mbox_window_move</a></td>
+ <td class="coverFnHi">762</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#636">mbox_window_valid</a></td>
+ <td class="coverFnHi">762</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#265">bytes_to_blocks</a></td>
+ <td class="coverFnHi">908</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#243">msg_put_u16</a></td>
+ <td class="coverFnHi">908</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#965">mbox_flash_callback</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#316">msg_send</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#326">wait_for_bmc</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#282">is_paused</a></td>
+ <td class="coverFnHi">1050</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#311">is_reboot</a></td>
+ <td class="coverFnHi">1335</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#260">blocks_to_bytes</a></td>
+ <td class="coverFnHi">1824</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#238">msg_get_u16</a></td>
+ <td class="coverFnHi">1827</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/mbox-flash.c.func.html b/coverage-report/libflash/mbox-flash.c.func.html
new file mode 100644
index 0000000..fff40e5
--- /dev/null
+++ b/coverage-report/libflash/mbox-flash.c.func.html
@@ -0,0 +1,273 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/mbox-flash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - mbox-flash.c<span style="font-size: 80%;"> (<a href="mbox-flash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">372</td>
+ <td class="headerCovTableEntry">501</td>
+ <td class="headerCovTableEntryLo">74.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">48</td>
+ <td class="headerCovTableEntryHi">93.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="mbox-flash.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#260">blocks_to_bytes</a></td>
+ <td class="coverFnHi">1824</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#265">bytes_to_blocks</a></td>
+ <td class="coverFnHi">908</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#395">do_acks</a></td>
+ <td class="coverFnHi">394</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#544">do_delayed_work</a></td>
+ <td class="coverFnHi">391</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#511">handle_reboot</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#282">is_paused</a></td>
+ <td class="coverFnHi">1050</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#311">is_reboot</a></td>
+ <td class="coverFnHi">1335</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#298">is_valid</a></td>
+ <td class="coverFnHi">659</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#144">lpc_window_read</a></td>
+ <td class="coverFnHi">659</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#186">lpc_window_write</a></td>
+ <td class="coverFnHi">96</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#358">mbox_flash_ack</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#938">mbox_flash_attn</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#965">mbox_flash_callback</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#588">mbox_flash_dirty</a></td>
+ <td class="coverFnHi">96</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#504">mbox_flash_do_close_window</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#466">mbox_flash_do_create_read_window</a></td>
+ <td class="coverFnHi">471</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#476">mbox_flash_do_create_read_window_v1</a></td>
+ <td class="coverFnHi">164</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#485">mbox_flash_do_create_write_window</a></td>
+ <td class="coverFnHi">72</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#495">mbox_flash_do_create_write_window_v1</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#451">mbox_flash_do_get_flash_info</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#458">mbox_flash_do_get_flash_info_v1</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#421">mbox_flash_do_get_mbox_info</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#414">mbox_flash_do_illegal</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#409">mbox_flash_do_nop</a></td>
+ <td class="coverFnHi">202</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#600">mbox_flash_erase</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#919">mbox_flash_erase_v1</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#877">mbox_flash_erase_v2</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#1186">mbox_flash_exit</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#612">mbox_flash_flush</a></td>
+ <td class="coverFnHi">99</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#834">mbox_flash_get_info</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#1140">mbox_flash_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#1083">mbox_flash_lock</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#550">mbox_flash_mark_write</a></td>
+ <td class="coverFnHi">99</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#223">mbox_flash_mask</a></td>
+ <td class="coverFnHi">734</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#768">mbox_flash_read</a></td>
+ <td class="coverFnHi">367</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#812">mbox_flash_reset</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#715">mbox_flash_write</a></td>
+ <td class="coverFnHi">20</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#648">mbox_window_move</a></td>
+ <td class="coverFnHi">762</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#636">mbox_window_valid</a></td>
+ <td class="coverFnHi">762</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#238">msg_get_u16</a></td>
+ <td class="coverFnHi">1827</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#249">msg_get_u32</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#228">msg_get_u8</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#243">msg_put_u16</a></td>
+ <td class="coverFnHi">908</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#254">msg_put_u32</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#233">msg_put_u8</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#316">msg_send</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#998">protocol_init</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-flash.c.gcov.html#326">wait_for_bmc</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/mbox-flash.c.gcov.html b/coverage-report/libflash/mbox-flash.c.gcov.html
new file mode 100644
index 0000000..16c2a3e
--- /dev/null
+++ b/coverage-report/libflash/mbox-flash.c.gcov.html
@@ -0,0 +1,1284 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/mbox-flash.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libflash</a> - mbox-flash.c<span style="font-size: 80%;"> (source / <a href="mbox-flash.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">372</td>
+ <td class="headerCovTableEntry">501</td>
+ <td class="headerCovTableEntryLo">74.3 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">48</td>
+ <td class="headerCovTableEntryHi">93.8 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2017-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define pr_fmt(fmt) &quot;MBOX-FLASH: &quot; fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #define _GNU_SOURCE</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;errno.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;string.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;timebase.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;timer.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;libflash/mbox-flash.h&gt;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;lpc.h&gt;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &lt;lpc-mbox.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : #ifndef __SKIBOOT__</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #ifndef __TEST__</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #error &quot;This libflash backend must be compiled with skiboot&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #endif</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #endif</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Same technique as BUILD_BUG_ON from linux */</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #define CHECK_HANDLER_SIZE(handlers) ((void)sizeof(char[1 - 2*!!(ARRAY_SIZE(handlers) != (MBOX_COMMAND_COUNT + 1))]))</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : #define MBOX_DEFAULT_TIMEOUT 3 /* seconds */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define MSG_CREATE(init_command) { .command = init_command }</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : struct mbox_flash_data;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : typedef void (mbox_handler)(struct mbox_flash_data *, struct bmc_mbox_msg *);</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct lpc_window {</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint32_t lpc_addr; /* Offset into LPC space */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint32_t cur_pos; /* Current position of the window in the flash */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : uint32_t size; /* Size of the window into the flash */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : bool open;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : };</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct mbox_flash_data {</a>
+<a name="47"><span class="lineNum"> 47 </span> : : int version;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : uint16_t timeout;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : uint32_t shift;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : struct lpc_window read;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : struct lpc_window write;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : struct blocklevel_device bl;</a>
+<a name="53"><span class="lineNum"> 53 </span> : : uint32_t total_size;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : uint32_t erase_granule;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : int rc;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : bool reboot;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : bool pause;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : bool busy;</a>
+<a name="59"><span class="lineNum"> 59 </span> : : bool ack;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : mbox_handler **handlers;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : };</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : static mbox_handler mbox_flash_do_nop;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : static mbox_handler mbox_flash_do_illegal;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> : : /* Version 1, 2, 3 compatible */</a>
+<a name="67"><span class="lineNum"> 67 </span> : : static mbox_handler mbox_flash_do_get_mbox_info;</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : /* Version 2 and 3 compatible */</a>
+<a name="70"><span class="lineNum"> 70 </span> : : static mbox_handler mbox_flash_do_get_flash_info;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : static mbox_handler mbox_flash_do_get_flash_info_v1;</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : /* Version 2 and 3 compatible */</a>
+<a name="74"><span class="lineNum"> 74 </span> : : static mbox_handler mbox_flash_do_create_read_window;</a>
+<a name="75"><span class="lineNum"> 75 </span> : : static mbox_handler mbox_flash_do_create_read_window_v1;</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : /* Version 2 and 3 compatible */</a>
+<a name="78"><span class="lineNum"> 78 </span> : : static mbox_handler mbox_flash_do_create_write_window;</a>
+<a name="79"><span class="lineNum"> 79 </span> : : static mbox_handler mbox_flash_do_create_write_window_v1;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : /* Version 1, 2, 3 compatible */</a>
+<a name="82"><span class="lineNum"> 82 </span> : : static mbox_handler mbox_flash_do_close_window;</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> : : /* Plus one, commands start at 1 */</a>
+<a name="85"><span class="lineNum"> 85 </span> : : static mbox_handler *handlers_v3[] = {</a>
+<a name="86"><span class="lineNum"> 86 </span> : : NULL,</a>
+<a name="87"><span class="lineNum"> 87 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="88"><span class="lineNum"> 88 </span> : : &amp;mbox_flash_do_get_mbox_info,</a>
+<a name="89"><span class="lineNum"> 89 </span> : : &amp;mbox_flash_do_get_flash_info,</a>
+<a name="90"><span class="lineNum"> 90 </span> : : &amp;mbox_flash_do_create_read_window,</a>
+<a name="91"><span class="lineNum"> 91 </span> : : &amp;mbox_flash_do_close_window,</a>
+<a name="92"><span class="lineNum"> 92 </span> : : &amp;mbox_flash_do_create_write_window,</a>
+<a name="93"><span class="lineNum"> 93 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="94"><span class="lineNum"> 94 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="95"><span class="lineNum"> 95 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="98"><span class="lineNum"> 98 </span> : : &amp;mbox_flash_do_nop</a>
+<a name="99"><span class="lineNum"> 99 </span> : : };</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : /* Plus one, commands start at 1 */</a>
+<a name="102"><span class="lineNum"> 102 </span> : : static mbox_handler *handlers_v2[] = {</a>
+<a name="103"><span class="lineNum"> 103 </span> : : NULL,</a>
+<a name="104"><span class="lineNum"> 104 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="105"><span class="lineNum"> 105 </span> : : &amp;mbox_flash_do_get_mbox_info,</a>
+<a name="106"><span class="lineNum"> 106 </span> : : &amp;mbox_flash_do_get_flash_info,</a>
+<a name="107"><span class="lineNum"> 107 </span> : : &amp;mbox_flash_do_create_read_window,</a>
+<a name="108"><span class="lineNum"> 108 </span> : : &amp;mbox_flash_do_close_window,</a>
+<a name="109"><span class="lineNum"> 109 </span> : : &amp;mbox_flash_do_create_write_window,</a>
+<a name="110"><span class="lineNum"> 110 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="111"><span class="lineNum"> 111 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="112"><span class="lineNum"> 112 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="113"><span class="lineNum"> 113 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="114"><span class="lineNum"> 114 </span> : : &amp;mbox_flash_do_illegal,</a>
+<a name="115"><span class="lineNum"> 115 </span> : : &amp;mbox_flash_do_illegal</a>
+<a name="116"><span class="lineNum"> 116 </span> : : };</a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> : : /*</a>
+<a name="119"><span class="lineNum"> 119 </span> : : * Plus one, commands start at 1.</a>
+<a name="120"><span class="lineNum"> 120 </span> : : * V2 adds a command so there should never be a response for the last</a>
+<a name="121"><span class="lineNum"> 121 </span> : : * command.</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * Ensure we print an error message with mbox_flash_do_illegal().</a>
+<a name="123"><span class="lineNum"> 123 </span> : : */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : static mbox_handler *handlers_v1[] = {</a>
+<a name="125"><span class="lineNum"> 125 </span> : : NULL,</a>
+<a name="126"><span class="lineNum"> 126 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="127"><span class="lineNum"> 127 </span> : : &amp;mbox_flash_do_get_mbox_info,</a>
+<a name="128"><span class="lineNum"> 128 </span> : : &amp;mbox_flash_do_get_flash_info_v1,</a>
+<a name="129"><span class="lineNum"> 129 </span> : : &amp;mbox_flash_do_create_read_window_v1,</a>
+<a name="130"><span class="lineNum"> 130 </span> : : &amp;mbox_flash_do_close_window,</a>
+<a name="131"><span class="lineNum"> 131 </span> : : &amp;mbox_flash_do_create_write_window_v1,</a>
+<a name="132"><span class="lineNum"> 132 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="133"><span class="lineNum"> 133 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="134"><span class="lineNum"> 134 </span> : : &amp;mbox_flash_do_nop,</a>
+<a name="135"><span class="lineNum"> 135 </span> : : &amp;mbox_flash_do_illegal,</a>
+<a name="136"><span class="lineNum"> 136 </span> : : &amp;mbox_flash_do_illegal,</a>
+<a name="137"><span class="lineNum"> 137 </span> : : &amp;mbox_flash_do_illegal</a>
+<a name="138"><span class="lineNum"> 138 </span> : : };</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : static void mbox_flash_callback(struct bmc_mbox_msg *msg, void *priv);</a>
+<a name="142"><span class="lineNum"> 142 </span> : : static void mbox_flash_attn(uint8_t attn, void *priv);</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> : : static int protocol_init(struct mbox_flash_data *mbox_flash, uint8_t shift);</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 659 : static int lpc_window_read(struct mbox_flash_data *mbox_flash, uint32_t pos,</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : void *buf, uint32_t len)</a>
+<a name="148"><span class="lineNum"> 148 </span> : : {</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 659 : uint32_t off = mbox_flash-&gt;read.lpc_addr + (pos - mbox_flash-&gt;read.cur_pos);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : int rc;</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 659 : prlog(PR_TRACE, &quot;Reading at 0x%08x for 0x%08x offset: 0x%08x\n&quot;,</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : pos, len, off);</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 22434764 : while(len) {</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : uint32_t chunk;</a>
+<a name="157"><span class="lineNum"> 157 </span> : : uint32_t dat;</a>
+<a name="158"><span class="lineNum"> 158 </span> : : </a>
+<a name="159"><span class="lineNum"> 159 </span> : : /* XXX: make this read until it's aligned */</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 22434105 : if (len &gt; 3 &amp;&amp; !(off &amp; 3)) {</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 22433797 : rc = lpc_read(OPAL_LPC_FW, off, &amp;dat, 4);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 22433797 : if (!rc) {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> : : /*</a>
+<a name="164"><span class="lineNum"> 164 </span> : : * lpc_read swaps to CPU endian but it's not</a>
+<a name="165"><span class="lineNum"> 165 </span> : : * really a 32-bit value, so convert back.</a>
+<a name="166"><span class="lineNum"> 166 </span> : : */</a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 22433797 : *(__be32 *)buf = cpu_to_be32(dat);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : }</a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 22433797 : chunk = 4;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : } else {</a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 308 : rc = lpc_read(OPAL_LPC_FW, off, &amp;dat, 1);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 308 : if (!rc)</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 308 : *(uint8_t *)buf = dat;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 308 : chunk = 1;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : }</a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 22434105 : if (rc) {</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;lpc_read failure %d to FW 0x%08x\n&quot;, rc, off);</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : }</a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 22434105 : len -= chunk;</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 22434105 : off += chunk;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 22434105 : buf += chunk;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 659 : return 0;</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 96 : static int lpc_window_write(struct mbox_flash_data *mbox_flash, uint32_t pos,</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : const void *buf, uint32_t len)</a>
+<a name="190"><span class="lineNum"> 190 </span> : : {</a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 96 : uint32_t off = mbox_flash-&gt;write.lpc_addr + (pos - mbox_flash-&gt;write.cur_pos);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : int rc;</a>
+<a name="193"><span class="lineNum"> 193 </span> : : </a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 96 : prlog(PR_TRACE, &quot;Writing at 0x%08x for 0x%08x offset: 0x%08x\n&quot;,</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : pos, len, off);</a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 6236268 : while(len) {</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : uint32_t chunk;</a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 6236172 : if (len &gt; 3 &amp;&amp; !(off &amp; 3)) {</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : /* endian swap: see lpc_window_write */</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 6236172 : uint32_t dat = be32_to_cpu(*(__be32 *)buf);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 6236172 : rc = lpc_write(OPAL_LPC_FW, off, dat, 4);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 6236172 : chunk = 4;</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : } else {</a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : uint8_t dat = *(uint8_t *)buf;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : rc = lpc_write(OPAL_LPC_FW, off, dat, 1);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : chunk = 1;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : }</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 6236172 : if (rc) {</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;lpc_write failure %d to FW 0x%08x\n&quot;, rc, off);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 6236172 : len -= chunk;</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 6236172 : off += chunk;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 6236172 : buf += chunk;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : }</a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 96 : return 0;</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : }</a>
+<a name="224"><span class="lineNum"> 224 </span> : : </a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 734 : static uint64_t mbox_flash_mask(struct mbox_flash_data *mbox_flash)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : {</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 734 : return (1ULL &lt;&lt; mbox_flash-&gt;shift) - 1;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : }</a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 7 : __unused static uint8_t msg_get_u8(struct bmc_mbox_msg *msg, int i)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : {</a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 7 : return msg-&gt;args[i];</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : }</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 11 : static void msg_put_u8(struct bmc_mbox_msg *msg, int i, uint8_t val)</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : {</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 11 : msg-&gt;args[i] = val;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 11 : }</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 1827 : static uint16_t msg_get_u16(struct bmc_mbox_msg *msg, int i)</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : {</a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 1827 : return le16_to_cpu(*(__le16 *)(&amp;msg-&gt;args[i]));</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : }</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 908 : static void msg_put_u16(struct bmc_mbox_msg *msg, int i, uint16_t val)</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : {</a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 908 : __le16 tmp = cpu_to_le16(val);</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 908 : memcpy(&amp;msg-&gt;args[i], &amp;tmp, sizeof(val));</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 908 : }</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 2 : static uint32_t msg_get_u32(struct bmc_mbox_msg *msg, int i)</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : {</a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 2 : return le32_to_cpu(*(__le32 *)(&amp;msg-&gt;args[i]));</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : }</a>
+<a name="255"><span class="lineNum"> 255 </span> : : </a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 24 : static void msg_put_u32(struct bmc_mbox_msg *msg, int i, uint32_t val)</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : {</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 24 : __le32 tmp = cpu_to_le32(val);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 24 : memcpy(&amp;msg-&gt;args[i], &amp;tmp, sizeof(val));</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 24 : }</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 1824 : static uint32_t blocks_to_bytes(struct mbox_flash_data *mbox_flash, uint16_t blocks)</span></a>
+<a name="263"><span class="lineNum"> 263 </span> : : {</a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 1824 : return blocks &lt;&lt; mbox_flash-&gt;shift;</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 908 : static uint16_t bytes_to_blocks(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : uint32_t bytes)</a>
+<a name="269"><span class="lineNum"> 269 </span> : : {</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 908 : return bytes &gt;&gt; mbox_flash-&gt;shift;</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : }</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> : : /*</a>
+<a name="274"><span class="lineNum"> 274 </span> : : * The BMC may send is an out of band message to say that it doesn't</a>
+<a name="275"><span class="lineNum"> 275 </span> : : * own the flash anymore.</a>
+<a name="276"><span class="lineNum"> 276 </span> : : * It guarantees we can still access our (open) windows but it does</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * not guarantee their contents until it clears the bit without</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * sending us a corresponding bit to say that the windows are bad</a>
+<a name="279"><span class="lineNum"> 279 </span> : : * first.</a>
+<a name="280"><span class="lineNum"> 280 </span> : : * Since this is all things that will happen in the future, we should</a>
+<a name="281"><span class="lineNum"> 281 </span> : : * not perform any calls speculatively as its almost impossible to</a>
+<a name="282"><span class="lineNum"> 282 </span> : : * rewind.</a>
+<a name="283"><span class="lineNum"> 283 </span> : : */</a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 1050 : static bool is_paused(struct mbox_flash_data *mbox_flash)</span></a>
+<a name="285"><span class="lineNum"> 285 </span> : : {</a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 1050 : return mbox_flash-&gt;pause;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : }</a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> : : /*</a>
+<a name="290"><span class="lineNum"> 290 </span> : : * After a read or a write it is wise to check that the window we just</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * read/write to/from is still valid otherwise it is possible some of</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * the data didn't make it.</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * This check is an optimisation as we'll close all our windows on any</a>
+<a name="294"><span class="lineNum"> 294 </span> : : * notification from the BMC that the windows are bad. See the above</a>
+<a name="295"><span class="lineNum"> 295 </span> : : * comment about is_paused().</a>
+<a name="296"><span class="lineNum"> 296 </span> : : * A foolproof (but much closer) method of validating reads/writes</a>
+<a name="297"><span class="lineNum"> 297 </span> : : * would be to attempt to close the window, if that fails then we can</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * be sure that the read/write was no good.</a>
+<a name="299"><span class="lineNum"> 299 </span> : : */</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 659 : static bool is_valid(struct mbox_flash_data *mbox_flash, struct lpc_window *win)</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : {</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 659 : return !is_paused(mbox_flash) &amp;&amp; win-&gt;open;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : /*</a>
+<a name="306"><span class="lineNum"> 306 </span> : : * Check if we've received a BMC reboot notification.</a>
+<a name="307"><span class="lineNum"> 307 </span> : : * The strategy is to check on entry to mbox-flash and return a</a>
+<a name="308"><span class="lineNum"> 308 </span> : : * failure accordingly. Races will be handled by the fact that the BMC</a>
+<a name="309"><span class="lineNum"> 309 </span> : : * won't respond so timeouts will occur. As an added precaution</a>
+<a name="310"><span class="lineNum"> 310 </span> : : * msg_send() checks right before sending a message (to make the race</a>
+<a name="311"><span class="lineNum"> 311 </span> : : * as small as possible to avoid needless timeouts).</a>
+<a name="312"><span class="lineNum"> 312 </span> : : */</a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 1335 : static bool is_reboot(struct mbox_flash_data *mbox_flash)</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : {</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 1335 : return mbox_flash-&gt;reboot;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : }</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 944 : static int msg_send(struct mbox_flash_data *mbox_flash, struct bmc_mbox_msg *msg,</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : unsigned int timeout_sec)</a>
+<a name="320"><span class="lineNum"> 320 </span> : : {</a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 944 : if (is_reboot(mbox_flash))</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 944 : mbox_flash-&gt;busy = true;</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 944 : mbox_flash-&gt;rc = 0;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 944 : return bmc_mbox_enqueue(msg, timeout_sec);</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 944 : static int wait_for_bmc(struct mbox_flash_data *mbox_flash, unsigned int timeout_sec)</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : {</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 944 : unsigned long last = 1, start = tb_to_secs(mftb());</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 944 : prlog(PR_TRACE, &quot;Waiting for BMC\n&quot;);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 1888 : while (mbox_flash-&gt;busy &amp;&amp; timeout_sec &gt; last) {</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 944 : long now = tb_to_secs(mftb());</span></a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 944 : if (now - start &gt; last) {</span></a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineNoCov"> 0 : if (last &lt; timeout_sec / 2)</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineNoCov"> 0 : prlog(PR_TRACE, &quot;Been waiting for the BMC for %lu secs\n&quot;, last);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : else</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;BMC NOT RESPONDING %lu second wait\n&quot;, last);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : last++;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : }</a>
+<a name="341"><span class="lineNum"> 341 </span> : : /*</a>
+<a name="342"><span class="lineNum"> 342 </span> : : * Both functions are important.</a>
+<a name="343"><span class="lineNum"> 343 </span> : : * Well time_wait_ms() relaxes the spin... so... its nice</a>
+<a name="344"><span class="lineNum"> 344 </span> : : */</a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 944 : check_timers(false);</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 944 : if (mbox_flash-&gt;busy)</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : time_wait_ms(MBOX_DEFAULT_POLL_MS);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 944 : asm volatile (&quot;&quot; ::: &quot;memory&quot;);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : }</a>
+<a name="350"><span class="lineNum"> 350 </span> : : </a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 944 : if (mbox_flash-&gt;busy) {</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Timeout waiting for BMC\n&quot;);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;busy = false;</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : return MBOX_R_TIMEOUT;</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : }</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 944 : return mbox_flash-&gt;rc;</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : }</a>
+<a name="359"><span class="lineNum"> 359 </span> : : </a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 3 : static int mbox_flash_ack(struct mbox_flash_data *mbox_flash, uint8_t reg)</span></a>
+<a name="361"><span class="lineNum"> 361 </span> : : {</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 3 : struct bmc_mbox_msg msg = MSG_CREATE(MBOX_C_BMC_EVENT_ACK);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> : : int rc;</a>
+<a name="364"><span class="lineNum"> 364 </span> : : </a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 3 : msg_put_u8(&amp;msg, 0, reg);</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : </a>
+<a name="367"><span class="lineNum"> 367 </span> : : /* Clear this first so msg_send() doesn't freak out */</a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;reboot = false;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> : : /*</a>
+<a name="371"><span class="lineNum"> 371 </span> : : * Use a lower timeout - there is strong evidence to suggest the</a>
+<a name="372"><span class="lineNum"> 372 </span> : : * BMC won't respond, don't waste time spinning here just have the</a>
+<a name="373"><span class="lineNum"> 373 </span> : : * high levels retry when the BMC might be back</a>
+<a name="374"><span class="lineNum"> 374 </span> : : */</a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 3 : rc = msg_send(mbox_flash, &amp;msg, 3);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> : : </a>
+<a name="377"><span class="lineNum"> 377 </span> : : /* Still need to deal with it, we've only acked it now. */</a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;reboot = true;</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : </a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 3 : if (rc) {</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX message\n&quot;);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : }</a>
+<a name="384"><span class="lineNum"> 384 </span> : : </a>
+<a name="385"><span class="lineNum"> 385 </span> : : /*</a>
+<a name="386"><span class="lineNum"> 386 </span> : : * Use a lower timeout - there is strong evidence to suggest the</a>
+<a name="387"><span class="lineNum"> 387 </span> : : * BMC won't respond, don't waste time spinning here just have the</a>
+<a name="388"><span class="lineNum"> 388 </span> : : * high levels retry when the BMC might be back</a>
+<a name="389"><span class="lineNum"> 389 </span> : : */</a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 3 : rc = wait_for_bmc(mbox_flash, 3);</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 3 : return rc;</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : }</a>
+<a name="396"><span class="lineNum"> 396 </span> : : </a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 394 : static int do_acks(struct mbox_flash_data *mbox_flash)</span></a>
+<a name="398"><span class="lineNum"> 398 </span> : : {</a>
+<a name="399"><span class="lineNum"> 399 </span> : : int rc;</a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 394 : if (!mbox_flash-&gt;ack)</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 391 : return 0; /* Nothing to do */</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 3 : rc = mbox_flash_ack(mbox_flash, bmc_mbox_get_attn_reg() &amp; MBOX_ATTN_ACK_MASK);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 3 : if (!rc)</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;ack = false;</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 3 : return rc;</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : }</a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 202 : static void mbox_flash_do_nop(struct mbox_flash_data *mbox_flash __unused,</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : struct bmc_mbox_msg *msg __unused)</a>
+<a name="413"><span class="lineNum"> 413 </span> : : {</a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 202 : }</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineNoCov"> 0 : static void mbox_flash_do_illegal(struct mbox_flash_data *mbox_flash __unused,</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : struct bmc_mbox_msg *msg __unused)</a>
+<a name="418"><span class="lineNum"> 418 </span> : : {</a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : prlog(PR_CRIT, &quot;Got response to unknown message type\n&quot;);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : </a>
+<a name="422"><span class="lineNum"> 422 </span> : : /* Version 1, 2 and 3 compatible */</a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 4 : static void mbox_flash_do_get_mbox_info(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="424"><span class="lineNum"> 424 </span> : : struct bmc_mbox_msg *msg)</a>
+<a name="425"><span class="lineNum"> 425 </span> : : {</a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;version = msg_get_u8(msg, 0);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 4 : switch (mbox_flash-&gt;version) {</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 1 : case 1:</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : /* Not all version 1 daemons set argument 5 correctly */</a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;shift = 12; /* Protocol hardcodes to 4K anyway */</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;read.size = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 1));</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;write.size = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 3));</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineCov"> 3 : case 3:</span></a>
+<a name="436"><span class="lineNum"> 436 </span> : : case 2:</a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;shift = msg_get_u8(msg, 5);</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;timeout = msg_get_u16(msg, 6);</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 3 : if (mbox_flash-&gt;timeout == 0)</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;timeout = MBOX_DEFAULT_TIMEOUT;</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 3 : break;</span></a>
+<a name="442"><span class="lineNum"> 442 </span> : : }</a>
+<a name="443"><span class="lineNum"> 443 </span> : : /* Callers will handle the case where the version is not known</a>
+<a name="444"><span class="lineNum"> 444 </span> : : *</a>
+<a name="445"><span class="lineNum"> 445 </span> : : * Here we deliberately ignore the 'default' sizes.</a>
+<a name="446"><span class="lineNum"> 446 </span> : : * All windows opened will not provide a hint and we're</a>
+<a name="447"><span class="lineNum"> 447 </span> : : * happy to let the BMC figure everything out.</a>
+<a name="448"><span class="lineNum"> 448 </span> : : * Future optimisations may use the default size.</a>
+<a name="449"><span class="lineNum"> 449 </span> : : */</a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : </a>
+<a name="452"><span class="lineNum"> 452 </span> : : /* Version 2 and 3 compatible */</a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 3 : static void mbox_flash_do_get_flash_info(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : struct bmc_mbox_msg *msg)</a>
+<a name="455"><span class="lineNum"> 455 </span> : : {</a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;total_size = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 0));</span></a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;erase_granule = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 2));</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 3 : }</span></a>
+<a name="459"><span class="lineNum"> 459 </span> : : </a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 1 : static void mbox_flash_do_get_flash_info_v1(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : struct bmc_mbox_msg *msg)</a>
+<a name="462"><span class="lineNum"> 462 </span> : : {</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;total_size = msg_get_u32(msg, 0);</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;erase_granule = msg_get_u32(msg, 4);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : </a>
+<a name="467"><span class="lineNum"> 467 </span> : : /* Version 2 and 3 compatible */</a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 471 : static void mbox_flash_do_create_read_window(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="469"><span class="lineNum"> 469 </span> : : struct bmc_mbox_msg *msg)</a>
+<a name="470"><span class="lineNum"> 470 </span> : : {</a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 471 : mbox_flash-&gt;read.lpc_addr = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 0));</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 471 : mbox_flash-&gt;read.size = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 2));</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 471 : mbox_flash-&gt;read.cur_pos = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 4));</span></a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 471 : mbox_flash-&gt;read.open = true;</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineCov"> 471 : mbox_flash-&gt;write.open = false;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 471 : }</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : </a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 164 : static void mbox_flash_do_create_read_window_v1(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="479"><span class="lineNum"> 479 </span> : : struct bmc_mbox_msg *msg)</a>
+<a name="480"><span class="lineNum"> 480 </span> : : {</a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineCov"> 164 : mbox_flash-&gt;read.lpc_addr = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 0));</span></a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 164 : mbox_flash-&gt;read.open = true;</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 164 : mbox_flash-&gt;write.open = false;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 164 : }</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> : : /* Version 2 and 3 compatible */</a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 72 : static void mbox_flash_do_create_write_window(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : struct bmc_mbox_msg *msg)</a>
+<a name="489"><span class="lineNum"> 489 </span> : : {</a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 72 : mbox_flash-&gt;write.lpc_addr = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 0));</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 72 : mbox_flash-&gt;write.size = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 2));</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 72 : mbox_flash-&gt;write.cur_pos = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 4));</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 72 : mbox_flash-&gt;write.open = true;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 72 : mbox_flash-&gt;read.open = false;</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineCov"> 72 : }</span></a>
+<a name="496"><span class="lineNum"> 496 </span> : : </a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 23 : static void mbox_flash_do_create_write_window_v1(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : struct bmc_mbox_msg *msg)</a>
+<a name="499"><span class="lineNum"> 499 </span> : : {</a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineCov"> 23 : mbox_flash-&gt;write.lpc_addr = blocks_to_bytes(mbox_flash, msg_get_u16(msg, 0));</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 23 : mbox_flash-&gt;write.open = true;</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 23 : mbox_flash-&gt;read.open = false;</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 23 : }</span></a>
+<a name="504"><span class="lineNum"> 504 </span> : : </a>
+<a name="505"><span class="lineNum"> 505 </span> : : /* Version 1 and Version 2 compatible */</a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : static void mbox_flash_do_close_window(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="507"><span class="lineNum"> 507 </span> : : struct bmc_mbox_msg *msg __unused)</a>
+<a name="508"><span class="lineNum"> 508 </span> : : {</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;read.open = false;</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;write.open = false;</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 3 : static int handle_reboot(struct mbox_flash_data *mbox_flash)</span></a>
+<a name="514"><span class="lineNum"> 514 </span> : : {</a>
+<a name="515"><span class="lineNum"> 515 </span> : : int rc;</a>
+<a name="516"><span class="lineNum"> 516 </span> : : </a>
+<a name="517"><span class="lineNum"> 517 </span> : : /*</a>
+<a name="518"><span class="lineNum"> 518 </span> : : * If the BMC ready bit isn't present then we're basically</a>
+<a name="519"><span class="lineNum"> 519 </span> : : * guaranteed to timeout trying to talk to it so just fail</a>
+<a name="520"><span class="lineNum"> 520 </span> : : * whatever is trying to happen.</a>
+<a name="521"><span class="lineNum"> 521 </span> : : * Importantly, we can't trust that the presence of the bit means</a>
+<a name="522"><span class="lineNum"> 522 </span> : : * the daemon is ok - don't assume it is going to respond at all</a>
+<a name="523"><span class="lineNum"> 523 </span> : : * from here onwards</a>
+<a name="524"><span class="lineNum"> 524 </span> : : */</a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineCov"> 3 : if (!(bmc_mbox_get_attn_reg() &amp; MBOX_ATTN_BMC_DAEMON_READY))</span></a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> : : /* Clear this first so msg_send() doesn't freak out */</a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;reboot = false;</span></a>
+<a name="530"><span class="lineNum"> 530 </span> : : </a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 3 : rc = do_acks(mbox_flash);</span></a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineCov"> 3 : if (rc) {</span></a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineNoCov"> 0 : if (rc == MBOX_R_TIMEOUT)</span></a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_AGAIN;</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;reboot = true;</span></a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : }</a>
+<a name="538"><span class="lineNum"> 538 </span> : : </a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineCov"> 3 : rc = protocol_init(mbox_flash, 0);</span></a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;reboot = true;</span></a>
+<a name="542"><span class="lineNum"> 542 </span> : : </a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 3 : return rc;</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : }</a>
+<a name="545"><span class="lineNum"> 545 </span> : : </a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineCov"> 391 : static bool do_delayed_work(struct mbox_flash_data *mbox_flash)</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : {</a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineCov"> 785 : return is_paused(mbox_flash) || do_acks(mbox_flash) ||</span></a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 394 : (is_reboot(mbox_flash) &amp;&amp; handle_reboot(mbox_flash));</span></a>
+<a name="550"><span class="lineNum"> 550 </span> : : }</a>
+<a name="551"><span class="lineNum"> 551 </span> : : </a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineCov"> 99 : static int mbox_flash_mark_write(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="553"><span class="lineNum"> 553 </span> : : uint64_t pos, uint64_t len, int type)</a>
+<a name="554"><span class="lineNum"> 554 </span> : : {</a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineCov"> 99 : struct bmc_mbox_msg msg = MSG_CREATE(type);</span></a>
+<a name="556"><span class="lineNum"> 556 </span> : : int rc;</a>
+<a name="557"><span class="lineNum"> 557 </span> : : </a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 99 : if (mbox_flash-&gt;version == 1) {</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 24 : uint32_t start = ALIGN_DOWN(pos, 1 &lt;&lt; mbox_flash-&gt;shift);</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineCov"> 24 : msg_put_u16(&amp;msg, 0, bytes_to_blocks(mbox_flash, pos));</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : /*</a>
+<a name="562"><span class="lineNum"> 562 </span> : : * We need to make sure that we mark dirty until up to atleast</a>
+<a name="563"><span class="lineNum"> 563 </span> : : * pos + len.</a>
+<a name="564"><span class="lineNum"> 564 </span> : : */</a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineCov"> 24 : msg_put_u32(&amp;msg, 2, pos + len - start);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> : : } else {</a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineCov"> 75 : uint64_t window_pos = pos - mbox_flash-&gt;write.cur_pos;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineCov"> 75 : uint16_t start = bytes_to_blocks(mbox_flash, window_pos);</span></a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineCov"> 75 : uint16_t end = bytes_to_blocks(mbox_flash,</span></a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineCov"> 75 : ALIGN_UP(window_pos + len,</span></a>
+<a name="571"><span class="lineNum"> 571 </span> : : 1 &lt;&lt; mbox_flash-&gt;shift));</a>
+<a name="572"><span class="lineNum"> 572 </span> : : </a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineCov"> 75 : msg_put_u16(&amp;msg, 0, start);</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineCov"> 75 : msg_put_u16(&amp;msg, 2, end - start); /* Total Length */</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : }</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineCov"> 99 : rc = msg_send(mbox_flash, &amp;msg, mbox_flash-&gt;timeout);</span></a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineCov"> 99 : if (rc) {</span></a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX message\n&quot;);</span></a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="581"><span class="lineNum"> 581 </span> : : }</a>
+<a name="582"><span class="lineNum"> 582 </span> : : </a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineCov"> 99 : rc = wait_for_bmc(mbox_flash, mbox_flash-&gt;timeout);</span></a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineCov"> 99 : if (rc)</span></a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : </a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 99 : return rc;</span></a>
+<a name="588"><span class="lineNum"> 588 </span> : : }</a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 96 : static int mbox_flash_dirty(struct mbox_flash_data *mbox_flash, uint64_t pos,</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : uint64_t len)</a>
+<a name="592"><span class="lineNum"> 592 </span> : : {</a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 96 : if (!mbox_flash-&gt;write.open) {</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Attempting to dirty without an open write window\n&quot;);</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_DEVICE_GONE;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : }</a>
+<a name="597"><span class="lineNum"> 597 </span> : : </a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineCov"> 96 : return mbox_flash_mark_write(mbox_flash, pos, len,</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : MBOX_C_MARK_WRITE_DIRTY);</a>
+<a name="600"><span class="lineNum"> 600 </span> : : }</a>
+<a name="601"><span class="lineNum"> 601 </span> : : </a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 3 : static int mbox_flash_erase(struct mbox_flash_data *mbox_flash, uint64_t pos,</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : uint64_t len)</a>
+<a name="604"><span class="lineNum"> 604 </span> : : {</a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineCov"> 3 : if (!mbox_flash-&gt;write.open) {</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Attempting to erase without an open write window\n&quot;);</span></a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_DEVICE_GONE;</span></a>
+<a name="608"><span class="lineNum"> 608 </span> : : }</a>
+<a name="609"><span class="lineNum"> 609 </span> : : </a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineCov"> 3 : return mbox_flash_mark_write(mbox_flash, pos, len,</span></a>
+<a name="611"><span class="lineNum"> 611 </span> : : MBOX_C_MARK_WRITE_ERASED);</a>
+<a name="612"><span class="lineNum"> 612 </span> : : }</a>
+<a name="613"><span class="lineNum"> 613 </span> : : </a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 99 : static int mbox_flash_flush(struct mbox_flash_data *mbox_flash)</span></a>
+<a name="615"><span class="lineNum"> 615 </span> : : {</a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineCov"> 99 : struct bmc_mbox_msg msg = MSG_CREATE(MBOX_C_WRITE_FLUSH);</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : int rc;</a>
+<a name="618"><span class="lineNum"> 618 </span> : : </a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineCov"> 99 : if (!mbox_flash-&gt;write.open) {</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Attempting to flush without an open write window\n&quot;);</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_DEVICE_GONE;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : }</a>
+<a name="623"><span class="lineNum"> 623 </span> : : </a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineCov"> 99 : rc = msg_send(mbox_flash, &amp;msg, mbox_flash-&gt;timeout);</span></a>
+<a name="625"><span class="lineNum"> 625 </span> :<span class="lineCov"> 99 : if (rc) {</span></a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX message\n&quot;);</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : }</a>
+<a name="629"><span class="lineNum"> 629 </span> : : </a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 99 : rc = wait_for_bmc(mbox_flash, mbox_flash-&gt;timeout);</span></a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 99 : if (rc)</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="633"><span class="lineNum"> 633 </span> : : </a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 99 : return rc;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : }</a>
+<a name="636"><span class="lineNum"> 636 </span> : : </a>
+<a name="637"><span class="lineNum"> 637 </span> : : /* Is the current window able perform the complete operation */</a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineCov"> 762 : static bool mbox_window_valid(struct lpc_window *win, uint64_t pos,</span></a>
+<a name="639"><span class="lineNum"> 639 </span> : : uint64_t len)</a>
+<a name="640"><span class="lineNum"> 640 </span> : : {</a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineCov"> 762 : if (!win-&gt;open)</span></a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineCov"> 16 : return false;</span></a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineCov"> 746 : if (pos &lt; win-&gt;cur_pos) /* start */</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineCov"> 177 : return false;</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 569 : if ((pos + len) &gt; (win-&gt;cur_pos + win-&gt;size)) /* end */</span></a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineCov"> 541 : return false;</span></a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 28 : return true;</span></a>
+<a name="648"><span class="lineNum"> 648 </span> : : }</a>
+<a name="649"><span class="lineNum"> 649 </span> : : </a>
+<a name="650"><span class="lineNum"> 650 </span> :<span class="lineCov"> 762 : static int mbox_window_move(struct mbox_flash_data *mbox_flash,</span></a>
+<a name="651"><span class="lineNum"> 651 </span> : : struct lpc_window *win, uint8_t command,</a>
+<a name="652"><span class="lineNum"> 652 </span> : : uint64_t pos, uint64_t len, uint64_t *size)</a>
+<a name="653"><span class="lineNum"> 653 </span> : : {</a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 762 : struct bmc_mbox_msg msg = MSG_CREATE(command);</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : int rc;</a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* Is the window currently open valid */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineCov"> 762 : if (mbox_window_valid(win, pos, len)) {</span></a>
+<a name="659"><span class="lineNum"> 659 </span> :<span class="lineCov"> 28 : *size = len;</span></a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineCov"> 28 : return 0;</span></a>
+<a name="661"><span class="lineNum"> 661 </span> : : }</a>
+<a name="662"><span class="lineNum"> 662 </span> : : </a>
+<a name="663"><span class="lineNum"> 663 </span> : : /* V1 needs to remember where it has opened the window, note it</a>
+<a name="664"><span class="lineNum"> 664 </span> : : * here.</a>
+<a name="665"><span class="lineNum"> 665 </span> : : * If we're running V2 the response to the CREATE_*_WINDOW command</a>
+<a name="666"><span class="lineNum"> 666 </span> : : * will overwrite what we've noted here.</a>
+<a name="667"><span class="lineNum"> 667 </span> : : */</a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 734 : win-&gt;cur_pos = pos &amp; ~mbox_flash_mask(mbox_flash);</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : </a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineCov"> 734 : msg_put_u16(&amp;msg, 0, bytes_to_blocks(mbox_flash, pos));</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineCov"> 734 : rc = msg_send(mbox_flash, &amp;msg, mbox_flash-&gt;timeout);</span></a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineCov"> 734 : if (rc) {</span></a>
+<a name="673"><span class="lineNum"> 673 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX message\n&quot;);</span></a>
+<a name="674"><span class="lineNum"> 674 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="675"><span class="lineNum"> 675 </span> : : }</a>
+<a name="676"><span class="lineNum"> 676 </span> : : </a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineCov"> 734 : mbox_flash-&gt;read.open = false;</span></a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineCov"> 734 : mbox_flash-&gt;write.open = false;</span></a>
+<a name="679"><span class="lineNum"> 679 </span> : : </a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineCov"> 734 : rc = wait_for_bmc(mbox_flash, mbox_flash-&gt;timeout);</span></a>
+<a name="681"><span class="lineNum"> 681 </span> :<span class="lineCov"> 734 : if (rc) {</span></a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 4 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="684"><span class="lineNum"> 684 </span> : : }</a>
+<a name="685"><span class="lineNum"> 685 </span> : : </a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineCov"> 730 : *size = len;</span></a>
+<a name="687"><span class="lineNum"> 687 </span> : : /* Is length past the end of the window? */</a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineCov"> 730 : if ((pos + len) &gt; (win-&gt;cur_pos + win-&gt;size))</span></a>
+<a name="689"><span class="lineNum"> 689 </span> : : /* Adjust size to meet current window */</a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineCov"> 372 : *size = (win-&gt;cur_pos + win-&gt;size) - pos;</span></a>
+<a name="691"><span class="lineNum"> 691 </span> : : </a>
+<a name="692"><span class="lineNum"> 692 </span> : : /*</a>
+<a name="693"><span class="lineNum"> 693 </span> : : * It doesn't make sense for size to be zero if len isn't zero.</a>
+<a name="694"><span class="lineNum"> 694 </span> : : * If this condition happens we're most likely going to spin since</a>
+<a name="695"><span class="lineNum"> 695 </span> : : * the caller will likely decerement pos by zero then call this</a>
+<a name="696"><span class="lineNum"> 696 </span> : : * again.</a>
+<a name="697"><span class="lineNum"> 697 </span> : : * Debateable as to if this should return non zero. At least the</a>
+<a name="698"><span class="lineNum"> 698 </span> : : * bug will be obvious from the barf.</a>
+<a name="699"><span class="lineNum"> 699 </span> : : */</a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 730 : if (len != 0 &amp;&amp; *size == 0) {</span></a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed read/write!\n&quot;);</span></a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Please update your BMC firmware\n&quot;);</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Move window is indicating size zero!\n&quot;);</span></a>
+<a name="704"><span class="lineNum"> 704 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;pos: 0x%&quot; PRIx64 &quot;, len: 0x%&quot; PRIx64 &quot;\n&quot;, pos, len);</span></a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;win pos: 0x%08x win size: 0x%08x\n&quot;, win-&gt;cur_pos, win-&gt;size);</span></a>
+<a name="706"><span class="lineNum"> 706 </span> : : /*</a>
+<a name="707"><span class="lineNum"> 707 </span> : : * In practice skiboot gets stuck and this eventually</a>
+<a name="708"><span class="lineNum"> 708 </span> : : * brings down the host. Just fail pass the error back</a>
+<a name="709"><span class="lineNum"> 709 </span> : : * up and hope someone makes a good decision</a>
+<a name="710"><span class="lineNum"> 710 </span> : : */</a>
+<a name="711"><span class="lineNum"> 711 </span> :<span class="lineNoCov"> 0 : return MBOX_R_SYSTEM_ERROR;</span></a>
+<a name="712"><span class="lineNum"> 712 </span> : : }</a>
+<a name="713"><span class="lineNum"> 713 </span> : : </a>
+<a name="714"><span class="lineNum"> 714 </span> :<span class="lineCov"> 730 : return rc;</span></a>
+<a name="715"><span class="lineNum"> 715 </span> : : }</a>
+<a name="716"><span class="lineNum"> 716 </span> : : </a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 20 : static int mbox_flash_write(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="718"><span class="lineNum"> 718 </span> : : const void *buf, uint64_t len)</a>
+<a name="719"><span class="lineNum"> 719 </span> : : {</a>
+<a name="720"><span class="lineNum"> 720 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="721"><span class="lineNum"> 721 </span> : : uint64_t size;</a>
+<a name="722"><span class="lineNum"> 722 </span> : : </a>
+<a name="723"><span class="lineNum"> 723 </span> :<span class="lineCov"> 20 : int rc = 0;</span></a>
+<a name="724"><span class="lineNum"> 724 </span> : : </a>
+<a name="725"><span class="lineNum"> 725 </span> : : /* LPC is only 32bit */</a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineCov"> 20 : if (pos &gt; UINT_MAX || len &gt; UINT_MAX)</span></a>
+<a name="727"><span class="lineNum"> 727 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="728"><span class="lineNum"> 728 </span> : : </a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineCov"> 20 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> :<span class="lineCov"> 20 : if (do_delayed_work(mbox_flash))</span></a>
+<a name="732"><span class="lineNum"> 732 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="733"><span class="lineNum"> 733 </span> : : </a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineCov"> 20 : prlog(PR_TRACE, &quot;Flash write at %#&quot; PRIx64 &quot; for %#&quot; PRIx64 &quot;\n&quot;, pos, len);</span></a>
+<a name="735"><span class="lineNum"> 735 </span> :<span class="lineCov"> 116 : while (len &gt; 0) {</span></a>
+<a name="736"><span class="lineNum"> 736 </span> : : /* Move window and get a new size to read */</a>
+<a name="737"><span class="lineNum"> 737 </span> :<span class="lineCov"> 96 : rc = mbox_window_move(mbox_flash, &amp;mbox_flash-&gt;write,</span></a>
+<a name="738"><span class="lineNum"> 738 </span> : : MBOX_C_CREATE_WRITE_WINDOW, pos, len,</a>
+<a name="739"><span class="lineNum"> 739 </span> : : &amp;size);</a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 96 : if (rc)</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="742"><span class="lineNum"> 742 </span> : : </a>
+<a name="743"><span class="lineNum"> 743 </span> : : /* Perform the read for this window */</a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineCov"> 96 : rc = lpc_window_write(mbox_flash, pos, buf, size);</span></a>
+<a name="745"><span class="lineNum"> 745 </span> :<span class="lineCov"> 96 : if (rc)</span></a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="747"><span class="lineNum"> 747 </span> : : </a>
+<a name="748"><span class="lineNum"> 748 </span> :<span class="lineCov"> 96 : rc = mbox_flash_dirty(mbox_flash, pos, size);</span></a>
+<a name="749"><span class="lineNum"> 749 </span> :<span class="lineCov"> 96 : if (rc)</span></a>
+<a name="750"><span class="lineNum"> 750 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="751"><span class="lineNum"> 751 </span> : : </a>
+<a name="752"><span class="lineNum"> 752 </span> : : /*</a>
+<a name="753"><span class="lineNum"> 753 </span> : : * Must flush here as changing the window contents</a>
+<a name="754"><span class="lineNum"> 754 </span> : : * without flushing entitles the BMC to throw away the</a>
+<a name="755"><span class="lineNum"> 755 </span> : : * data. Unlike the read case there isn't a need to explicitly</a>
+<a name="756"><span class="lineNum"> 756 </span> : : * validate the window, the flush command will fail if the</a>
+<a name="757"><span class="lineNum"> 757 </span> : : * window was compromised.</a>
+<a name="758"><span class="lineNum"> 758 </span> : : */</a>
+<a name="759"><span class="lineNum"> 759 </span> :<span class="lineCov"> 96 : rc = mbox_flash_flush(mbox_flash);</span></a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineCov"> 96 : if (rc)</span></a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="762"><span class="lineNum"> 762 </span> : : </a>
+<a name="763"><span class="lineNum"> 763 </span> :<span class="lineCov"> 96 : len -= size;</span></a>
+<a name="764"><span class="lineNum"> 764 </span> :<span class="lineCov"> 96 : pos += size;</span></a>
+<a name="765"><span class="lineNum"> 765 </span> :<span class="lineCov"> 96 : buf += size;</span></a>
+<a name="766"><span class="lineNum"> 766 </span> : : }</a>
+<a name="767"><span class="lineNum"> 767 </span> :<span class="lineCov"> 20 : return rc;</span></a>
+<a name="768"><span class="lineNum"> 768 </span> : : }</a>
+<a name="769"><span class="lineNum"> 769 </span> : : </a>
+<a name="770"><span class="lineNum"> 770 </span> :<span class="lineCov"> 367 : static int mbox_flash_read(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="771"><span class="lineNum"> 771 </span> : : void *buf, uint64_t len)</a>
+<a name="772"><span class="lineNum"> 772 </span> : : {</a>
+<a name="773"><span class="lineNum"> 773 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="774"><span class="lineNum"> 774 </span> : : uint64_t size;</a>
+<a name="775"><span class="lineNum"> 775 </span> : : </a>
+<a name="776"><span class="lineNum"> 776 </span> :<span class="lineCov"> 367 : int rc = 0;</span></a>
+<a name="777"><span class="lineNum"> 777 </span> : : </a>
+<a name="778"><span class="lineNum"> 778 </span> : : /* LPC is only 32bit */</a>
+<a name="779"><span class="lineNum"> 779 </span> :<span class="lineCov"> 367 : if (pos &gt; UINT_MAX || len &gt; UINT_MAX)</span></a>
+<a name="780"><span class="lineNum"> 780 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 367 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : </a>
+<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 367 : if (do_delayed_work(mbox_flash))</span></a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="786"><span class="lineNum"> 786 </span> : : </a>
+<a name="787"><span class="lineNum"> 787 </span> :<span class="lineCov"> 367 : prlog(PR_TRACE, &quot;Flash read at %#&quot; PRIx64 &quot; for %#&quot; PRIx64 &quot;\n&quot;, pos, len);</span></a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineCov"> 1026 : while (len &gt; 0) {</span></a>
+<a name="789"><span class="lineNum"> 789 </span> : : /* Move window and get a new size to read */</a>
+<a name="790"><span class="lineNum"> 790 </span> :<span class="lineCov"> 663 : rc = mbox_window_move(mbox_flash, &amp;mbox_flash-&gt;read,</span></a>
+<a name="791"><span class="lineNum"> 791 </span> : : MBOX_C_CREATE_READ_WINDOW, pos,</a>
+<a name="792"><span class="lineNum"> 792 </span> : : len, &amp;size);</a>
+<a name="793"><span class="lineNum"> 793 </span> :<span class="lineCov"> 663 : if (rc)</span></a>
+<a name="794"><span class="lineNum"> 794 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="795"><span class="lineNum"> 795 </span> : : </a>
+<a name="796"><span class="lineNum"> 796 </span> : : /* Perform the read for this window */</a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineCov"> 659 : rc = lpc_window_read(mbox_flash, pos, buf, size);</span></a>
+<a name="798"><span class="lineNum"> 798 </span> :<span class="lineCov"> 659 : if (rc)</span></a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="800"><span class="lineNum"> 800 </span> : : </a>
+<a name="801"><span class="lineNum"> 801 </span> :<span class="lineCov"> 659 : len -= size;</span></a>
+<a name="802"><span class="lineNum"> 802 </span> :<span class="lineCov"> 659 : pos += size;</span></a>
+<a name="803"><span class="lineNum"> 803 </span> :<span class="lineCov"> 659 : buf += size;</span></a>
+<a name="804"><span class="lineNum"> 804 </span> : : /*</a>
+<a name="805"><span class="lineNum"> 805 </span> : : * Ensure my window is still open, if it isn't we can't trust</a>
+<a name="806"><span class="lineNum"> 806 </span> : : * what we read</a>
+<a name="807"><span class="lineNum"> 807 </span> : : */</a>
+<a name="808"><span class="lineNum"> 808 </span> :<span class="lineCov"> 659 : if (!is_valid(mbox_flash, &amp;mbox_flash-&gt;read))</span></a>
+<a name="809"><span class="lineNum"> 809 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="810"><span class="lineNum"> 810 </span> : : }</a>
+<a name="811"><span class="lineNum"> 811 </span> :<span class="lineCov"> 363 : return rc;</span></a>
+<a name="812"><span class="lineNum"> 812 </span> : : }</a>
+<a name="813"><span class="lineNum"> 813 </span> : : </a>
+<a name="814"><span class="lineNum"> 814 </span> :<span class="lineCov"> 1 : static bool mbox_flash_reset(struct blocklevel_device *bl)</span></a>
+<a name="815"><span class="lineNum"> 815 </span> : : {</a>
+<a name="816"><span class="lineNum"> 816 </span> : : int rc;</a>
+<a name="817"><span class="lineNum"> 817 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 1 : struct bmc_mbox_msg msg = MSG_CREATE(MBOX_C_RESET_STATE);</span></a>
+<a name="819"><span class="lineNum"> 819 </span> : : </a>
+<a name="820"><span class="lineNum"> 820 </span> :<span class="lineCov"> 1 : prlog(PR_NOTICE, &quot;MBOX reset\n&quot;);</span></a>
+<a name="821"><span class="lineNum"> 821 </span> :<span class="lineCov"> 1 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="822"><span class="lineNum"> 822 </span> : : </a>
+<a name="823"><span class="lineNum"> 823 </span> :<span class="lineCov"> 1 : rc = msg_send(mbox_flash, &amp;msg, mbox_flash-&gt;timeout);</span></a>
+<a name="824"><span class="lineNum"> 824 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="825"><span class="lineNum"> 825 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX RESET msg\n&quot;);</span></a>
+<a name="826"><span class="lineNum"> 826 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="827"><span class="lineNum"> 827 </span> : : }</a>
+<a name="828"><span class="lineNum"> 828 </span> :<span class="lineCov"> 1 : if (wait_for_bmc(mbox_flash, mbox_flash-&gt;timeout)) {</span></a>
+<a name="829"><span class="lineNum"> 829 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="830"><span class="lineNum"> 830 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="831"><span class="lineNum"> 831 </span> : : }</a>
+<a name="832"><span class="lineNum"> 832 </span> : : </a>
+<a name="833"><span class="lineNum"> 833 </span> :<span class="lineCov"> 1 : return true;</span></a>
+<a name="834"><span class="lineNum"> 834 </span> : : }</a>
+<a name="835"><span class="lineNum"> 835 </span> : : </a>
+<a name="836"><span class="lineNum"> 836 </span> :<span class="lineCov"> 4 : static int mbox_flash_get_info(struct blocklevel_device *bl, const char **name,</span></a>
+<a name="837"><span class="lineNum"> 837 </span> : : uint64_t *total_size, uint32_t *erase_granule)</a>
+<a name="838"><span class="lineNum"> 838 </span> : : {</a>
+<a name="839"><span class="lineNum"> 839 </span> :<span class="lineCov"> 4 : struct bmc_mbox_msg msg = MSG_CREATE(MBOX_C_GET_FLASH_INFO);</span></a>
+<a name="840"><span class="lineNum"> 840 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="841"><span class="lineNum"> 841 </span> : : int rc;</a>
+<a name="842"><span class="lineNum"> 842 </span> : : </a>
+<a name="843"><span class="lineNum"> 843 </span> :<span class="lineCov"> 4 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="844"><span class="lineNum"> 844 </span> : : </a>
+<a name="845"><span class="lineNum"> 845 </span> :<span class="lineCov"> 4 : if (do_delayed_work(mbox_flash))</span></a>
+<a name="846"><span class="lineNum"> 846 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_AGAIN;</span></a>
+<a name="847"><span class="lineNum"> 847 </span> : : </a>
+<a name="848"><span class="lineNum"> 848 </span> : : /*</a>
+<a name="849"><span class="lineNum"> 849 </span> : : * We want to avoid runtime mallocs in skiboot. The expected</a>
+<a name="850"><span class="lineNum"> 850 </span> : : * behavour to uses of libflash is that one can free() the memory</a>
+<a name="851"><span class="lineNum"> 851 </span> : : * returned.</a>
+<a name="852"><span class="lineNum"> 852 </span> : : * NULL will do for now.</a>
+<a name="853"><span class="lineNum"> 853 </span> : : */</a>
+<a name="854"><span class="lineNum"> 854 </span> :<span class="lineCov"> 4 : if (name)</span></a>
+<a name="855"><span class="lineNum"> 855 </span> :<span class="lineCov"> 4 : *name = NULL;</span></a>
+<a name="856"><span class="lineNum"> 856 </span> : : </a>
+<a name="857"><span class="lineNum"> 857 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;busy = true;</span></a>
+<a name="858"><span class="lineNum"> 858 </span> :<span class="lineCov"> 4 : rc = msg_send(mbox_flash, &amp;msg, mbox_flash-&gt;timeout);</span></a>
+<a name="859"><span class="lineNum"> 859 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="860"><span class="lineNum"> 860 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX message\n&quot;);</span></a>
+<a name="861"><span class="lineNum"> 861 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="862"><span class="lineNum"> 862 </span> : : }</a>
+<a name="863"><span class="lineNum"> 863 </span> : : </a>
+<a name="864"><span class="lineNum"> 864 </span> :<span class="lineCov"> 4 : if (wait_for_bmc(mbox_flash, mbox_flash-&gt;timeout)) {</span></a>
+<a name="865"><span class="lineNum"> 865 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="866"><span class="lineNum"> 866 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="867"><span class="lineNum"> 867 </span> : : }</a>
+<a name="868"><span class="lineNum"> 868 </span> : : </a>
+<a name="869"><span class="lineNum"> 869 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;bl.erase_mask = mbox_flash-&gt;erase_granule - 1;</span></a>
+<a name="870"><span class="lineNum"> 870 </span> : : </a>
+<a name="871"><span class="lineNum"> 871 </span> :<span class="lineCov"> 4 : if (total_size)</span></a>
+<a name="872"><span class="lineNum"> 872 </span> :<span class="lineCov"> 4 : *total_size = mbox_flash-&gt;total_size;</span></a>
+<a name="873"><span class="lineNum"> 873 </span> :<span class="lineCov"> 4 : if (erase_granule)</span></a>
+<a name="874"><span class="lineNum"> 874 </span> :<span class="lineCov"> 4 : *erase_granule = mbox_flash-&gt;erase_granule;</span></a>
+<a name="875"><span class="lineNum"> 875 </span> : : </a>
+<a name="876"><span class="lineNum"> 876 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="877"><span class="lineNum"> 877 </span> : : }</a>
+<a name="878"><span class="lineNum"> 878 </span> : : </a>
+<a name="879"><span class="lineNum"> 879 </span> :<span class="lineCov"> 3 : static int mbox_flash_erase_v2(struct blocklevel_device *bl, uint64_t pos,</span></a>
+<a name="880"><span class="lineNum"> 880 </span> : : uint64_t len)</a>
+<a name="881"><span class="lineNum"> 881 </span> : : {</a>
+<a name="882"><span class="lineNum"> 882 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="883"><span class="lineNum"> 883 </span> : : </a>
+<a name="884"><span class="lineNum"> 884 </span> : : /* LPC is only 32bit */</a>
+<a name="885"><span class="lineNum"> 885 </span> :<span class="lineCov"> 3 : if (pos &gt; UINT_MAX || len &gt; UINT_MAX)</span></a>
+<a name="886"><span class="lineNum"> 886 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="887"><span class="lineNum"> 887 </span> : : </a>
+<a name="888"><span class="lineNum"> 888 </span> :<span class="lineCov"> 3 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="889"><span class="lineNum"> 889 </span> : : </a>
+<a name="890"><span class="lineNum"> 890 </span> :<span class="lineCov"> 3 : prlog(PR_TRACE, &quot;Flash erase at 0x%08x for 0x%08x\n&quot;, (u32) pos, (u32) len);</span></a>
+<a name="891"><span class="lineNum"> 891 </span> :<span class="lineCov"> 6 : while (len &gt; 0) {</span></a>
+<a name="892"><span class="lineNum"> 892 </span> : : uint64_t size;</a>
+<a name="893"><span class="lineNum"> 893 </span> : : int rc;</a>
+<a name="894"><span class="lineNum"> 894 </span> : : </a>
+<a name="895"><span class="lineNum"> 895 </span> : : /* Move window and get a new size to erase */</a>
+<a name="896"><span class="lineNum"> 896 </span> :<span class="lineCov"> 3 : rc = mbox_window_move(mbox_flash, &amp;mbox_flash-&gt;write,</span></a>
+<a name="897"><span class="lineNum"> 897 </span> : : MBOX_C_CREATE_WRITE_WINDOW, pos, len, &amp;size);</a>
+<a name="898"><span class="lineNum"> 898 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="899"><span class="lineNum"> 899 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="900"><span class="lineNum"> 900 </span> : : </a>
+<a name="901"><span class="lineNum"> 901 </span> :<span class="lineCov"> 3 : rc = mbox_flash_erase(mbox_flash, pos, size);</span></a>
+<a name="902"><span class="lineNum"> 902 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="903"><span class="lineNum"> 903 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="904"><span class="lineNum"> 904 </span> : : </a>
+<a name="905"><span class="lineNum"> 905 </span> : : /*</a>
+<a name="906"><span class="lineNum"> 906 </span> : : * Flush directly, don't mark that region dirty otherwise it</a>
+<a name="907"><span class="lineNum"> 907 </span> : : * isn't clear if a write happened there or not</a>
+<a name="908"><span class="lineNum"> 908 </span> : : */</a>
+<a name="909"><span class="lineNum"> 909 </span> : : </a>
+<a name="910"><span class="lineNum"> 910 </span> :<span class="lineCov"> 3 : rc = mbox_flash_flush(mbox_flash);</span></a>
+<a name="911"><span class="lineNum"> 911 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="912"><span class="lineNum"> 912 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="913"><span class="lineNum"> 913 </span> : : </a>
+<a name="914"><span class="lineNum"> 914 </span> :<span class="lineCov"> 3 : len -= size;</span></a>
+<a name="915"><span class="lineNum"> 915 </span> :<span class="lineCov"> 3 : pos += size;</span></a>
+<a name="916"><span class="lineNum"> 916 </span> : : }</a>
+<a name="917"><span class="lineNum"> 917 </span> : : </a>
+<a name="918"><span class="lineNum"> 918 </span> :<span class="lineCov"> 3 : return 0;</span></a>
+<a name="919"><span class="lineNum"> 919 </span> : : }</a>
+<a name="920"><span class="lineNum"> 920 </span> : : </a>
+<a name="921"><span class="lineNum"> 921 </span> :<span class="lineCov"> 1 : static int mbox_flash_erase_v1(struct blocklevel_device *bl __unused,</span></a>
+<a name="922"><span class="lineNum"> 922 </span> : : uint64_t pos __unused, uint64_t len __unused)</a>
+<a name="923"><span class="lineNum"> 923 </span> : : {</a>
+<a name="924"><span class="lineNum"> 924 </span> : : /*</a>
+<a name="925"><span class="lineNum"> 925 </span> : : * We can probably get away with doing nothing.</a>
+<a name="926"><span class="lineNum"> 926 </span> : : * TODO: Rethink this, causes interesting behaviour in pflash.</a>
+<a name="927"><span class="lineNum"> 927 </span> : : * Users do expect pflash -{e,E} to do something. This is because</a>
+<a name="928"><span class="lineNum"> 928 </span> : : * on real flash this would have set that region to all 0xFF but</a>
+<a name="929"><span class="lineNum"> 929 </span> : : * really the erase at the blocklevel interface was only designed</a>
+<a name="930"><span class="lineNum"> 930 </span> : : * to be &quot;please make this region writeable&quot;.</a>
+<a name="931"><span class="lineNum"> 931 </span> : : * It may be wise (despite the large performance penalty) to</a>
+<a name="932"><span class="lineNum"> 932 </span> : : * actually write all 0xFF here. I'll leave that as an exercise</a>
+<a name="933"><span class="lineNum"> 933 </span> : : * for the future.</a>
+<a name="934"><span class="lineNum"> 934 </span> : : */</a>
+<a name="935"><span class="lineNum"> 935 </span> : : </a>
+<a name="936"><span class="lineNum"> 936 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="937"><span class="lineNum"> 937 </span> : : }</a>
+<a name="938"><span class="lineNum"> 938 </span> : : </a>
+<a name="939"><span class="lineNum"> 939 </span> : : /* Called from interrupt handler, don't send any mbox messages */</a>
+<a name="940"><span class="lineNum"> 940 </span> :<span class="lineCov"> 3 : static void mbox_flash_attn(uint8_t attn, void *priv)</span></a>
+<a name="941"><span class="lineNum"> 941 </span> : : {</a>
+<a name="942"><span class="lineNum"> 942 </span> :<span class="lineCov"> 3 : struct mbox_flash_data *mbox_flash = priv;</span></a>
+<a name="943"><span class="lineNum"> 943 </span> : : </a>
+<a name="944"><span class="lineNum"> 944 </span> :<span class="lineCov"> 3 : if (attn &amp; MBOX_ATTN_ACK_MASK)</span></a>
+<a name="945"><span class="lineNum"> 945 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;ack = true;</span></a>
+<a name="946"><span class="lineNum"> 946 </span> :<span class="lineCov"> 3 : if (attn &amp; MBOX_ATTN_BMC_REBOOT) {</span></a>
+<a name="947"><span class="lineNum"> 947 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;reboot = true;</span></a>
+<a name="948"><span class="lineNum"> 948 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;read.open = false;</span></a>
+<a name="949"><span class="lineNum"> 949 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;write.open = false;</span></a>
+<a name="950"><span class="lineNum"> 950 </span> :<span class="lineCov"> 3 : attn &amp;= ~MBOX_ATTN_BMC_REBOOT;</span></a>
+<a name="951"><span class="lineNum"> 951 </span> : : }</a>
+<a name="952"><span class="lineNum"> 952 </span> : : </a>
+<a name="953"><span class="lineNum"> 953 </span> :<span class="lineCov"> 3 : if (attn &amp; MBOX_ATTN_BMC_WINDOW_RESET) {</span></a>
+<a name="954"><span class="lineNum"> 954 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;read.open = false;</span></a>
+<a name="955"><span class="lineNum"> 955 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;write.open = false;</span></a>
+<a name="956"><span class="lineNum"> 956 </span> :<span class="lineNoCov"> 0 : attn &amp;= ~MBOX_ATTN_BMC_WINDOW_RESET;</span></a>
+<a name="957"><span class="lineNum"> 957 </span> : : }</a>
+<a name="958"><span class="lineNum"> 958 </span> : : </a>
+<a name="959"><span class="lineNum"> 959 </span> :<span class="lineCov"> 3 : if (attn &amp; MBOX_ATTN_BMC_FLASH_LOST) {</span></a>
+<a name="960"><span class="lineNum"> 960 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;pause = true;</span></a>
+<a name="961"><span class="lineNum"> 961 </span> :<span class="lineNoCov"> 0 : attn &amp;= ~MBOX_ATTN_BMC_FLASH_LOST;</span></a>
+<a name="962"><span class="lineNum"> 962 </span> : : } else {</a>
+<a name="963"><span class="lineNum"> 963 </span> :<span class="lineCov"> 3 : mbox_flash-&gt;pause = false;</span></a>
+<a name="964"><span class="lineNum"> 964 </span> : : }</a>
+<a name="965"><span class="lineNum"> 965 </span> :<span class="lineCov"> 3 : }</span></a>
+<a name="966"><span class="lineNum"> 966 </span> : : </a>
+<a name="967"><span class="lineNum"> 967 </span> :<span class="lineCov"> 944 : static void mbox_flash_callback(struct bmc_mbox_msg *msg, void *priv)</span></a>
+<a name="968"><span class="lineNum"> 968 </span> : : {</a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineCov"> 944 : struct mbox_flash_data *mbox_flash = priv;</span></a>
+<a name="970"><span class="lineNum"> 970 </span> : : </a>
+<a name="971"><span class="lineNum"> 971 </span> :<span class="lineCov"> 944 : prlog(PR_TRACE, &quot;BMC OK command %u\n&quot;, msg-&gt;command);</span></a>
+<a name="972"><span class="lineNum"> 972 </span> : : </a>
+<a name="973"><span class="lineNum"> 973 </span> :<span class="lineCov"> 944 : if (msg-&gt;response != MBOX_R_SUCCESS) {</span></a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 4 : prlog(PR_ERR, &quot;Bad response code from BMC %d\n&quot;, msg-&gt;response);</span></a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;rc = msg-&gt;response;</span></a>
+<a name="976"><span class="lineNum"> 976 </span> :<span class="lineCov"> 4 : goto out;</span></a>
+<a name="977"><span class="lineNum"> 977 </span> : : }</a>
+<a name="978"><span class="lineNum"> 978 </span> : : </a>
+<a name="979"><span class="lineNum"> 979 </span> :<span class="lineCov"> 940 : if (msg-&gt;command &gt; MBOX_COMMAND_COUNT) {</span></a>
+<a name="980"><span class="lineNum"> 980 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Got response to unknown command %02x\n&quot;, msg-&gt;command);</span></a>
+<a name="981"><span class="lineNum"> 981 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;rc = -1;</span></a>
+<a name="982"><span class="lineNum"> 982 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="983"><span class="lineNum"> 983 </span> : : }</a>
+<a name="984"><span class="lineNum"> 984 </span> : : </a>
+<a name="985"><span class="lineNum"> 985 </span> :<span class="lineCov"> 940 : if (!mbox_flash-&gt;handlers[msg-&gt;command]) {</span></a>
+<a name="986"><span class="lineNum"> 986 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Couldn't find handler for message! command: %u, seq: %u\n&quot;,</span></a>
+<a name="987"><span class="lineNum"> 987 </span> : : msg-&gt;command, msg-&gt;seq);</a>
+<a name="988"><span class="lineNum"> 988 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;rc = MBOX_R_SYSTEM_ERROR;</span></a>
+<a name="989"><span class="lineNum"> 989 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="990"><span class="lineNum"> 990 </span> : : }</a>
+<a name="991"><span class="lineNum"> 991 </span> : : </a>
+<a name="992"><span class="lineNum"> 992 </span> :<span class="lineCov"> 940 : mbox_flash-&gt;rc = 0;</span></a>
+<a name="993"><span class="lineNum"> 993 </span> : : </a>
+<a name="994"><span class="lineNum"> 994 </span> :<span class="lineCov"> 940 : mbox_flash-&gt;handlers[msg-&gt;command](mbox_flash, msg);</span></a>
+<a name="995"><span class="lineNum"> 995 </span> : : </a>
+<a name="996"><span class="lineNum"> 996 </span> :<span class="lineCov"> 944 : out:</span></a>
+<a name="997"><span class="lineNum"> 997 </span> :<span class="lineCov"> 944 : mbox_flash-&gt;busy = false;</span></a>
+<a name="998"><span class="lineNum"> 998 </span> :<span class="lineCov"> 944 : }</span></a>
+<a name="999"><span class="lineNum"> 999 </span> : : </a>
+<a name="1000"><span class="lineNum"> 1000 </span> :<span class="lineCov"> 4 : static int protocol_init(struct mbox_flash_data *mbox_flash, uint8_t shift)</span></a>
+<a name="1001"><span class="lineNum"> 1001 </span> : : {</a>
+<a name="1002"><span class="lineNum"> 1002 </span> :<span class="lineCov"> 4 : struct bmc_mbox_msg msg = MSG_CREATE(MBOX_C_GET_MBOX_INFO);</span></a>
+<a name="1003"><span class="lineNum"> 1003 </span> : : int rc;</a>
+<a name="1004"><span class="lineNum"> 1004 </span> : : </a>
+<a name="1005"><span class="lineNum"> 1005 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;read.open = false;</span></a>
+<a name="1006"><span class="lineNum"> 1006 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;write.open = false;</span></a>
+<a name="1007"><span class="lineNum"> 1007 </span> : : </a>
+<a name="1008"><span class="lineNum"> 1008 </span> : : /* Assume V2+ */</a>
+<a name="1009"><span class="lineNum"> 1009 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;bl.read = &amp;mbox_flash_read;</span></a>
+<a name="1010"><span class="lineNum"> 1010 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;bl.write = &amp;mbox_flash_write;</span></a>
+<a name="1011"><span class="lineNum"> 1011 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;bl.erase = &amp;mbox_flash_erase_v2;</span></a>
+<a name="1012"><span class="lineNum"> 1012 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;bl.get_info = &amp;mbox_flash_get_info;</span></a>
+<a name="1013"><span class="lineNum"> 1013 </span> : : </a>
+<a name="1014"><span class="lineNum"> 1014 </span> : : /* Assume V3 */</a>
+<a name="1015"><span class="lineNum"> 1015 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;handlers = handlers_v3;</span></a>
+<a name="1016"><span class="lineNum"> 1016 </span> : : </a>
+<a name="1017"><span class="lineNum"> 1017 </span> :<span class="lineCov"> 4 : bmc_mbox_register_callback(&amp;mbox_flash_callback, mbox_flash);</span></a>
+<a name="1018"><span class="lineNum"> 1018 </span> :<span class="lineCov"> 4 : bmc_mbox_register_attn(&amp;mbox_flash_attn, mbox_flash);</span></a>
+<a name="1019"><span class="lineNum"> 1019 </span> : : </a>
+<a name="1020"><span class="lineNum"> 1020 </span> : : /*</a>
+<a name="1021"><span class="lineNum"> 1021 </span> : : * For V1 of the protocol this is fixed.</a>
+<a name="1022"><span class="lineNum"> 1022 </span> : : * V2+: The init code will update this</a>
+<a name="1023"><span class="lineNum"> 1023 </span> : : */</a>
+<a name="1024"><span class="lineNum"> 1024 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;shift = 12;</span></a>
+<a name="1025"><span class="lineNum"> 1025 </span> : : </a>
+<a name="1026"><span class="lineNum"> 1026 </span> : : /*</a>
+<a name="1027"><span class="lineNum"> 1027 </span> : : * For V1 we'll use this value.</a>
+<a name="1028"><span class="lineNum"> 1028 </span> : : * V2+: The init code (may) update this</a>
+<a name="1029"><span class="lineNum"> 1029 </span> : : */</a>
+<a name="1030"><span class="lineNum"> 1030 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;timeout = MBOX_DEFAULT_TIMEOUT;</span></a>
+<a name="1031"><span class="lineNum"> 1031 </span> : : </a>
+<a name="1032"><span class="lineNum"> 1032 </span> : : /*</a>
+<a name="1033"><span class="lineNum"> 1033 </span> : : * Always attempt init with highest version known.</a>
+<a name="1034"><span class="lineNum"> 1034 </span> : : * The GET_MBOX_INFO response will confirm that the other side can</a>
+<a name="1035"><span class="lineNum"> 1035 </span> : : * talk the highest version, we'll update this variable then if</a>
+<a name="1036"><span class="lineNum"> 1036 </span> : : * our highest version is not supported</a>
+<a name="1037"><span class="lineNum"> 1037 </span> : : */</a>
+<a name="1038"><span class="lineNum"> 1038 </span> :<span class="lineCov"> 4 : mbox_flash-&gt;version = 3;</span></a>
+<a name="1039"><span class="lineNum"> 1039 </span> : : </a>
+<a name="1040"><span class="lineNum"> 1040 </span> :<span class="lineCov"> 4 : negotiate_version:</span></a>
+<a name="1041"><span class="lineNum"> 1041 </span> :<span class="lineCov"> 4 : msg_put_u8(&amp;msg, 0, mbox_flash-&gt;version);</span></a>
+<a name="1042"><span class="lineNum"> 1042 </span> :<span class="lineCov"> 4 : msg_put_u8(&amp;msg, 1, shift);</span></a>
+<a name="1043"><span class="lineNum"> 1043 </span> :<span class="lineCov"> 4 : rc = msg_send(mbox_flash, &amp;msg, mbox_flash-&gt;timeout);</span></a>
+<a name="1044"><span class="lineNum"> 1044 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="1045"><span class="lineNum"> 1045 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX message\n&quot;);</span></a>
+<a name="1046"><span class="lineNum"> 1046 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="1047"><span class="lineNum"> 1047 </span> : : }</a>
+<a name="1048"><span class="lineNum"> 1048 </span> : : </a>
+<a name="1049"><span class="lineNum"> 1049 </span> :<span class="lineCov"> 4 : rc = wait_for_bmc(mbox_flash, mbox_flash-&gt;timeout);</span></a>
+<a name="1050"><span class="lineNum"> 1050 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="1051"><span class="lineNum"> 1051 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="1052"><span class="lineNum"> 1052 </span> :<span class="lineNoCov"> 0 : if (mbox_flash-&gt;version &gt; 1) {</span></a>
+<a name="1053"><span class="lineNum"> 1053 </span> :<span class="lineNoCov"> 0 : mbox_flash-&gt;version--;</span></a>
+<a name="1054"><span class="lineNum"> 1054 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;Retrying MBOX negotiation with BMC&quot;</span></a>
+<a name="1055"><span class="lineNum"> 1055 </span> : : &quot; with MBOXv%d\n&quot;, mbox_flash-&gt;version);</a>
+<a name="1056"><span class="lineNum"> 1056 </span> :<span class="lineNoCov"> 0 : goto negotiate_version;</span></a>
+<a name="1057"><span class="lineNum"> 1057 </span> : : }</a>
+<a name="1058"><span class="lineNum"> 1058 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="1059"><span class="lineNum"> 1059 </span> : : }</a>
+<a name="1060"><span class="lineNum"> 1060 </span> : : </a>
+<a name="1061"><span class="lineNum"> 1061 </span> :<span class="lineCov"> 4 : prlog(PR_INFO, &quot;Detected mbox protocol version %d\n&quot;, mbox_flash-&gt;version);</span></a>
+<a name="1062"><span class="lineNum"> 1062 </span> :<span class="lineCov"> 4 : switch (mbox_flash-&gt;version) {</span></a>
+<a name="1063"><span class="lineNum"> 1063 </span> :<span class="lineCov"> 1 : case 1:</span></a>
+<a name="1064"><span class="lineNum"> 1064 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;bl.erase = &amp;mbox_flash_erase_v1;</span></a>
+<a name="1065"><span class="lineNum"> 1065 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;handlers = handlers_v1;</span></a>
+<a name="1066"><span class="lineNum"> 1066 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="1067"><span class="lineNum"> 1067 </span> :<span class="lineCov"> 2 : case 2:</span></a>
+<a name="1068"><span class="lineNum"> 1068 </span> :<span class="lineCov"> 2 : mbox_flash-&gt;handlers = handlers_v2;</span></a>
+<a name="1069"><span class="lineNum"> 1069 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="1070"><span class="lineNum"> 1070 </span> :<span class="lineCov"> 1 : case 3:</span></a>
+<a name="1071"><span class="lineNum"> 1071 </span> : : /* Nothing to do we assumed it would be V3 */</a>
+<a name="1072"><span class="lineNum"> 1072 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="1073"><span class="lineNum"> 1073 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="1074"><span class="lineNum"> 1074 </span> : : /*</a>
+<a name="1075"><span class="lineNum"> 1075 </span> : : * The BMC is can only lower the requested version not do</a>
+<a name="1076"><span class="lineNum"> 1076 </span> : : * anything else. FWIW there is no verion 0.</a>
+<a name="1077"><span class="lineNum"> 1077 </span> : : */</a>
+<a name="1078"><span class="lineNum"> 1078 </span> :<span class="lineNoCov"> 0 : prlog(PR_CRIT, &quot;Bad version: %u\n&quot;, mbox_flash-&gt;version);</span></a>
+<a name="1079"><span class="lineNum"> 1079 </span> :<span class="lineNoCov"> 0 : rc = FLASH_ERR_PARM_ERROR;</span></a>
+<a name="1080"><span class="lineNum"> 1080 </span> : : }</a>
+<a name="1081"><span class="lineNum"> 1081 </span> : : </a>
+<a name="1082"><span class="lineNum"> 1082 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="1083"><span class="lineNum"> 1083 </span> : : }</a>
+<a name="1084"><span class="lineNum"> 1084 </span> : : </a>
+<a name="1085"><span class="lineNum"> 1085 </span> :<span class="lineNoCov"> 0 : int mbox_flash_lock(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="1086"><span class="lineNum"> 1086 </span> : : {</a>
+<a name="1087"><span class="lineNum"> 1087 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="1088"><span class="lineNum"> 1088 </span> :<span class="lineNoCov"> 0 : struct bmc_mbox_msg msg = MSG_CREATE(MBOX_C_MARK_LOCKED);</span></a>
+<a name="1089"><span class="lineNum"> 1089 </span> : : int rc;</a>
+<a name="1090"><span class="lineNum"> 1090 </span> : : </a>
+<a name="1091"><span class="lineNum"> 1091 </span> : : /* mbox-flash only talks 32bit for now */</a>
+<a name="1092"><span class="lineNum"> 1092 </span> :<span class="lineNoCov"> 0 : if (pos &gt; UINT_MAX || len &gt; UINT_MAX)</span></a>
+<a name="1093"><span class="lineNum"> 1093 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="1094"><span class="lineNum"> 1094 </span> : : </a>
+<a name="1095"><span class="lineNum"> 1095 </span> : : /*</a>
+<a name="1096"><span class="lineNum"> 1096 </span> : : * If the region isn't at least 4k aligned and in size then bail</a>
+<a name="1097"><span class="lineNum"> 1097 </span> : : * out, the protocol won't allow for smaller block sizes.</a>
+<a name="1098"><span class="lineNum"> 1098 </span> : : */</a>
+<a name="1099"><span class="lineNum"> 1099 </span> :<span class="lineNoCov"> 0 : if (pos &amp; ((1 &lt;&lt; 12) - 1) || len &amp; ((1 &lt;&lt; 12) - 1))</span></a>
+<a name="1100"><span class="lineNum"> 1100 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="1101"><span class="lineNum"> 1101 </span> : : </a>
+<a name="1102"><span class="lineNum"> 1102 </span> :<span class="lineNoCov"> 0 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="1103"><span class="lineNum"> 1103 </span> :<span class="lineNoCov"> 0 : if ((pos &amp; mbox_flash_mask(mbox_flash)) || (len &amp; mbox_flash_mask(mbox_flash))) {</span></a>
+<a name="1104"><span class="lineNum"> 1104 </span> :<span class="lineNoCov"> 0 : uint8_t shift = 0;</span></a>
+<a name="1105"><span class="lineNum"> 1105 </span> : : /*</a>
+<a name="1106"><span class="lineNum"> 1106 </span> : : * The current block size won't work for locking the requested</a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : * region must reinit.</a>
+<a name="1108"><span class="lineNum"> 1108 </span> : : */</a>
+<a name="1109"><span class="lineNum"> 1109 </span> :<span class="lineNoCov"> 0 : while (!((1 &lt;&lt; shift) &amp; pos) &amp;&amp; !((1 &lt;&lt; shift) &amp; len))</span></a>
+<a name="1110"><span class="lineNum"> 1110 </span> :<span class="lineNoCov"> 0 : shift++;</span></a>
+<a name="1111"><span class="lineNum"> 1111 </span> : : </a>
+<a name="1112"><span class="lineNum"> 1112 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;Locking flash requires re-init from shift of %d to shift of %d\n&quot;,</span></a>
+<a name="1113"><span class="lineNum"> 1113 </span> : : mbox_flash-&gt;shift, shift);</a>
+<a name="1114"><span class="lineNum"> 1114 </span> : : </a>
+<a name="1115"><span class="lineNum"> 1115 </span> :<span class="lineNoCov"> 0 : rc = protocol_init(mbox_flash, shift);</span></a>
+<a name="1116"><span class="lineNum"> 1116 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="1117"><span class="lineNum"> 1117 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="1118"><span class="lineNum"> 1118 </span> : : </a>
+<a name="1119"><span class="lineNum"> 1119 </span> : : /*</a>
+<a name="1120"><span class="lineNum"> 1120 </span> : : * The daemon didn't agree with the requested shift - the</a>
+<a name="1121"><span class="lineNum"> 1121 </span> : : * flash won't be able to be locked</a>
+<a name="1122"><span class="lineNum"> 1122 </span> : : */</a>
+<a name="1123"><span class="lineNum"> 1123 </span> :<span class="lineNoCov"> 0 : if (mbox_flash-&gt;shift &gt; shift)</span></a>
+<a name="1124"><span class="lineNum"> 1124 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="1125"><span class="lineNum"> 1125 </span> : : }</a>
+<a name="1126"><span class="lineNum"> 1126 </span> : : </a>
+<a name="1127"><span class="lineNum"> 1127 </span> :<span class="lineNoCov"> 0 : msg_put_u16(&amp;msg, 0, bytes_to_blocks(mbox_flash, pos));</span></a>
+<a name="1128"><span class="lineNum"> 1128 </span> :<span class="lineNoCov"> 0 : msg_put_u16(&amp;msg, 2, bytes_to_blocks(mbox_flash, len));</span></a>
+<a name="1129"><span class="lineNum"> 1129 </span> :<span class="lineNoCov"> 0 : rc = msg_send(mbox_flash, &amp;msg, mbox_flash-&gt;timeout);</span></a>
+<a name="1130"><span class="lineNum"> 1130 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="1131"><span class="lineNum"> 1131 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to enqueue/send BMC MBOX message\n&quot;);</span></a>
+<a name="1132"><span class="lineNum"> 1132 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="1133"><span class="lineNum"> 1133 </span> : : }</a>
+<a name="1134"><span class="lineNum"> 1134 </span> : : </a>
+<a name="1135"><span class="lineNum"> 1135 </span> :<span class="lineNoCov"> 0 : rc = wait_for_bmc(mbox_flash, mbox_flash-&gt;timeout);</span></a>
+<a name="1136"><span class="lineNum"> 1136 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="1137"><span class="lineNum"> 1137 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Error waiting for BMC\n&quot;);</span></a>
+<a name="1138"><span class="lineNum"> 1138 </span> : : </a>
+<a name="1139"><span class="lineNum"> 1139 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="1140"><span class="lineNum"> 1140 </span> : : }</a>
+<a name="1141"><span class="lineNum"> 1141 </span> : : </a>
+<a name="1142"><span class="lineNum"> 1142 </span> :<span class="lineCov"> 1 : int mbox_flash_init(struct blocklevel_device **bl)</span></a>
+<a name="1143"><span class="lineNum"> 1143 </span> : : {</a>
+<a name="1144"><span class="lineNum"> 1144 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="1145"><span class="lineNum"> 1145 </span> : : int rc;</a>
+<a name="1146"><span class="lineNum"> 1146 </span> : : </a>
+<a name="1147"><span class="lineNum"> 1147 </span> : : CHECK_HANDLER_SIZE(handlers_v3);</a>
+<a name="1148"><span class="lineNum"> 1148 </span> : : CHECK_HANDLER_SIZE(handlers_v2);</a>
+<a name="1149"><span class="lineNum"> 1149 </span> : : CHECK_HANDLER_SIZE(handlers_v1);</a>
+<a name="1150"><span class="lineNum"> 1150 </span> : : </a>
+<a name="1151"><span class="lineNum"> 1151 </span> :<span class="lineCov"> 1 : if (!bl)</span></a>
+<a name="1152"><span class="lineNum"> 1152 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="1153"><span class="lineNum"> 1153 </span> : : </a>
+<a name="1154"><span class="lineNum"> 1154 </span> : : /* XXX: We only support one blocklevel flash device over mbox. If we</a>
+<a name="1155"><span class="lineNum"> 1155 </span> : : * ever support more than one, move this out. The chances of that are</a>
+<a name="1156"><span class="lineNum"> 1156 </span> : : * slim though due to circumstances.</a>
+<a name="1157"><span class="lineNum"> 1157 </span> : : */</a>
+<a name="1158"><span class="lineNum"> 1158 </span> :<span class="lineCov"> 1 : mbox_init();</span></a>
+<a name="1159"><span class="lineNum"> 1159 </span> : : </a>
+<a name="1160"><span class="lineNum"> 1160 </span> :<span class="lineCov"> 1 : *bl = NULL;</span></a>
+<a name="1161"><span class="lineNum"> 1161 </span> : : </a>
+<a name="1162"><span class="lineNum"> 1162 </span> :<span class="lineCov"> 1 : mbox_flash = zalloc(sizeof(struct mbox_flash_data));</span></a>
+<a name="1163"><span class="lineNum"> 1163 </span> :<span class="lineCov"> 1 : if (!mbox_flash)</span></a>
+<a name="1164"><span class="lineNum"> 1164 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_MALLOC_FAILED;</span></a>
+<a name="1165"><span class="lineNum"> 1165 </span> : : </a>
+<a name="1166"><span class="lineNum"> 1166 </span> : : /* Assume V2+ */</a>
+<a name="1167"><span class="lineNum"> 1167 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;bl.read = &amp;mbox_flash_read;</span></a>
+<a name="1168"><span class="lineNum"> 1168 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;bl.write = &amp;mbox_flash_write;</span></a>
+<a name="1169"><span class="lineNum"> 1169 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;bl.erase = &amp;mbox_flash_erase_v2;</span></a>
+<a name="1170"><span class="lineNum"> 1170 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;bl.get_info = &amp;mbox_flash_get_info;</span></a>
+<a name="1171"><span class="lineNum"> 1171 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;bl.exit = &amp;mbox_flash_exit;</span></a>
+<a name="1172"><span class="lineNum"> 1172 </span> : : </a>
+<a name="1173"><span class="lineNum"> 1173 </span> :<span class="lineCov"> 1 : if (bmc_mbox_get_attn_reg() &amp; MBOX_ATTN_BMC_REBOOT)</span></a>
+<a name="1174"><span class="lineNum"> 1174 </span> :<span class="lineNoCov"> 0 : rc = handle_reboot(mbox_flash);</span></a>
+<a name="1175"><span class="lineNum"> 1175 </span> : : else</a>
+<a name="1176"><span class="lineNum"> 1176 </span> :<span class="lineCov"> 1 : rc = protocol_init(mbox_flash, 0);</span></a>
+<a name="1177"><span class="lineNum"> 1177 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="1178"><span class="lineNum"> 1178 </span> :<span class="lineNoCov"> 0 : free(mbox_flash);</span></a>
+<a name="1179"><span class="lineNum"> 1179 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="1180"><span class="lineNum"> 1180 </span> : : }</a>
+<a name="1181"><span class="lineNum"> 1181 </span> : : </a>
+<a name="1182"><span class="lineNum"> 1182 </span> :<span class="lineCov"> 1 : mbox_flash-&gt;bl.keep_alive = 0;</span></a>
+<a name="1183"><span class="lineNum"> 1183 </span> : : </a>
+<a name="1184"><span class="lineNum"> 1184 </span> :<span class="lineCov"> 1 : *bl = &amp;(mbox_flash-&gt;bl);</span></a>
+<a name="1185"><span class="lineNum"> 1185 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="1186"><span class="lineNum"> 1186 </span> : : }</a>
+<a name="1187"><span class="lineNum"> 1187 </span> : : </a>
+<a name="1188"><span class="lineNum"> 1188 </span> :<span class="lineCov"> 1 : bool mbox_flash_exit(struct blocklevel_device *bl)</span></a>
+<a name="1189"><span class="lineNum"> 1189 </span> : : {</a>
+<a name="1190"><span class="lineNum"> 1190 </span> :<span class="lineCov"> 1 : bool status = true;</span></a>
+<a name="1191"><span class="lineNum"> 1191 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="1192"><span class="lineNum"> 1192 </span> :<span class="lineCov"> 1 : if (bl) {</span></a>
+<a name="1193"><span class="lineNum"> 1193 </span> :<span class="lineCov"> 1 : status = mbox_flash_reset(bl);</span></a>
+<a name="1194"><span class="lineNum"> 1194 </span> :<span class="lineCov"> 1 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="1195"><span class="lineNum"> 1195 </span> :<span class="lineCov"> 1 : free(mbox_flash);</span></a>
+<a name="1196"><span class="lineNum"> 1196 </span> : : }</a>
+<a name="1197"><span class="lineNum"> 1197 </span> : : </a>
+<a name="1198"><span class="lineNum"> 1198 </span> :<span class="lineCov"> 1 : return status;</span></a>
+<a name="1199"><span class="lineNum"> 1199 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/index-sort-b.html b/coverage-report/libflash/test/index-sort-b.html
new file mode 100644
index 0000000..0775b45
--- /dev/null
+++ b/coverage-report/libflash/test/index-sort-b.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libflash/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1368</td>
+ <td class="headerCovTableEntry">1851</td>
+ <td class="headerCovTableEntryLo">73.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntry">125</td>
+ <td class="headerCovTableEntryHi">95.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-blocklevel.c.gcov.html">test-blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=41 height=10 alt="40.8%"><img src="../../snow.png" width=59 height=10 alt="40.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.8&nbsp;%</td>
+ <td class="coverNumLo">160 / 392</td>
+ <td class="coverPerLo">60.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=88 height=10 alt="88.4%"><img src="../../snow.png" width=12 height=10 alt="88.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.4&nbsp;%</td>
+ <td class="coverNumMed">38 / 43</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">10 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-mbox.c.gcov.html">test-mbox.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=62 height=10 alt="61.8%"><img src="../../snow.png" width=38 height=10 alt="61.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.8&nbsp;%</td>
+ <td class="coverNumLo">94 / 152</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-server.c.gcov.html">mbox-server.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=83 height=10 alt="83.1%"><img src="../../snow.png" width=17 height=10 alt="83.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">83.1&nbsp;%</td>
+ <td class="coverNumMed">212 / 255</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">19 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ecc.c.gcov.html">test-ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=51 height=10 alt="51.1%"><img src="../../snow.png" width=49 height=10 alt="51.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.1&nbsp;%</td>
+ <td class="coverNumLo">45 / 88</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ipmi-hiomap.c.gcov.html">test-ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.7%"><img src="../../snow.png" width=2 height=10 alt="97.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.7&nbsp;%</td>
+ <td class="coverNumHi">646 / 661</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">69 / 69</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-flash.c.gcov.html">test-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=67 height=10 alt="66.5%"><img src="../../snow.png" width=33 height=10 alt="66.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.5&nbsp;%</td>
+ <td class="coverNumLo">173 / 260</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/index-sort-f.html b/coverage-report/libflash/test/index-sort-f.html
new file mode 100644
index 0000000..4e3b4d8
--- /dev/null
+++ b/coverage-report/libflash/test/index-sort-f.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libflash/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1368</td>
+ <td class="headerCovTableEntry">1851</td>
+ <td class="headerCovTableEntryLo">73.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntry">125</td>
+ <td class="headerCovTableEntryHi">95.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-blocklevel.c.gcov.html">test-blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=41 height=10 alt="40.8%"><img src="../../snow.png" width=59 height=10 alt="40.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.8&nbsp;%</td>
+ <td class="coverNumLo">160 / 392</td>
+ <td class="coverPerLo">60.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=88 height=10 alt="88.4%"><img src="../../snow.png" width=12 height=10 alt="88.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.4&nbsp;%</td>
+ <td class="coverNumMed">38 / 43</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">10 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ecc.c.gcov.html">test-ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=51 height=10 alt="51.1%"><img src="../../snow.png" width=49 height=10 alt="51.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.1&nbsp;%</td>
+ <td class="coverNumLo">45 / 88</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-mbox.c.gcov.html">test-mbox.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=62 height=10 alt="61.8%"><img src="../../snow.png" width=38 height=10 alt="61.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.8&nbsp;%</td>
+ <td class="coverNumLo">94 / 152</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-flash.c.gcov.html">test-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=67 height=10 alt="66.5%"><img src="../../snow.png" width=33 height=10 alt="66.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.5&nbsp;%</td>
+ <td class="coverNumLo">173 / 260</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-server.c.gcov.html">mbox-server.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=83 height=10 alt="83.1%"><img src="../../snow.png" width=17 height=10 alt="83.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">83.1&nbsp;%</td>
+ <td class="coverNumMed">212 / 255</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">19 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ipmi-hiomap.c.gcov.html">test-ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.7%"><img src="../../snow.png" width=2 height=10 alt="97.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.7&nbsp;%</td>
+ <td class="coverNumHi">646 / 661</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">69 / 69</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/index-sort-l.html b/coverage-report/libflash/test/index-sort-l.html
new file mode 100644
index 0000000..02ceb42
--- /dev/null
+++ b/coverage-report/libflash/test/index-sort-l.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libflash/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1368</td>
+ <td class="headerCovTableEntry">1851</td>
+ <td class="headerCovTableEntryLo">73.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntry">125</td>
+ <td class="headerCovTableEntryHi">95.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-blocklevel.c.gcov.html">test-blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=41 height=10 alt="40.8%"><img src="../../snow.png" width=59 height=10 alt="40.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.8&nbsp;%</td>
+ <td class="coverNumLo">160 / 392</td>
+ <td class="coverPerLo">60.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ecc.c.gcov.html">test-ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=51 height=10 alt="51.1%"><img src="../../snow.png" width=49 height=10 alt="51.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.1&nbsp;%</td>
+ <td class="coverNumLo">45 / 88</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-mbox.c.gcov.html">test-mbox.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=62 height=10 alt="61.8%"><img src="../../snow.png" width=38 height=10 alt="61.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.8&nbsp;%</td>
+ <td class="coverNumLo">94 / 152</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-flash.c.gcov.html">test-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=67 height=10 alt="66.5%"><img src="../../snow.png" width=33 height=10 alt="66.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.5&nbsp;%</td>
+ <td class="coverNumLo">173 / 260</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-server.c.gcov.html">mbox-server.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=83 height=10 alt="83.1%"><img src="../../snow.png" width=17 height=10 alt="83.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">83.1&nbsp;%</td>
+ <td class="coverNumMed">212 / 255</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">19 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=88 height=10 alt="88.4%"><img src="../../snow.png" width=12 height=10 alt="88.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.4&nbsp;%</td>
+ <td class="coverNumMed">38 / 43</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">10 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ipmi-hiomap.c.gcov.html">test-ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.7%"><img src="../../snow.png" width=2 height=10 alt="97.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.7&nbsp;%</td>
+ <td class="coverNumHi">646 / 661</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">69 / 69</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/index.html b/coverage-report/libflash/test/index.html
new file mode 100644
index 0000000..296d16e
--- /dev/null
+++ b/coverage-report/libflash/test/index.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libflash/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">1368</td>
+ <td class="headerCovTableEntry">1851</td>
+ <td class="headerCovTableEntryLo">73.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntry">125</td>
+ <td class="headerCovTableEntryHi">95.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="mbox-server.c.gcov.html">mbox-server.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=83 height=10 alt="83.1%"><img src="../../snow.png" width=17 height=10 alt="83.1%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">83.1&nbsp;%</td>
+ <td class="coverNumMed">212 / 255</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">19 / 19</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stubs.c.gcov.html">stubs.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=88 height=10 alt="88.4%"><img src="../../snow.png" width=12 height=10 alt="88.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">88.4&nbsp;%</td>
+ <td class="coverNumMed">38 / 43</td>
+ <td class="coverPerMed">83.3&nbsp;%</td>
+ <td class="coverNumMed">10 / 12</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-blocklevel.c.gcov.html">test-blocklevel.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=41 height=10 alt="40.8%"><img src="../../snow.png" width=59 height=10 alt="40.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">40.8&nbsp;%</td>
+ <td class="coverNumLo">160 / 392</td>
+ <td class="coverPerLo">60.0&nbsp;%</td>
+ <td class="coverNumLo">6 / 10</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ecc.c.gcov.html">test-ecc.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=51 height=10 alt="51.1%"><img src="../../snow.png" width=49 height=10 alt="51.1%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">51.1&nbsp;%</td>
+ <td class="coverNumLo">45 / 88</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-flash.c.gcov.html">test-flash.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=67 height=10 alt="66.5%"><img src="../../snow.png" width=33 height=10 alt="66.5%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">66.5&nbsp;%</td>
+ <td class="coverNumLo">173 / 260</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">11 / 11</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-ipmi-hiomap.c.gcov.html">test-ipmi-hiomap.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=98 height=10 alt="97.7%"><img src="../../snow.png" width=2 height=10 alt="97.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.7&nbsp;%</td>
+ <td class="coverNumHi">646 / 661</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">69 / 69</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="test-mbox.c.gcov.html">test-mbox.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../ruby.png" width=62 height=10 alt="61.8%"><img src="../../snow.png" width=38 height=10 alt="61.8%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">61.8&nbsp;%</td>
+ <td class="coverNumLo">94 / 152</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/mbox-server.c.func-sort-c.html b/coverage-report/libflash/test/mbox-server.c.func-sort-c.html
new file mode 100644
index 0000000..2883fc1
--- /dev/null
+++ b/coverage-report/libflash/test/mbox-server.c.func-sort-c.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/mbox-server.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - mbox-server.c<span style="font-size: 80%;"> (<a href="mbox-server.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">212</td>
+ <td class="headerCovTableEntry">255</td>
+ <td class="headerCovTableEntryMed">83.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="mbox-server.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#509">mbox_server_destroy</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#485">mbox_server_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#464">mbox_server_reset</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#143">bmc_mbox_register_attn</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#156">bmc_mbox_register_callback</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#454">mbox_server_erase_granule</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#443">mbox_server_memset</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#448">mbox_server_total_size</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#151">bmc_mbox_get_attn_reg</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#459">mbox_server_version</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#438">mbox_server_memcmp</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#186">do_dirty</a></td>
+ <td class="coverFnHi">120</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#164">close_window</a></td>
+ <td class="coverFnHi">734</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#213">open_window</a></td>
+ <td class="coverFnHi">735</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#277">bmc_mbox_enqueue</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#204">check_timers</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#121">lpc_write</a></td>
+ <td class="coverFnHi">6236172</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#95">lpc_read</a></td>
+ <td class="coverFnHi">22434105</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#66">check_window</a></td>
+ <td class="coverFnHi">28670397</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/mbox-server.c.func.html b/coverage-report/libflash/test/mbox-server.c.func.html
new file mode 100644
index 0000000..a216e71
--- /dev/null
+++ b/coverage-report/libflash/test/mbox-server.c.func.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/mbox-server.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - mbox-server.c<span style="font-size: 80%;"> (<a href="mbox-server.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">212</td>
+ <td class="headerCovTableEntry">255</td>
+ <td class="headerCovTableEntryMed">83.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="mbox-server.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#277">bmc_mbox_enqueue</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#151">bmc_mbox_get_attn_reg</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#143">bmc_mbox_register_attn</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#156">bmc_mbox_register_callback</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#204">check_timers</a></td>
+ <td class="coverFnHi">944</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#66">check_window</a></td>
+ <td class="coverFnHi">28670397</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#164">close_window</a></td>
+ <td class="coverFnHi">734</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#186">do_dirty</a></td>
+ <td class="coverFnHi">120</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#95">lpc_read</a></td>
+ <td class="coverFnHi">22434105</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#121">lpc_write</a></td>
+ <td class="coverFnHi">6236172</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#509">mbox_server_destroy</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#454">mbox_server_erase_granule</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#485">mbox_server_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#438">mbox_server_memcmp</a></td>
+ <td class="coverFnHi">23</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#443">mbox_server_memset</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#464">mbox_server_reset</a></td>
+ <td class="coverFnHi">3</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#448">mbox_server_total_size</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#459">mbox_server_version</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="mbox-server.c.gcov.html#213">open_window</a></td>
+ <td class="coverFnHi">735</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/mbox-server.c.gcov.html b/coverage-report/libflash/test/mbox-server.c.gcov.html
new file mode 100644
index 0000000..73b083f
--- /dev/null
+++ b/coverage-report/libflash/test/mbox-server.c.gcov.html
@@ -0,0 +1,599 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/mbox-server.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - mbox-server.c<span style="font-size: 80%;"> (source / <a href="mbox-server.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">212</td>
+ <td class="headerCovTableEntry">255</td>
+ <td class="headerCovTableEntryMed">83.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;inttypes.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;sys/mman.h&gt; /* for mprotect() */</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define pr_fmt(fmt) &quot;MBOX-SERVER: &quot; fmt</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;skiboot.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;opal-api.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;mbox-server.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;stubs.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define ERASE_GRANULE 0x100</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define LPC_BLOCKS 256</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define __unused __attribute__((unused))</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : enum win_type {</a>
+<a name="27"><span class="lineNum"> 27 </span> : : WIN_CLOSED,</a>
+<a name="28"><span class="lineNum"> 28 </span> : : WIN_READ,</a>
+<a name="29"><span class="lineNum"> 29 </span> : : WIN_WRITE</a>
+<a name="30"><span class="lineNum"> 30 </span> : : };</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : typedef void (*mbox_data_cb)(struct bmc_mbox_msg *msg, void *priv);</a>
+<a name="33"><span class="lineNum"> 33 </span> : : typedef void (*mbox_attn_cb)(uint8_t reg, void *priv);</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : struct {</a>
+<a name="36"><span class="lineNum"> 36 </span> : : mbox_data_cb fn;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : void *cb_data;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : struct bmc_mbox_msg *msg;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : mbox_attn_cb attn;</a>
+<a name="40"><span class="lineNum"> 40 </span> : : void *cb_attn;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : } mbox_data;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : static struct {</a>
+<a name="44"><span class="lineNum"> 44 </span> : : int api;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : bool reset;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : void *lpc_base;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : size_t lpc_size;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> : : uint8_t attn_reg;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> : : uint32_t block_shift;</a>
+<a name="53"><span class="lineNum"> 53 </span> : : uint32_t erase_granule;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : uint16_t def_read_win; /* default window size in blocks */</a>
+<a name="56"><span class="lineNum"> 56 </span> : : uint16_t def_write_win;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : uint16_t max_read_win; /* max window size in blocks */</a>
+<a name="59"><span class="lineNum"> 59 </span> : : uint16_t max_write_win;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : enum win_type win_type;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : uint32_t win_base;</a>
+<a name="63"><span class="lineNum"> 63 </span> : : uint32_t win_size;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : bool win_dirty;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : } server_state;</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 28670397 : static bool check_window(uint32_t pos, uint32_t size)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : {</a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* If size is zero then all is well */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 28670397 : if (size == 0)</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 24 : return true;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 28670373 : if (server_state.api == 1) {</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : /*</a>
+<a name="76"><span class="lineNum"> 76 </span> : : * Can actually be stricter in v1 because pos is relative to</a>
+<a name="77"><span class="lineNum"> 77 </span> : : * flash not window</a>
+<a name="78"><span class="lineNum"> 78 </span> : : */</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 104244 : if (pos &lt; server_state.win_base ||</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 104244 : pos + size &gt; server_state.win_base + server_state.win_size) {</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;pos: 0x%08x size: 0x%08x aren't in active window\n&quot;,</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : pos, size);</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : fprintf(stderr, &quot;window pos: 0x%08x window size: 0x%08x\n&quot;,</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : server_state.win_base, server_state.win_size);</a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : }</a>
+<a name="87"><span class="lineNum"> 87 </span> : : } else {</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 28566129 : if (pos + size &gt; server_state.win_base + server_state.win_size)</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : }</a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 28670373 : return true;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : }</a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* skiboot test stubs */</a>
+<a name="95"><span class="lineNum"> 95 </span> : : int64_t lpc_read(enum OpalLPCAddressType __unused addr_type, uint32_t addr,</a>
+<a name="96"><span class="lineNum"> 96 </span> : : uint32_t *data, uint32_t sz);</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 22434105 : int64_t lpc_read(enum OpalLPCAddressType __unused addr_type, uint32_t addr,</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : uint32_t *data, uint32_t sz)</a>
+<a name="99"><span class="lineNum"> 99 </span> : : {</a>
+<a name="100"><span class="lineNum"> 100 </span> : : /* Let it read from a write window... Spec says it ok! */</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 22434105 : if (!check_window(addr, sz) || server_state.win_type == WIN_CLOSED)</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 22434105 : switch (sz) {</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 308 : case 1:</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 308 : *(uint8_t *)data = *(uint8_t *)(server_state.lpc_base + addr);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 308 : break;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : case 2:</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : *(uint16_t *)data = be16_to_cpu(*(uint16_t *)(server_state.lpc_base + addr));</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 22433797 : case 4:</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 22433797 : *(uint32_t *)data = be32_to_cpu(*(uint32_t *)(server_state.lpc_base + addr));</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 22433797 : break;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Invalid data size %d\n&quot;, sz);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 22434105 : return 0;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : int64_t lpc_write(enum OpalLPCAddressType __unused addr_type, uint32_t addr,</a>
+<a name="122"><span class="lineNum"> 122 </span> : : uint32_t data, uint32_t sz);</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 6236172 : int64_t lpc_write(enum OpalLPCAddressType __unused addr_type, uint32_t addr,</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : uint32_t data, uint32_t sz)</a>
+<a name="125"><span class="lineNum"> 125 </span> : : {</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 6236172 : if (!check_window(addr, sz) || server_state.win_type != WIN_WRITE)</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 6236172 : switch (sz) {</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : case 1:</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : *(uint8_t *)(server_state.lpc_base + addr) = data;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : case 2:</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : *(uint16_t *)(server_state.lpc_base + addr) = cpu_to_be16(data);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 6236172 : case 4:</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 6236172 : *(uint32_t *)(server_state.lpc_base + addr) = cpu_to_be32(data);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 6236172 : break;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : prerror(&quot;Invalid data size %d\n&quot;, sz);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : }</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 6236172 : return 0;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 4 : int bmc_mbox_register_attn(mbox_attn_cb handler, void *drv_data)</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : {</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 4 : mbox_data.attn = handler;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 4 : mbox_data.cb_attn = drv_data;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : </a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 4 : return 0;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : }</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 7 : uint8_t bmc_mbox_get_attn_reg(void)</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : {</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 7 : return server_state.attn_reg;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 4 : int bmc_mbox_register_callback(mbox_data_cb handler, void *drv_data)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : {</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 4 : mbox_data.fn = handler;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 4 : mbox_data.cb_data = drv_data;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 4 : return 0;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> : : }</a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 734 : static int close_window(bool check)</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : {</a>
+<a name="168"><span class="lineNum"> 168 </span> : : /*</a>
+<a name="169"><span class="lineNum"> 169 </span> : : * This isn't strictly prohibited and some daemons let you close</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * windows even if none are open.</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * I've made the test fail because closing with no windows open is</a>
+<a name="172"><span class="lineNum"> 172 </span> : : * a sign that something 'interesting' has happened.</a>
+<a name="173"><span class="lineNum"> 173 </span> : : * You should investigate why</a>
+<a name="174"><span class="lineNum"> 174 </span> : : *</a>
+<a name="175"><span class="lineNum"> 175 </span> : : * If check is false it is because we just want to do the logic</a>
+<a name="176"><span class="lineNum"> 176 </span> : : * because open window has been called - you can open a window</a>
+<a name="177"><span class="lineNum"> 177 </span> : : * over a closed window obviously</a>
+<a name="178"><span class="lineNum"> 178 </span> : : */</a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 734 : if (check &amp;&amp; server_state.win_type == WIN_CLOSED)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : return MBOX_R_PARAM_ERROR;</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 734 : server_state.win_type = WIN_CLOSED;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 734 : mprotect(server_state.lpc_base, server_state.lpc_size, PROT_NONE);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 734 : return MBOX_R_SUCCESS;</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : }</a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 120 : static int do_dirty(uint32_t pos, uint32_t size)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> : : {</a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 120 : pos &lt;&lt;= server_state.block_shift;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 120 : if (server_state.api &gt; 1)</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 72 : size &lt;&lt;= server_state.block_shift;</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 120 : if (!check_window(pos, size)) {</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Trying to dirty not in open window range\n&quot;);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : return MBOX_R_PARAM_ERROR;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : }</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 120 : if (server_state.win_type != WIN_WRITE) {</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Trying to dirty not write window\n&quot;);</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return MBOX_R_PARAM_ERROR;</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : }</a>
+<a name="201"><span class="lineNum"> 201 </span> : : </a>
+<a name="202"><span class="lineNum"> 202 </span> : : /* Thats about all actually */</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 120 : return MBOX_R_SUCCESS;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : }</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 944 : void check_timers(bool __unused unused)</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : {</a>
+<a name="208"><span class="lineNum"> 208 </span> : : /* now that we've handled the message, holla-back */</a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 944 : if (mbox_data.msg) {</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 944 : mbox_data.fn(mbox_data.msg, mbox_data.cb_data);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 944 : mbox_data.msg = NULL;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : }</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 944 : }</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : </a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 735 : static int open_window(struct bmc_mbox_msg *msg, bool write, u32 offset, u32 size)</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : {</a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 735 : int max_size = server_state.max_read_win &lt;&lt; server_state.block_shift;</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : //int win_size = server_state.def_read_win;</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 735 : enum win_type type = WIN_READ;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 735 : int prot = PROT_READ;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 735 : assert(server_state.win_type == WIN_CLOSED);</span></a>
+<a name="223"><span class="lineNum"> 223 </span> : : </a>
+<a name="224"><span class="lineNum"> 224 </span> : : /* Shift params up */</a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 735 : offset &lt;&lt;= server_state.block_shift;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 735 : size &lt;&lt;= server_state.block_shift;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 735 : if (!size || server_state.api == 1)</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 734 : size = server_state.def_read_win &lt;&lt; server_state.block_shift;</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 735 : if (write) {</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 95 : max_size = server_state.max_write_win &lt;&lt; server_state.block_shift;</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : //win_size = server_state.def_write_win;</a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 95 : prot |= PROT_WRITE;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 95 : type = WIN_WRITE;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : /* Use the default size if zero size is set */</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 95 : if (!size || server_state.api == 1)</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 23 : size = server_state.def_write_win &lt;&lt; server_state.block_shift;</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 735 : prlog(PR_INFO, &quot;Opening range %#.8x, %#.8x for %s\n&quot;,</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : offset, offset + size - 1, write ? &quot;writing&quot; : &quot;reading&quot;);</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> : : /* XXX: Document this behaviour */</a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 735 : if ((size + offset) &gt; server_state.lpc_size) {</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 4 : prlog(PR_INFO, &quot;tried to open beyond end of flash\n&quot;);</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 4 : return MBOX_R_PARAM_ERROR;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : }</a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> : : /* XXX: should we do this before or after checking for errors?</a>
+<a name="252"><span class="lineNum"> 252 </span> : : * Doing it afterwards ensures consistency between</a>
+<a name="253"><span class="lineNum"> 253 </span> : : * implementations</a>
+<a name="254"><span class="lineNum"> 254 </span> : : */</a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 731 : if (server_state.api == 2)</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 365 : size = MIN(size, max_size);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 731 : mprotect(server_state.lpc_base + offset, size, prot);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 731 : server_state.win_type = type;</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 731 : server_state.win_base = offset;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 731 : server_state.win_size = size;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : </a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 731 : memset(msg-&gt;args, 0, sizeof(msg-&gt;args));</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 731 : bmc_put_u16(msg, 0, offset &gt;&gt; server_state.block_shift);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 731 : if (server_state.api == 1) {</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : /*</a>
+<a name="267"><span class="lineNum"> 267 </span> : : * Put nonsense in here because v1 mbox-flash shouldn't know about it.</a>
+<a name="268"><span class="lineNum"> 268 </span> : : * If v1 mbox-flash does read this, 0xffff should trigger a big mistake.</a>
+<a name="269"><span class="lineNum"> 269 </span> : : */</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 187 : bmc_put_u16(msg, 2, 0xffff &gt;&gt; server_state.block_shift);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 187 : bmc_put_u16(msg, 4, 0xffff &gt;&gt; server_state.block_shift);</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : } else {</a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 544 : bmc_put_u16(msg, 2, size &gt;&gt; server_state.block_shift);</span></a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 544 : bmc_put_u16(msg, 4, offset &gt;&gt; server_state.block_shift);</span></a>
+<a name="275"><span class="lineNum"> 275 </span> : : }</a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 731 : return MBOX_R_SUCCESS;</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : }</a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 944 : int bmc_mbox_enqueue(struct bmc_mbox_msg *msg,</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : unsigned int __unused timeout_sec)</a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : /*</a>
+<a name="283"><span class="lineNum"> 283 </span> : : * FIXME: should we be using the same storage for message</a>
+<a name="284"><span class="lineNum"> 284 </span> : : * and response?</a>
+<a name="285"><span class="lineNum"> 285 </span> : : */</a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 944 : int rc = MBOX_R_SUCCESS;</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : uint32_t start, size;</a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 944 : if (server_state.reset &amp;&amp; msg-&gt;command != MBOX_C_GET_MBOX_INFO &amp;&amp;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 3 : msg-&gt;command != MBOX_C_BMC_EVENT_ACK) {</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : /*</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * Real daemons should return an error, but for testing we'll</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * be a bit more strict</a>
+<a name="294"><span class="lineNum"> 294 </span> : : */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;Server was in reset state - illegal command %d\n&quot;,</span></a>
+<a name="296"><span class="lineNum"> 296 </span> : : msg-&gt;command);</a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : }</a>
+<a name="299"><span class="lineNum"> 299 </span> : : </a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 944 : switch (msg-&gt;command) {</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 1 : case MBOX_C_RESET_STATE:</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 1 : prlog(PR_INFO, &quot;RESET_STATE\n&quot;);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 1 : server_state.win_type = WIN_CLOSED;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 1 : rc = open_window(msg, false, 0, LPC_BLOCKS);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 1 : memset(msg-&gt;args, 0, sizeof(msg-&gt;args));</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 4 : case MBOX_C_GET_MBOX_INFO:</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 4 : prlog(PR_INFO, &quot;GET_MBOX_INFO version = %d, block_shift = %d\n&quot;,</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : server_state.api, server_state.block_shift);</a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 4 : msg-&gt;args[0] = server_state.api;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 4 : if (server_state.api == 1) {</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 1 : prlog(PR_INFO, &quot;\tread_size = 0x%08x, write_size = 0x%08x\n&quot;,</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : server_state.def_read_win, server_state.def_write_win);</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 1 : bmc_put_u16(msg, 1, server_state.def_read_win);</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 1 : bmc_put_u16(msg, 3, server_state.def_write_win);</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 1 : msg-&gt;args[5] = 0xff; /* If v1 reads this, 0xff will force the mistake */</span></a>
+<a name="318"><span class="lineNum"> 318 </span> : : } else {</a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 3 : msg-&gt;args[5] = server_state.block_shift;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : }</a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 4 : server_state.reset = false;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 4 : case MBOX_C_GET_FLASH_INFO:</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 4 : prlog(PR_INFO, &quot;GET_FLASH_INFO: size: 0x%&quot; PRIu64 &quot;, erase: 0x%08x\n&quot;,</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : server_state.lpc_size, server_state.erase_granule);</a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 4 : if (server_state.api == 1) {</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 1 : bmc_put_u32(msg, 0, server_state.lpc_size);</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 1 : bmc_put_u32(msg, 4, server_state.erase_granule);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> : : } else {</a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 3 : bmc_put_u16(msg, 0, server_state.lpc_size &gt;&gt; server_state.block_shift);</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 3 : bmc_put_u16(msg, 2, server_state.erase_granule &gt;&gt; server_state.block_shift);</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : }</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 639 : case MBOX_C_CREATE_READ_WINDOW:</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 639 : start = bmc_get_u16(msg, 0);</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 639 : size = bmc_get_u16(msg, 2);</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 639 : prlog(PR_INFO, &quot;CREATE_READ_WINDOW: pos: 0x%08x, len: 0x%08x\n&quot;, start, size);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 639 : rc = close_window(false);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 639 : if (rc != MBOX_R_SUCCESS)</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 639 : rc = open_window(msg, false, start, size);</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 639 : break;</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : </a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : case MBOX_C_CLOSE_WINDOW:</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineNoCov"> 0 : rc = close_window(true);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : </a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 95 : case MBOX_C_CREATE_WRITE_WINDOW:</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 95 : start = bmc_get_u16(msg, 0);</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 95 : size = bmc_get_u16(msg, 2);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 95 : prlog(PR_INFO, &quot;CREATE_WRITE_WINDOW: pos: 0x%08x, len: 0x%08x\n&quot;, start, size);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 95 : rc = close_window(false);</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 95 : if (rc != MBOX_R_SUCCESS)</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 95 : rc = open_window(msg, true, start, size);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 95 : break;</span></a>
+<a name="359"><span class="lineNum"> 359 </span> : : </a>
+<a name="360"><span class="lineNum"> 360 </span> : : /* TODO: make these do something */</a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 99 : case MBOX_C_WRITE_FLUSH:</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 99 : prlog(PR_INFO, &quot;WRITE_FLUSH\n&quot;);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> : : /*</a>
+<a name="364"><span class="lineNum"> 364 </span> : : * This behaviour isn't strictly illegal however it could</a>
+<a name="365"><span class="lineNum"> 365 </span> : : * be a sign of bad behaviour</a>
+<a name="366"><span class="lineNum"> 366 </span> : : */</a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 99 : if (server_state.api &gt; 1 &amp;&amp; !server_state.win_dirty) {</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;Version &gt;1 called FLUSH without a previous DIRTY\n&quot;);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : exit (1);</span></a>
+<a name="370"><span class="lineNum"> 370 </span> : : }</a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 99 : server_state.win_dirty = false;</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 99 : if (server_state.api &gt; 1)</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 75 : break;</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : </a>
+<a name="375"><span class="lineNum"> 375 </span> : : /* This is only done on V1 */</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 24 : start = bmc_get_u16(msg, 0);</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 24 : if (server_state.api == 1)</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 24 : size = bmc_get_u32(msg, 2);</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : else</a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineNoCov"> 0 : size = bmc_get_u16(msg, 2);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 24 : prlog(PR_INFO, &quot;\tpos: 0x%08x len: 0x%08x\n&quot;, start, size);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 24 : rc = do_dirty(start, size);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 24 : break;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 96 : case MBOX_C_MARK_WRITE_DIRTY:</span></a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 96 : start = bmc_get_u16(msg, 0);</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 96 : if (server_state.api == 1)</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 24 : size = bmc_get_u32(msg, 2);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : else</a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 72 : size = bmc_get_u16(msg, 2);</span></a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 96 : prlog(PR_INFO, &quot;MARK_WRITE_DIRTY: pos: 0x%08x, len: %08x\n&quot;, start, size);</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 96 : server_state.win_dirty = true;</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 96 : rc = do_dirty(start, size);</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 96 : break;</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 3 : case MBOX_C_BMC_EVENT_ACK:</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : /*</a>
+<a name="396"><span class="lineNum"> 396 </span> : : * Clear any BMC notifier flags. Don't clear the server</a>
+<a name="397"><span class="lineNum"> 397 </span> : : * reset state here, it is a permitted command but only</a>
+<a name="398"><span class="lineNum"> 398 </span> : : * GET_INFO should clear it.</a>
+<a name="399"><span class="lineNum"> 399 </span> : : *</a>
+<a name="400"><span class="lineNum"> 400 </span> : : * Make sure that msg-&gt;args[0] is only acking bits we told</a>
+<a name="401"><span class="lineNum"> 401 </span> : : * it about, in server_state.attn_reg. The caveat is that</a>
+<a name="402"><span class="lineNum"> 402 </span> : : * it could NOT ack some bits...</a>
+<a name="403"><span class="lineNum"> 403 </span> : : */</a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 3 : prlog(PR_INFO, &quot;BMC_EVENT_ACK 0x%02x\n&quot;, msg-&gt;args[0]);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 3 : if ((msg-&gt;args[0] | server_state.attn_reg) != server_state.attn_reg) {</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;Tried to ack bits we didn't say!\n&quot;);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="408"><span class="lineNum"> 408 </span> : : }</a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 3 : msg-&gt;bmc &amp;= ~msg-&gt;args[0];</span></a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 3 : server_state.attn_reg &amp;= ~msg-&gt;args[0];</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 3 : break;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 3 : case MBOX_C_MARK_WRITE_ERASED:</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 3 : start = bmc_get_u16(msg, 0) &lt;&lt; server_state.block_shift;</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 3 : size = bmc_get_u16(msg, 2) &lt;&lt; server_state.block_shift;</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : /* If we've negotiated v1 this should never be called */</a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 3 : if (server_state.api == 1) {</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;Version 1 protocol called a V2 only command\n&quot;);</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : }</a>
+<a name="420"><span class="lineNum"> 420 </span> : : /*</a>
+<a name="421"><span class="lineNum"> 421 </span> : : * This will likely result in flush (but not</a>
+<a name="422"><span class="lineNum"> 422 </span> : : * dirty) being called. This is the point.</a>
+<a name="423"><span class="lineNum"> 423 </span> : : */</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 3 : server_state.win_dirty = true;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : /* This should really be done when they call flush */</a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 3 : memset(server_state.lpc_base + server_state.win_base + start, 0xff, size);</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 3 : break;</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;Got unknown command code from mbox: %d\n&quot;, msg-&gt;command);</span></a>
+<a name="430"><span class="lineNum"> 430 </span> : : }</a>
+<a name="431"><span class="lineNum"> 431 </span> : : </a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 944 : prerror(&quot;command response = %d\n&quot;, rc);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 944 : msg-&gt;response = rc;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineCov"> 944 : mbox_data.msg = msg;</span></a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 944 : return 0;</span></a>
+<a name="438"><span class="lineNum"> 438 </span> : : }</a>
+<a name="439"><span class="lineNum"> 439 </span> : : </a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 23 : int mbox_server_memcmp(int off, const void *buf, size_t len)</span></a>
+<a name="441"><span class="lineNum"> 441 </span> : : {</a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 23 : return memcmp(server_state.lpc_base + off, buf, len);</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : }</a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 4 : void mbox_server_memset(int c)</span></a>
+<a name="446"><span class="lineNum"> 446 </span> : : {</a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 4 : memset(server_state.lpc_base, c, server_state.lpc_size);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 4 : }</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineCov"> 4 : uint32_t mbox_server_total_size(void)</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : {</a>
+<a name="452"><span class="lineNum"> 452 </span> : : /* Not actually but for this server we don't differentiate */</a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 4 : return server_state.lpc_size;</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : }</a>
+<a name="455"><span class="lineNum"> 455 </span> : : </a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineCov"> 4 : uint32_t mbox_server_erase_granule(void)</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : {</a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 4 : return server_state.erase_granule;</span></a>
+<a name="459"><span class="lineNum"> 459 </span> : : }</a>
+<a name="460"><span class="lineNum"> 460 </span> : : </a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineCov"> 8 : int mbox_server_version(void)</span></a>
+<a name="462"><span class="lineNum"> 462 </span> : : {</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 8 : return server_state.api;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> : : }</a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 3 : int mbox_server_reset(unsigned int version, uint8_t block_shift)</span></a>
+<a name="467"><span class="lineNum"> 467 </span> : : {</a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 3 : if (version &gt; 3)</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 3 : server_state.api = version;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 3 : if (block_shift)</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 3 : server_state.block_shift = block_shift;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 3 : if (server_state.erase_granule &lt; (1 &lt;&lt; server_state.block_shift))</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineCov"> 2 : server_state.erase_granule = 1 &lt;&lt; server_state.block_shift;</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 3 : server_state.lpc_size = LPC_BLOCKS * (1 &lt;&lt; server_state.block_shift);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 3 : free(server_state.lpc_base);</span></a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 3 : server_state.lpc_base = malloc(server_state.lpc_size);</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineCov"> 3 : server_state.attn_reg = MBOX_ATTN_BMC_REBOOT | MBOX_ATTN_BMC_DAEMON_READY;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineCov"> 3 : server_state.win_type = WIN_CLOSED;</span></a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineCov"> 3 : server_state.reset = true;</span></a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 3 : mbox_data.attn(MBOX_ATTN_BMC_REBOOT, mbox_data.cb_attn);</span></a>
+<a name="483"><span class="lineNum"> 483 </span> : : </a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 3 : return 0;</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : }</a>
+<a name="486"><span class="lineNum"> 486 </span> : : </a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 1 : int mbox_server_init(void)</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : {</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 1 : server_state.api = 1;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineCov"> 1 : server_state.reset = true;</span></a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> : : /* We're always ready! */</a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 1 : server_state.attn_reg = MBOX_ATTN_BMC_DAEMON_READY;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> : : </a>
+<a name="495"><span class="lineNum"> 495 </span> : : /* setup server */</a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 1 : server_state.block_shift = 12;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 1 : server_state.erase_granule = 0x1000;</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineCov"> 1 : server_state.lpc_size = LPC_BLOCKS * (1 &lt;&lt; server_state.block_shift);</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 1 : server_state.lpc_base = malloc(server_state.lpc_size);</span></a>
+<a name="500"><span class="lineNum"> 500 </span> : : </a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 1 : server_state.def_read_win = 1; /* These are in units of block shift &quot;= 1 is 4K&quot; */</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 1 : server_state.def_write_win = 1; /* These are in units of block shift &quot;= 1 is 4K&quot; */</span></a>
+<a name="503"><span class="lineNum"> 503 </span> : : </a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 1 : server_state.max_read_win = LPC_BLOCKS;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineCov"> 1 : server_state.max_write_win = LPC_BLOCKS;</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineCov"> 1 : server_state.win_type = WIN_CLOSED;</span></a>
+<a name="507"><span class="lineNum"> 507 </span> : : </a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="509"><span class="lineNum"> 509 </span> : : }</a>
+<a name="510"><span class="lineNum"> 510 </span> : : </a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineCov"> 1 : void mbox_server_destroy(void)</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : {</a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 1 : free(server_state.lpc_base);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 1 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/stubs.c.func-sort-c.html b/coverage-report/libflash/test/stubs.c.func-sort-c.html
new file mode 100644
index 0000000..6f09fdc
--- /dev/null
+++ b/coverage-report/libflash/test/stubs.c.func-sort-c.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/stubs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - stubs.c<span style="font-size: 80%;"> (<a href="stubs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntry">43</td>
+ <td class="headerCovTableEntryMed">88.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="stubs.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#19">check_timers</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#24">time_wait_ms</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#53">bmc_put_u32</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#61">bmc_get_u32</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#88">__free</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#83">__zalloc</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#93">lock_caller</a></td>
+ <td class="coverFnHi">635</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#98">unlock</a></td>
+ <td class="coverFnHi">635</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#73">bmc_get_u16</a></td>
+ <td class="coverFnHi">1666</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#30">mftb</a></td>
+ <td class="coverFnHi">1888</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#47">bmc_put_u16</a></td>
+ <td class="coverFnHi">2201</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#36">_prlog</a></td>
+ <td class="coverFnHi">6283</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/stubs.c.func.html b/coverage-report/libflash/test/stubs.c.func.html
new file mode 100644
index 0000000..95ab58f
--- /dev/null
+++ b/coverage-report/libflash/test/stubs.c.func.html
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/stubs.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - stubs.c<span style="font-size: 80%;"> (<a href="stubs.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntry">43</td>
+ <td class="headerCovTableEntryMed">88.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="stubs.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#88">__free</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#83">__zalloc</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#36">_prlog</a></td>
+ <td class="coverFnHi">6283</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#73">bmc_get_u16</a></td>
+ <td class="coverFnHi">1666</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#61">bmc_get_u32</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#47">bmc_put_u16</a></td>
+ <td class="coverFnHi">2201</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#53">bmc_put_u32</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#19">check_timers</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#93">lock_caller</a></td>
+ <td class="coverFnHi">635</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#30">mftb</a></td>
+ <td class="coverFnHi">1888</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#24">time_wait_ms</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="stubs.c.gcov.html#98">unlock</a></td>
+ <td class="coverFnHi">635</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/stubs.c.gcov.html b/coverage-report/libflash/test/stubs.c.gcov.html
new file mode 100644
index 0000000..fbdf685
--- /dev/null
+++ b/coverage-report/libflash/test/stubs.c.gcov.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/stubs.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - stubs.c<span style="font-size: 80%;"> (source / <a href="stubs.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">38</td>
+ <td class="headerCovTableEntry">43</td>
+ <td class="headerCovTableEntryMed">88.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryMed">83.3 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /*</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Stubs for libflash test</a>
+<a name="4"><span class="lineNum"> 4 </span> : : *</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * Copyright 2013-2018 IBM Corp.</a>
+<a name="6"><span class="lineNum"> 6 </span> : : */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdbool.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;string.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;sys/unistd.h&gt; /* for usleep */</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;../../include/lpc-mbox.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;stubs.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define __unused __attribute__((unused))</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : __attribute__((weak)) void check_timers(bool __unused unused)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : void time_wait_ms(unsigned long ms)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : usleep(ms * 1000);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : /* skiboot stubs */</a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1888 : unsigned long mftb(void)</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : {</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1888 : return 42;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> : : }</a>
+<a name="36"><span class="lineNum"> 36 </span> : : unsigned long tb_hz = 512000000ul;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 6283 : void _prlog(int __unused log_level, const char* fmt, ...)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> : : va_list ap;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 6283 : va_start(ap, fmt);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 6283 : vprintf(fmt, ap);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 6283 : va_end(ap);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 6283 : }</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* accessor junk */</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 2201 : void bmc_put_u16(struct bmc_mbox_msg *msg, int offset, uint16_t data)</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 2201 : msg-&gt;args[offset + 0] = data &amp; 0xff;</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 2201 : msg-&gt;args[offset + 1] = data &gt;&gt; 8;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 2201 : }</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 2 : void bmc_put_u32(struct bmc_mbox_msg *msg, int offset, uint32_t data)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : {</a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 2 : msg-&gt;args[offset + 0] = (data) &amp; 0xff;</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 2 : msg-&gt;args[offset + 1] = (data &gt;&gt; 8) &amp; 0xff;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 2 : msg-&gt;args[offset + 2] = (data &gt;&gt; 16) &amp; 0xff;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 2 : msg-&gt;args[offset + 3] = (data &gt;&gt; 24) &amp; 0xff;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 48 : u32 bmc_get_u32(struct bmc_mbox_msg *msg, int offset)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 48 : u32 data = 0;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 48 : data |= msg-&gt;args[offset + 0];</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 48 : data |= msg-&gt;args[offset + 1] &lt;&lt; 8;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 48 : data |= msg-&gt;args[offset + 2] &lt;&lt; 16;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 48 : data |= msg-&gt;args[offset + 3] &lt;&lt; 24;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 48 : return data;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : }</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1666 : u16 bmc_get_u16(struct bmc_mbox_msg *msg, int offset)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : {</a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1666 : u16 data = 0;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1666 : data |= msg-&gt;args[offset + 0];</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1666 : data |= msg-&gt;args[offset + 1] &lt;&lt; 8;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1666 : return data;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 57 : void *__zalloc(size_t sz)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : {</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 57 : return calloc(1, sz);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 57 : void __free(const void *p)</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : {</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 57 : free((void *)p);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 57 : }</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 635 : void lock_caller(struct lock *l __attribute__((unused)),</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : const char *caller __attribute__((unused)))</a>
+<a name="97"><span class="lineNum"> 97 </span> : : {</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 635 : }</span></a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 635 : void unlock(struct lock *l __attribute__((unused)))</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 635 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-blocklevel.c.func-sort-c.html b/coverage-report/libflash/test/test-blocklevel.c.func-sort-c.html
new file mode 100644
index 0000000..4464314
--- /dev/null
+++ b/coverage-report/libflash/test/test-blocklevel.c.func-sort-c.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-blocklevel.c<span style="font-size: 80%;"> (<a href="test-blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">160</td>
+ <td class="headerCovTableEntry">392</td>
+ <td class="headerCovTableEntryLo">40.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryLo">60.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="test-blocklevel.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#18">bl_test_bad_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#34">bl_test_bad_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#60">dump_buf</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#97">print_ptr</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#114">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#73">check_buf</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#87">reset_buf</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#50">bl_test_erase</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#40">bl_test_write</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#24">bl_test_read</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-blocklevel.c.func.html b/coverage-report/libflash/test/test-blocklevel.c.func.html
new file mode 100644
index 0000000..2ce99f0
--- /dev/null
+++ b/coverage-report/libflash/test/test-blocklevel.c.func.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-blocklevel.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-blocklevel.c<span style="font-size: 80%;"> (<a href="test-blocklevel.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">160</td>
+ <td class="headerCovTableEntry">392</td>
+ <td class="headerCovTableEntryLo">40.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryLo">60.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="test-blocklevel.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#18">bl_test_bad_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#34">bl_test_bad_write</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#50">bl_test_erase</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#24">bl_test_read</a></td>
+ <td class="coverFnHi">25</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#40">bl_test_write</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#73">check_buf</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#60">dump_buf</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#114">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#97">print_ptr</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-blocklevel.c.gcov.html#87">reset_buf</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-blocklevel.c.gcov.html b/coverage-report/libflash/test/test-blocklevel.c.gcov.html
new file mode 100644
index 0000000..4b8b042
--- /dev/null
+++ b/coverage-report/libflash/test/test-blocklevel.c.gcov.html
@@ -0,0 +1,749 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-blocklevel.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-blocklevel.c<span style="font-size: 80%;"> (source / <a href="test-blocklevel.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">160</td>
+ <td class="headerCovTableEntry">392</td>
+ <td class="headerCovTableEntryLo">40.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">10</td>
+ <td class="headerCovTableEntryLo">60.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;../ecc.c&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;../blocklevel.c&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : #define __unused __attribute__((unused))</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define ERR(fmt...) fprintf(stderr, fmt)</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : bool libflash_debug;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineNoCov"> 0 : static int bl_test_bad_read(struct blocklevel_device *bl __unused, uint64_t pos __unused,</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : void *buf __unused, uint64_t len __unused)</a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 25 : static int bl_test_read(struct blocklevel_device *bl, uint64_t pos, void *buf, uint64_t len)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : {</a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 25 : if (pos + len &gt; 0x1000)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 25 : memcpy(buf, bl-&gt;priv + pos, len);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 25 : return 0;</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineNoCov"> 0 : static int bl_test_bad_write(struct blocklevel_device *bl __unused, uint64_t pos __unused,</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : const void *buf __unused, uint64_t len __unused)</a>
+<a name="38"><span class="lineNum"> 38 </span> : : {</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 14 : static int bl_test_write(struct blocklevel_device *bl, uint64_t pos, const void *buf, uint64_t len)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 14 : if (pos + len &gt; 0x1000)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 14 : memcpy(bl-&gt;priv + pos, buf, len);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 14 : return 0;</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 12 : static int bl_test_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t len)</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 12 : if (pos + len &gt; 0x1000)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : return FLASH_ERR_PARM_ERROR;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 12 : memset(bl-&gt;priv + pos, 0xff, len);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 12 : return 0;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : }</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : static void dump_buf(uint8_t *buf, int start, int end, int miss)</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : {</a>
+<a name="64"><span class="lineNum"> 64 </span> : : int i;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : printf(&quot;pos: value\n&quot;);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : for (i = start; i &lt; end; i++)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : printf(&quot;%04x: %c%s\n&quot;, i, buf[i] == 0xff ? '-' : buf[i], i == miss ? &quot; &lt;- First missmatch&quot; : &quot;&quot;);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> : : /*</a>
+<a name="72"><span class="lineNum"> 72 </span> : : * Returns zero if the buffer is ok. Otherwise returns the position of</a>
+<a name="73"><span class="lineNum"> 73 </span> : : * the mismatch. If the mismatch is at zero -1 is returned</a>
+<a name="74"><span class="lineNum"> 74 </span> : : */</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 8 : static int check_buf(uint8_t *buf, int zero_start, int zero_end)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : {</a>
+<a name="77"><span class="lineNum"> 77 </span> : : int i;</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 32776 : for (i = 0; i &lt; 0x1000; i++) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 32768 : if (i &gt;= zero_start &amp;&amp; i &lt; zero_end &amp;&amp; buf[i] != 0xff)</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : return i == 0 ? -1 : i;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 32768 : if ((i &lt; zero_start || i &gt;= zero_end) &amp;&amp; buf[i] != (i % 26) + 'a')</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineNoCov"> 0 : return i == 0 ? -1 : i;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : }</a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 8 : return 0;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : }</a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 9 : static void reset_buf(uint8_t *buf)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : {</a>
+<a name="91"><span class="lineNum"> 91 </span> : : int i;</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 36873 : for (i = 0; i &lt; 0x1000; i++) {</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : /* This gives repeating a - z which will be nice to visualise */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 36864 : buf[i] = (i % 26) + 'a';</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : }</a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 9 : }</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : static void print_ptr(void *ptr, int len)</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : {</a>
+<a name="101"><span class="lineNum"> 101 </span> : : int i;</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineNoCov"> 0 : char *p = ptr;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : printf(&quot;0x&quot;);</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; len; i++) {</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : putchar(*p);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : if (i &amp;&amp; i % 8 == 0) {</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : putchar('\n');</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : if (len - i)</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : printf(&quot;0x&quot;);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : }</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : putchar('\n');</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="115"><span class="lineNum"> 115 </span> : : </a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : {</a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : struct blocklevel_device bl_mem = { 0 };</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : struct blocklevel_device *bl = &amp;bl_mem;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : uint64_t with_ecc[10], without_ecc[10];</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 1 : char *buf = NULL, *data = NULL;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : int i, rc, miss;</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0, 0x1000)) {</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect!\n&quot;);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : }</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> : : /* 0x1000 -&gt; 0x3000 should remain unprotected */</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x3000, 0x1000)) {</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x3000, 0x1000)\n&quot;);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : }</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x2f00, 0x1100)) {</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x2f00, 0x1100)\n&quot;);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : }</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> : : /* Zero length protection */</a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 1 : if (!blocklevel_ecc_protect(bl, 0x4000, 0)) {</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Shouldn't have succeeded blocklevel_ecc_protect(0x4000, 0)\n&quot;);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> : : /* Minimum creatable size */</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x4000, BYTES_PER_ECC)) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x4000, BYTES_PER_ECC)\n&quot;);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : }</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> : : /* Deal with overlapping protections */</a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x100, 0x1000)) {</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to protect overlaping region blocklevel_ecc_protect(0x100, 0x1000)\n&quot;);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> : : /* Deal with overflow */</a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 1 : if (!blocklevel_ecc_protect(bl, 1, 0xFFFFFFFF)) {</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Added an 'overflow' protection blocklevel_ecc_protect(1, 0xFFFFFFFF)\n&quot;);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : }</a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> : : /* Protect everything */</a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0, 0xFFFFFFFF)) {</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't protect everything blocklevel_ecc_protect(0, 0xFFFFFFFF)\n&quot;);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : }</a>
+<a name="169"><span class="lineNum"> 169 </span> : : </a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0, 1, NULL) != 1) {</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invaid result for ecc_protected(0, 1)\n&quot;);</span></a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : }</a>
+<a name="174"><span class="lineNum"> 174 </span> : : </a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0, 0x1000, NULL) != 1) {</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0, 0x1000)\n&quot;);</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="178"><span class="lineNum"> 178 </span> : : }</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x100, 0x100, NULL) != 1) {</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x0100, 0x100)\n&quot;);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> : : /* Clear the protections */</a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : bl-&gt;ecc_prot.n_prot = 0;</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : /* Reprotect */</a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x3000, 0x1000)) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x3000, 0x1000)\n&quot;);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : /* Deal with overlapping protections */</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x100, 0x1000)) {</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to protect overlaping region blocklevel_ecc_protect(0x100, 0x1000)\n&quot;);</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : }</a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x1000, 0, NULL) != 1) {</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x1000, 0)\n&quot;);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> : : }</a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x1000, 0x1000, NULL) != -1) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x1000, 0x1000)\n&quot;);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : }</a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x1000, 0x100, NULL) != 1) {</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x1000, 0x100)\n&quot;);</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x2000, 0, NULL) != 0) {</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x2000, 0)\n&quot;);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="216"><span class="lineNum"> 216 </span> : : }</a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x4000, 1, NULL) != 0) {</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x4000, 1)\n&quot;);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : }</a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> : : /* Check for asking for a region with mixed protection */</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x100, 0x2000, NULL) != -1) {</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x100, 0x2000)\n&quot;);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : }</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : /* Test the auto extending of regions */</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x5000, 0x100)) {</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x5000, 0x100)\n&quot;);</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : }</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x5100, 0x100)) {</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x5100, 0x100)\n&quot;);</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x5200, 0x100)) {</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x5200, 0x100)\n&quot;);</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : }</a>
+<a name="244"><span class="lineNum"> 244 </span> : : </a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x5120, 0x10, NULL) != 1) {</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x5120, 0x10)\n&quot;);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="248"><span class="lineNum"> 248 </span> : : }</a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x4f00, 0x100)) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protected(0x4900, 0x100)\n&quot;);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : }</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x4900, 0x100)) {</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protected(0x4900, 0x100)\n&quot;);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="258"><span class="lineNum"> 258 </span> : : }</a>
+<a name="259"><span class="lineNum"> 259 </span> : : </a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 1 : if (ecc_protected(bl, 0x4920, 0x10, NULL) != 1) {</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Invalid result for ecc_protected(0x4920, 0x10)\n&quot;);</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="263"><span class="lineNum"> 263 </span> : : }</a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x5290, 0x10)) {</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x5290, 0x10)\n&quot;);</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : }</a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> : : /* Test the auto extending of regions */</a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x6000, 0x100)) {</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x6000, 0x100)\n&quot;);</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : }</a>
+<a name="275"><span class="lineNum"> 275 </span> : : </a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 1 : if (blocklevel_ecc_protect(bl, 0x6200, 0x100)) {</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_ecc_protect(0x6200, 0x100)\n&quot;);</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : }</a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> : : /* Test ECC reading and writing being 100% transparent to the</a>
+<a name="282"><span class="lineNum"> 282 </span> : : * caller */</a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 1 : buf = malloc(0x1000);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 1 : data = malloc(0x100);</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 1 : if (!buf || !data) {</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Malloc failed\n&quot;);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="289"><span class="lineNum"> 289 </span> : : }</a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 1 : memset(bl, 0, sizeof(*bl));</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 1 : bl_mem.read = &amp;bl_test_read;</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 1 : bl_mem.write = &amp;bl_test_write;</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 1 : bl_mem.erase = &amp;bl_test_erase;</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 1 : bl_mem.erase_mask = 0xff;</span></a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 1 : bl_mem.priv = buf;</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="297"><span class="lineNum"> 297 </span> : : </a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> : : /*</a>
+<a name="300"><span class="lineNum"> 300 </span> : : * Test 1: One full and exact erase block, this shouldn't call</a>
+<a name="301"><span class="lineNum"> 301 </span> : : * read or write, ensure this fails if it does.</a>
+<a name="302"><span class="lineNum"> 302 </span> : : */</a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 1 : bl_mem.write = &amp;bl_test_bad_write;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 1 : bl_mem.read = &amp;bl_test_bad_read;</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x100, 0x100)) {</span></a>
+<a name="306"><span class="lineNum"> 306 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x100, 0x100)\n&quot;);</span></a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : }</a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x100, 0x200);</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x100, 0x100) at 0x%0x\n&quot;,</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0xfc, 0x105, miss == -1 ? 0 : miss);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x1fc, 0x205, miss == -1 ? 0 : miss);</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : }</a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 1 : bl_mem.read = &amp;bl_test_read;</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 1 : bl_mem.write = &amp;bl_test_write;</span></a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Test 2: Only touch one erase block */</a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x20, 0x40)) {</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x20, 0x40)\n&quot;);</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : }</a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x20, 0x60);</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x20, 0x40) at 0x%x\n&quot;,</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x1c, 0x65, miss == -1 ? 0 : miss);</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="332"><span class="lineNum"> 332 </span> : : }</a>
+<a name="333"><span class="lineNum"> 333 </span> : : </a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : /* Test 3: Start aligned but finish somewhere in it */</a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x100, 0x50)) {</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x100, 0x50)\n&quot;);</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="339"><span class="lineNum"> 339 </span> : : }</a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x100, 0x150);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x100, 0x50) at 0x%0x\n&quot;,</span></a>
+<a name="343"><span class="lineNum"> 343 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0xfc, 0x105, miss == -1 ? 0 : miss);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x14c, 0x155, miss == -1 ? 0 : miss);</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : }</a>
+<a name="348"><span class="lineNum"> 348 </span> : : </a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : /* Test 4: Start somewhere in it, finish aligned */</a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x50, 0xb0)) {</span></a>
+<a name="352"><span class="lineNum"> 352 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x50, 0xb0)\n&quot;);</span></a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="354"><span class="lineNum"> 354 </span> : : }</a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x50, 0x100);</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x50, 0xb0) at 0x%x\n&quot;,</span></a>
+<a name="358"><span class="lineNum"> 358 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x4c, 0x55, miss == -1 ? 0 : miss);</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x100, 0x105, miss == -1 ? 0 : miss);</span></a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="362"><span class="lineNum"> 362 </span> : : }</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : /* Test 5: Cover two erase blocks exactly */</a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x100, 0x200)) {</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x100, 0x200)\n&quot;);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : }</a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x100, 0x300);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x100, 0x200) at 0x%x\n&quot;,</span></a>
+<a name="373"><span class="lineNum"> 373 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0xfc, 0x105, miss == -1 ? 0 : miss);</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x2fc, 0x305, miss == -1 ? 0 : miss);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> : : }</a>
+<a name="378"><span class="lineNum"> 378 </span> : : </a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="380"><span class="lineNum"> 380 </span> : : /* Test 6: Erase 1.5 blocks (start aligned) */</a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x100, 0x180)) {</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x100, 0x180)\n&quot;);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="384"><span class="lineNum"> 384 </span> : : }</a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x100, 0x280);</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x100, 0x180) at 0x%x\n&quot;,</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0xfc, 0x105, miss == -1 ? 0 : miss);</span></a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x27c, 0x285, miss == -1 ? 0 : miss);</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : }</a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : /* Test 7: Erase 1.5 blocks (end aligned) */</a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x80, 0x180)) {</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x80, 0x180)\n&quot;);</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : }</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x80, 0x200);</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x80, 0x180) at 0x%x\n&quot;,</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x7c, 0x85, miss == -1 ? 0 : miss);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x1fc, 0x205, miss == -1 ? 0 : miss);</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="407"><span class="lineNum"> 407 </span> : : }</a>
+<a name="408"><span class="lineNum"> 408 </span> : : </a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> : : /* Test 8: Erase a big section, not aligned */</a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 1 : if (blocklevel_smart_erase(bl, 0x120, 0x544)) {</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Failed to blocklevel_smart_erase(0x120, 0x544)\n&quot;);</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="414"><span class="lineNum"> 414 </span> : : }</a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 1 : miss = check_buf(buf, 0x120, 0x664);</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 1 : if (miss) {</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer mismatch after blocklevel_smart_erase(0x120, 0x544) at 0x%x\n&quot;,</span></a>
+<a name="418"><span class="lineNum"> 418 </span> : : miss == -1 ? 0 : miss);</a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x11c, 0x125, miss == -1 ? 0 : miss);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : dump_buf(buf, 0x65f, 0x669, miss == -1 ? 0 : miss);</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : }</a>
+<a name="423"><span class="lineNum"> 423 </span> : : </a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 1 : bl_mem.priv = buf;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 1 : reset_buf(buf);</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 257 : for (i = 0; i &lt; 0x100; i++)</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 256 : data[i] = i;</span></a>
+<a name="429"><span class="lineNum"> 429 </span> : : </a>
+<a name="430"><span class="lineNum"> 430 </span> : : /* This really shouldn't fail */</a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 1 : rc = blocklevel_ecc_protect(bl, 0, 0x100);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_ecc_protect(0, 0x100)\n&quot;);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 1 : rc = blocklevel_write(bl, 0, data, 0x100);</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write(0, 0x100)\n&quot;);</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="441"><span class="lineNum"> 441 </span> : : }</a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineCov"> 1 : rc = blocklevel_write(bl, 0x200, data, 0x100);</span></a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write(0x200, 0x100)\n&quot;);</span></a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="447"><span class="lineNum"> 447 </span> : : }</a>
+<a name="448"><span class="lineNum"> 448 </span> : : </a>
+<a name="449"><span class="lineNum"> 449 </span> : : /*</a>
+<a name="450"><span class="lineNum"> 450 </span> : : * 0x50 once adjusted for the presence of ECC becomes 0x5a which</a>
+<a name="451"><span class="lineNum"> 451 </span> : : * is ECC aligned.</a>
+<a name="452"><span class="lineNum"> 452 </span> : : */</a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x50, with_ecc, 8);</span></a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x50, 8) with ecc rc=%d\n&quot;, rc);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : }</a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x250, without_ecc, 8);</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x250, 8) without ecc rc=%d\n&quot;, rc);</span></a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="462"><span class="lineNum"> 462 </span> : : }</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, without_ecc, 8) || memcmp(with_ecc, &amp;data[0x50], 8)) {</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECC read and non-ECC read don't match or are wrong line: %d\n&quot;, __LINE__);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 8);</span></a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineNoCov"> 0 : print_ptr(without_ecc, 8);</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[50], 8);</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : }</a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> : : /*</a>
+<a name="473"><span class="lineNum"> 473 </span> : : * 0x50 once adjusted for the presence of ECC becomes 0x5a which</a>
+<a name="474"><span class="lineNum"> 474 </span> : : * is ECC aligned.</a>
+<a name="475"><span class="lineNum"> 475 </span> : : * So 0x4f won't be aligned!</a>
+<a name="476"><span class="lineNum"> 476 </span> : : */</a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x4f, with_ecc, 8);</span></a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x4f, 8) with ecc %d\n&quot;, rc);</span></a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="481"><span class="lineNum"> 481 </span> : : }</a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x24f, without_ecc, 8);</span></a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x24f, 8) without ecc %d\n&quot;, rc);</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : }</a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, without_ecc, 8) || memcmp(with_ecc, &amp;data[0x4f], 8)) {</span></a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECC read and non-ECC read don't match or are wrong line: %d\n&quot;, __LINE__);</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 8);</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : print_ptr(without_ecc, 8);</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[0x4f], 8);</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> : : }</a>
+<a name="495"><span class="lineNum"> 495 </span> : : </a>
+<a name="496"><span class="lineNum"> 496 </span> : : /*</a>
+<a name="497"><span class="lineNum"> 497 </span> : : * 0x50 once adjusted for the presence of ECC becomes 0x5a which</a>
+<a name="498"><span class="lineNum"> 498 </span> : : * is ECC aligned.</a>
+<a name="499"><span class="lineNum"> 499 </span> : : */</a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x50, with_ecc, 16);</span></a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x50, 16) with ecc %d\n&quot;, rc);</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="504"><span class="lineNum"> 504 </span> : : }</a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x250, without_ecc, 16);</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x250, 16) without ecc %d\n&quot;, rc);</span></a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="509"><span class="lineNum"> 509 </span> : : }</a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, without_ecc, 16)|| memcmp(with_ecc, &amp;data[0x50], 16)) {</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : ERR(&quot;(long read )ECC read and non-ECC read don't match or are wrong line: %d\n&quot;, __LINE__);</span></a>
+<a name="512"><span class="lineNum"> 512 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 16);</span></a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : print_ptr(without_ecc, 16);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[0x50], 16);</span></a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="517"><span class="lineNum"> 517 </span> : : }</a>
+<a name="518"><span class="lineNum"> 518 </span> : : </a>
+<a name="519"><span class="lineNum"> 519 </span> : : /*</a>
+<a name="520"><span class="lineNum"> 520 </span> : : * 0x50 once adjusted for the presence of ECC becomes 0x5a which</a>
+<a name="521"><span class="lineNum"> 521 </span> : : * is ECC aligned. So 4f won't be.</a>
+<a name="522"><span class="lineNum"> 522 </span> : : */</a>
+<a name="523"><span class="lineNum"> 523 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x4f, with_ecc, 24);</span></a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="525"><span class="lineNum"> 525 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x4f, 24) with ecc %d\n&quot;, rc);</span></a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="527"><span class="lineNum"> 527 </span> : : }</a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x24f, without_ecc, 24);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x24f, 24) without ecc %d\n&quot;, rc);</span></a>
+<a name="531"><span class="lineNum"> 531 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="532"><span class="lineNum"> 532 </span> : : }</a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, without_ecc, 24)|| memcmp(with_ecc, &amp;data[0x4f], 24)) {</span></a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : ERR(&quot;(long read )ECC read and non-ECC read don't match or are wrong: %d\n&quot;, __LINE__);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 24);</span></a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : print_ptr(without_ecc, 24);</span></a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[0x4f], 24);</span></a>
+<a name="538"><span class="lineNum"> 538 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : }</a>
+<a name="541"><span class="lineNum"> 541 </span> : : </a>
+<a name="542"><span class="lineNum"> 542 </span> : : /*</a>
+<a name="543"><span class="lineNum"> 543 </span> : : * Now lets try to write at non ECC aligned positions</a>
+<a name="544"><span class="lineNum"> 544 </span> : : * Go easy first, 0x50 becomes 0x5a which is ECC byte aligned but</a>
+<a name="545"><span class="lineNum"> 545 </span> : : * not aligned to the start of the partition</a>
+<a name="546"><span class="lineNum"> 546 </span> : : */</a>
+<a name="547"><span class="lineNum"> 547 </span> : : </a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineCov"> 1 : rc = blocklevel_write(bl, 0x50, data, 0xb0);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write()\n&quot;);</span></a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="552"><span class="lineNum"> 552 </span> : : }</a>
+<a name="553"><span class="lineNum"> 553 </span> : : /* Read 8 bytes before to make sure we didn't ruin that */</a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x48, with_ecc, 24);</span></a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read() with ecc %d\n&quot;, rc);</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="558"><span class="lineNum"> 558 </span> : : }</a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, data + 0x48, 8) || memcmp(with_ecc + 1, data, 16)) {</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't read back what we thought we wrote line: %d\n&quot;, __LINE__);</span></a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 24);</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[0x48], 8);</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineNoCov"> 0 : print_ptr(data, 16);</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="566"><span class="lineNum"> 566 </span> : : }</a>
+<a name="567"><span class="lineNum"> 567 </span> : : </a>
+<a name="568"><span class="lineNum"> 568 </span> : : /* Ok lets get tricky */</a>
+<a name="569"><span class="lineNum"> 569 </span> :<span class="lineCov"> 1 : rc = blocklevel_write(bl, 0x31, data, 0xcf);</span></a>
+<a name="570"><span class="lineNum"> 570 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write(0x31, 0xcf)\n&quot;);</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="573"><span class="lineNum"> 573 </span> : : }</a>
+<a name="574"><span class="lineNum"> 574 </span> : : /* Read 8 bytes before to make sure we didn't ruin that */</a>
+<a name="575"><span class="lineNum"> 575 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0x29, with_ecc, 24);</span></a>
+<a name="576"><span class="lineNum"> 576 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0x29, 24) with ecc rc=%d\n&quot;, rc);</span></a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="579"><span class="lineNum"> 579 </span> : : }</a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, &amp;data[0x29], 8) || memcmp(with_ecc + 1, data, 16)) {</span></a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't read back what we thought we wrote line: %d\n&quot;, __LINE__);</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 24);</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[0x29], 8);</span></a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineNoCov"> 0 : print_ptr(data, 16);</span></a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="587"><span class="lineNum"> 587 </span> : : }</a>
+<a name="588"><span class="lineNum"> 588 </span> : : </a>
+<a name="589"><span class="lineNum"> 589 </span> : : /*</a>
+<a name="590"><span class="lineNum"> 590 </span> : : * Rewrite the pattern that we've messed up</a>
+<a name="591"><span class="lineNum"> 591 </span> : : */</a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 1 : rc = blocklevel_write(bl, 0, data, 0x100);</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write(0, 0x100) to reset\n&quot;);</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : }</a>
+<a name="597"><span class="lineNum"> 597 </span> : : </a>
+<a name="598"><span class="lineNum"> 598 </span> : : /* Be unalignmed as possible from now on, starting somewhat easy */</a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0, with_ecc, 5);</span></a>
+<a name="600"><span class="lineNum"> 600 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write(0, 5)\n&quot;);</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="603"><span class="lineNum"> 603 </span> : : }</a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, data, 5)) {</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_read 5, 0) didn't match line: %d\n&quot;, __LINE__);</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 5);</span></a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : print_ptr(data, 5);</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : }</a>
+<a name="611"><span class="lineNum"> 611 </span> : : </a>
+<a name="612"><span class="lineNum"> 612 </span> : : /* 39 is neither divisible by 8 or by 9 */</a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 39, with_ecc, 5);</span></a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write(39, 5)\n&quot;);</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : }</a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, &amp;data[39], 5)) {</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_read(5, 39() didn't match line: %d\n&quot;, __LINE__);</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 5);</span></a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[39], 5);</span></a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : }</a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 0xb, &amp;with_ecc, 39);</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(0xb, 39)\n&quot;);</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : }</a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, &amp;data[0xb], 39)) {</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Strange sized and positioned read failed, blocklevel_read(0xb, 39) line: %d\n&quot;, __LINE__);</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 39);</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[0xb], 39);</span></a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="637"><span class="lineNum"> 637 </span> : : }</a>
+<a name="638"><span class="lineNum"> 638 </span> : : </a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineCov"> 1 : rc = blocklevel_write(bl, 39, data, 50);</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_write(39, 50)\n&quot;);</span></a>
+<a name="642"><span class="lineNum"> 642 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="643"><span class="lineNum"> 643 </span> : : }</a>
+<a name="644"><span class="lineNum"> 644 </span> : : </a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 1 : rc = blocklevel_read(bl, 32, with_ecc, 39);</span></a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="647"><span class="lineNum"> 647 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Couldn't blocklevel_read(32, 39)\n&quot;);</span></a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="649"><span class="lineNum"> 649 </span> : : }</a>
+<a name="650"><span class="lineNum"> 650 </span> : : </a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 1 : if (memcmp(with_ecc, &amp;data[32], 7) || memcmp(((char *)with_ecc) + 7, data, 32)) {</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Read back of odd placed/odd sized write failed, blocklevel_read(32, 39) line: %d\n&quot;, __LINE__);</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : print_ptr(with_ecc, 39);</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : print_ptr(&amp;data[32], 7);</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineNoCov"> 0 : print_ptr(data, 32);</span></a>
+<a name="656"><span class="lineNum"> 656 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="658"><span class="lineNum"> 658 </span> : : }</a>
+<a name="659"><span class="lineNum"> 659 </span> : : </a>
+<a name="660"><span class="lineNum"> 660 </span> :<span class="lineCov"> 1 : out:</span></a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 1 : free(data);</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-ecc.c.func-sort-c.html b/coverage-report/libflash/test/test-ecc.c.func-sort-c.html
new file mode 100644
index 0000000..1f80891
--- /dev/null
+++ b/coverage-report/libflash/test/test-ecc.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-ecc.c<span style="font-size: 80%;"> (<a href="test-ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">88</td>
+ <td class="headerCovTableEntryLo">51.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="test-ecc.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ecc.c.gcov.html#353">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-ecc.c.func.html b/coverage-report/libflash/test/test-ecc.c.func.html
new file mode 100644
index 0000000..e494194
--- /dev/null
+++ b/coverage-report/libflash/test/test-ecc.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-ecc.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-ecc.c<span style="font-size: 80%;"> (<a href="test-ecc.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">88</td>
+ <td class="headerCovTableEntryLo">51.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="test-ecc.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ecc.c.gcov.html#353">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-ecc.c.gcov.html b/coverage-report/libflash/test/test-ecc.c.gcov.html
new file mode 100644
index 0000000..93766b7
--- /dev/null
+++ b/coverage-report/libflash/test/test-ecc.c.gcov.html
@@ -0,0 +1,595 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-ecc.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-ecc.c<span style="font-size: 80%;"> (source / <a href="test-ecc.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">45</td>
+ <td class="headerCovTableEntry">88</td>
+ <td class="headerCovTableEntryLo">51.1 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;libflash/ecc.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;../ecc.c&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #define __unused __attribute__((unused))</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define ERR(fmt...) fprintf(stderr, fmt)</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define NUM_ECC_ROWS 320</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : /*</a>
+<a name="20"><span class="lineNum"> 20 </span> : : * Note this data is big endian as this is what the ecc code expects.</a>
+<a name="21"><span class="lineNum"> 21 </span> : : * The ECC code returns IBM bit numbers assuming the word was in CPU</a>
+<a name="22"><span class="lineNum"> 22 </span> : : * endian!</a>
+<a name="23"><span class="lineNum"> 23 </span> : : */</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : /* 8 data bytes 1 ecc byte per row */</a>
+<a name="26"><span class="lineNum"> 26 </span> : : struct ecc64 ecc_data[] = {</a>
+<a name="27"><span class="lineNum"> 27 </span> : : { 0xfeffffffffffffff, 0x00 }, /* This row will have ecc correct bit 63 */</a>
+<a name="28"><span class="lineNum"> 28 </span> : : { 0xfdffffffffffffff, 0x00 }, /* This row will have ecc correct bit 62 */</a>
+<a name="29"><span class="lineNum"> 29 </span> : : { 0xfbffffffffffffff, 0x00 }, /* This row will have ecc correct bit 61 */</a>
+<a name="30"><span class="lineNum"> 30 </span> : : { 0xf7ffffffffffffff, 0x00 }, /* This row will have ecc correct bit 60 */</a>
+<a name="31"><span class="lineNum"> 31 </span> : : { 0xefffffffffffffff, 0x00 }, /* This row will have ecc correct bit 59 */</a>
+<a name="32"><span class="lineNum"> 32 </span> : : { 0xdfffffffffffffff, 0x00 }, /* This row will have ecc correct bit 58 */</a>
+<a name="33"><span class="lineNum"> 33 </span> : : { 0xbfffffffffffffff, 0x00 }, /* This row will have ecc correct bit 57 */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : { 0x7fffffffffffffff, 0x00 }, /* This row will have ecc correct bit 56 */</a>
+<a name="35"><span class="lineNum"> 35 </span> : : { 0xfffeffffffffffff, 0x00 }, /* This row will have ecc correct bit 55 */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : { 0xfffdffffffffffff, 0x00 }, /* This row will have ecc correct bit 54 */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : { 0xfffbffffffffffff, 0x00 }, /* This row will have ecc correct bit 53 */</a>
+<a name="38"><span class="lineNum"> 38 </span> : : { 0xfff7ffffffffffff, 0x00 }, /* This row will have ecc correct bit 52 */</a>
+<a name="39"><span class="lineNum"> 39 </span> : : { 0xffefffffffffffff, 0x00 }, /* This row will have ecc correct bit 51 */</a>
+<a name="40"><span class="lineNum"> 40 </span> : : { 0xffdfffffffffffff, 0x00 }, /* This row will have ecc correct bit 50 */</a>
+<a name="41"><span class="lineNum"> 41 </span> : : { 0xffbfffffffffffff, 0x00 }, /* This row will have ecc correct bit 49 */</a>
+<a name="42"><span class="lineNum"> 42 </span> : : { 0xff7fffffffffffff, 0x00 }, /* This row will have ecc correct bit 48 */</a>
+<a name="43"><span class="lineNum"> 43 </span> : : { 0xfffffeffffffffff, 0x00 }, /* This row will have ecc correct bit 47 */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : { 0xfffffdffffffffff, 0x00 }, /* This row will have ecc correct bit 46 */</a>
+<a name="45"><span class="lineNum"> 45 </span> : : { 0xfffffbffffffffff, 0x00 }, /* This row will have ecc correct bit 45 */</a>
+<a name="46"><span class="lineNum"> 46 </span> : : { 0xfffff7ffffffffff, 0x00 }, /* This row will have ecc correct bit 44 */</a>
+<a name="47"><span class="lineNum"> 47 </span> : : { 0xffffefffffffffff, 0x00 }, /* This row will have ecc correct bit 43 */</a>
+<a name="48"><span class="lineNum"> 48 </span> : : { 0xffffdfffffffffff, 0x00 }, /* This row will have ecc correct bit 42 */</a>
+<a name="49"><span class="lineNum"> 49 </span> : : { 0xffffbfffffffffff, 0x00 }, /* This row will have ecc correct bit 41 */</a>
+<a name="50"><span class="lineNum"> 50 </span> : : { 0xffff7fffffffffff, 0x00 }, /* This row will have ecc correct bit 40 */</a>
+<a name="51"><span class="lineNum"> 51 </span> : : { 0xfffffffeffffffff, 0x00 }, /* This row will have ecc correct bit 39 */</a>
+<a name="52"><span class="lineNum"> 52 </span> : : { 0xfffffffdffffffff, 0x00 }, /* This row will have ecc correct bit 38 */</a>
+<a name="53"><span class="lineNum"> 53 </span> : : { 0xfffffffbffffffff, 0x00 }, /* This row will have ecc correct bit 37 */</a>
+<a name="54"><span class="lineNum"> 54 </span> : : { 0xfffffff7ffffffff, 0x00 }, /* This row will have ecc correct bit 36 */</a>
+<a name="55"><span class="lineNum"> 55 </span> : : { 0xffffffefffffffff, 0x00 }, /* This row will have ecc correct bit 35 */</a>
+<a name="56"><span class="lineNum"> 56 </span> : : { 0xffffffdfffffffff, 0x00 }, /* This row will have ecc correct bit 34 */</a>
+<a name="57"><span class="lineNum"> 57 </span> : : { 0xffffffbfffffffff, 0x00 }, /* This row will have ecc correct bit 33 */</a>
+<a name="58"><span class="lineNum"> 58 </span> : : { 0xffffff7fffffffff, 0x00 }, /* This row will have ecc correct bit 32 */</a>
+<a name="59"><span class="lineNum"> 59 </span> : : { 0xfffffffffeffffff, 0x00 }, /* This row will have ecc correct bit 31 */</a>
+<a name="60"><span class="lineNum"> 60 </span> : : { 0xfffffffffdffffff, 0x00 }, /* This row will have ecc correct bit 30 */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : { 0xfffffffffbffffff, 0x00 }, /* This row will have ecc correct bit 29 */</a>
+<a name="62"><span class="lineNum"> 62 </span> : : { 0xfffffffff7ffffff, 0x00 }, /* This row will have ecc correct bit 28 */</a>
+<a name="63"><span class="lineNum"> 63 </span> : : { 0xffffffffefffffff, 0x00 }, /* This row will have ecc correct bit 27 */</a>
+<a name="64"><span class="lineNum"> 64 </span> : : { 0xffffffffdfffffff, 0x00 }, /* This row will have ecc correct bit 26 */</a>
+<a name="65"><span class="lineNum"> 65 </span> : : { 0xffffffffbfffffff, 0x00 }, /* This row will have ecc correct bit 25 */</a>
+<a name="66"><span class="lineNum"> 66 </span> : : { 0xffffffff7fffffff, 0x00 }, /* This row will have ecc correct bit 24 */</a>
+<a name="67"><span class="lineNum"> 67 </span> : : { 0xfffffffffffeffff, 0x00 }, /* This row will have ecc correct bit 23 */</a>
+<a name="68"><span class="lineNum"> 68 </span> : : { 0xfffffffffffdffff, 0x00 }, /* This row will have ecc correct bit 22 */</a>
+<a name="69"><span class="lineNum"> 69 </span> : : { 0xfffffffffffbffff, 0x00 }, /* This row will have ecc correct bit 21 */</a>
+<a name="70"><span class="lineNum"> 70 </span> : : { 0xfffffffffff7ffff, 0x00 }, /* This row will have ecc correct bit 20 */</a>
+<a name="71"><span class="lineNum"> 71 </span> : : { 0xffffffffffefffff, 0x00 }, /* This row will have ecc correct bit 19 */</a>
+<a name="72"><span class="lineNum"> 72 </span> : : { 0xffffffffffdfffff, 0x00 }, /* This row will have ecc correct bit 18 */</a>
+<a name="73"><span class="lineNum"> 73 </span> : : { 0xffffffffffbfffff, 0x00 }, /* This row will have ecc correct bit 17 */</a>
+<a name="74"><span class="lineNum"> 74 </span> : : { 0xffffffffff7fffff, 0x00 }, /* This row will have ecc correct bit 16 */</a>
+<a name="75"><span class="lineNum"> 75 </span> : : { 0xfffffffffffffeff, 0x00 }, /* This row will have ecc correct bit 15 */</a>
+<a name="76"><span class="lineNum"> 76 </span> : : { 0xfffffffffffffdff, 0x00 }, /* This row will have ecc correct bit 14 */</a>
+<a name="77"><span class="lineNum"> 77 </span> : : { 0xfffffffffffffbff, 0x00 }, /* This row will have ecc correct bit 13 */</a>
+<a name="78"><span class="lineNum"> 78 </span> : : { 0xfffffffffffff7ff, 0x00 }, /* This row will have ecc correct bit 12 */</a>
+<a name="79"><span class="lineNum"> 79 </span> : : { 0xffffffffffffefff, 0x00 }, /* This row will have ecc correct bit 11 */</a>
+<a name="80"><span class="lineNum"> 80 </span> : : { 0xffffffffffffdfff, 0x00 }, /* This row will have ecc correct bit 10 */</a>
+<a name="81"><span class="lineNum"> 81 </span> : : { 0xffffffffffffbfff, 0x00 }, /* This row will have ecc correct bit 9 */</a>
+<a name="82"><span class="lineNum"> 82 </span> : : { 0xffffffffffff7fff, 0x00 }, /* This row will have ecc correct bit 8 */</a>
+<a name="83"><span class="lineNum"> 83 </span> : : { 0xfffffffffffffffe, 0x00 }, /* This row will have ecc correct bit 7 */</a>
+<a name="84"><span class="lineNum"> 84 </span> : : { 0xfffffffffffffffd, 0x00 }, /* This row will have ecc correct bit 6 */</a>
+<a name="85"><span class="lineNum"> 85 </span> : : { 0xfffffffffffffffb, 0x00 }, /* This row will have ecc correct bit 5 */</a>
+<a name="86"><span class="lineNum"> 86 </span> : : { 0xfffffffffffffff7, 0x00 }, /* This row will have ecc correct bit 4 */</a>
+<a name="87"><span class="lineNum"> 87 </span> : : { 0xffffffffffffffef, 0x00 }, /* This row will have ecc correct bit 3 */</a>
+<a name="88"><span class="lineNum"> 88 </span> : : { 0xffffffffffffffdf, 0x00 }, /* This row will have ecc correct bit 2 */</a>
+<a name="89"><span class="lineNum"> 89 </span> : : { 0xffffffffffffffbf, 0x00 }, /* This row will have ecc correct bit 1 */</a>
+<a name="90"><span class="lineNum"> 90 </span> : : { 0xffffffffffffff7f, 0x00 }, /* This row will have ecc correct bit 0 */</a>
+<a name="91"><span class="lineNum"> 91 </span> : : /*</a>
+<a name="92"><span class="lineNum"> 92 </span> : : * 'Randomised' input into eccgenerate 0x54f7c5d1 was seeded to rand()</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * Note: eccgenerate from skiboot commit 6cfaa3ba1015c6ac9cc4a06f878b4289022cff54</a>
+<a name="94"><span class="lineNum"> 94 </span> : : * was used to generate these ecc numbers</a>
+<a name="95"><span class="lineNum"> 95 </span> : : */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : { 0x29d87c7c8ab7d46d, 0xb9 }, /* Use this row to check eccgenerate() */</a>
+<a name="97"><span class="lineNum"> 97 </span> : : { 0x9064174098381641, 0x3b }, /* Use this row to check eccgenerate() */</a>
+<a name="98"><span class="lineNum"> 98 </span> : : { 0x77fd7d2fc7d22154, 0xe4 }, /* Use this row to check eccgenerate() */</a>
+<a name="99"><span class="lineNum"> 99 </span> : : { 0x6b02ba39b64a6168, 0xbf }, /* Use this row to check eccgenerate() */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : { 0x68fa9c633eef0544, 0x2a }, /* Use this row to check eccgenerate() */</a>
+<a name="101"><span class="lineNum"> 101 </span> : : { 0xe814b258b3f92e55, 0x35 }, /* Use this row to check eccgenerate() */</a>
+<a name="102"><span class="lineNum"> 102 </span> : : { 0xc3e2bd658db4db6d, 0xda }, /* Use this row to check eccgenerate() */</a>
+<a name="103"><span class="lineNum"> 103 </span> : : { 0xe1dd487b6209876a, 0x45 }, /* Use this row to check eccgenerate() */</a>
+<a name="104"><span class="lineNum"> 104 </span> : : { 0x309f9e6b91831433, 0xe4 }, /* Use this row to check eccgenerate() */</a>
+<a name="105"><span class="lineNum"> 105 </span> : : { 0xd8b77d39f4d66410, 0x6c }, /* Use this row to check eccgenerate() */</a>
+<a name="106"><span class="lineNum"> 106 </span> : : { 0x83ba293cf30a9e6a, 0xc9 }, /* Use this row to check eccgenerate() */</a>
+<a name="107"><span class="lineNum"> 107 </span> : : { 0x3aeaef79af97ec1a, 0x09 }, /* Use this row to check eccgenerate() */</a>
+<a name="108"><span class="lineNum"> 108 </span> : : { 0xa90ef431e4778c43, 0x91 }, /* Use this row to check eccgenerate() */</a>
+<a name="109"><span class="lineNum"> 109 </span> : : { 0xa74bbf1e6b6fda00, 0xc5 }, /* Use this row to check eccgenerate() */</a>
+<a name="110"><span class="lineNum"> 110 </span> : : { 0x67b5a872efa57c30, 0xb9 }, /* Use this row to check eccgenerate() */</a>
+<a name="111"><span class="lineNum"> 111 </span> : : { 0x795d511e3605ff67, 0x03 }, /* Use this row to check eccgenerate() */</a>
+<a name="112"><span class="lineNum"> 112 </span> : : { 0xce3d1529918d256f, 0x36 }, /* Use this row to check eccgenerate() */</a>
+<a name="113"><span class="lineNum"> 113 </span> : : { 0x586047430ac2685e, 0xab }, /* Use this row to check eccgenerate() */</a>
+<a name="114"><span class="lineNum"> 114 </span> : : { 0xc00cca46463b9358, 0x42 }, /* Use this row to check eccgenerate() */</a>
+<a name="115"><span class="lineNum"> 115 </span> : : { 0x842a991cc362017d, 0xb2 }, /* Use this row to check eccgenerate() */</a>
+<a name="116"><span class="lineNum"> 116 </span> : : { 0x765c30522807672a, 0x26 }, /* Use this row to check eccgenerate() */</a>
+<a name="117"><span class="lineNum"> 117 </span> : : { 0xb5bb42186c3f4b75, 0x2b }, /* Use this row to check eccgenerate() */</a>
+<a name="118"><span class="lineNum"> 118 </span> : : { 0xce48d25f393fee37, 0x90 }, /* Use this row to check eccgenerate() */</a>
+<a name="119"><span class="lineNum"> 119 </span> : : { 0xcbc2026b96998b13, 0x40 }, /* Use this row to check eccgenerate() */</a>
+<a name="120"><span class="lineNum"> 120 </span> : : { 0x8b70f023ffe7704b, 0x23 }, /* Use this row to check eccgenerate() */</a>
+<a name="121"><span class="lineNum"> 121 </span> : : { 0xf2f20e36a37a8024, 0x19 }, /* Use this row to check eccgenerate() */</a>
+<a name="122"><span class="lineNum"> 122 </span> : : { 0x52126d3f0e2b1a60, 0xa0 }, /* Use this row to check eccgenerate() */</a>
+<a name="123"><span class="lineNum"> 123 </span> : : { 0xf2a2a6232dddfe2f, 0xc4 }, /* Use this row to check eccgenerate() */</a>
+<a name="124"><span class="lineNum"> 124 </span> : : { 0x984cd930fb206171, 0xa5 }, /* Use this row to check eccgenerate() */</a>
+<a name="125"><span class="lineNum"> 125 </span> : : { 0xeac6dd2199ee6542, 0xea }, /* Use this row to check eccgenerate() */</a>
+<a name="126"><span class="lineNum"> 126 </span> : : { 0xd0f3642aff018223, 0x3b }, /* Use this row to check eccgenerate() */</a>
+<a name="127"><span class="lineNum"> 127 </span> : : { 0x908fa71263242f40, 0x0a }, /* Use this row to check eccgenerate() */</a>
+<a name="128"><span class="lineNum"> 128 </span> : : { 0x6de6971e9e317a53, 0xa6 }, /* Use this row to check eccgenerate() */</a>
+<a name="129"><span class="lineNum"> 129 </span> : : { 0xe46c0d2ce8efee55, 0xa4 }, /* Use this row to check eccgenerate() */</a>
+<a name="130"><span class="lineNum"> 130 </span> : : { 0xab52f0522df36165, 0x06 }, /* Use this row to check eccgenerate() */</a>
+<a name="131"><span class="lineNum"> 131 </span> : : { 0x55fac80f6997a648, 0x9a }, /* Use this row to check eccgenerate() */</a>
+<a name="132"><span class="lineNum"> 132 </span> : : { 0xd5d6f13d21af2025, 0xed }, /* Use this row to check eccgenerate() */</a>
+<a name="133"><span class="lineNum"> 133 </span> : : { 0x5bee0e5d0bb60b28, 0x66 }, /* Use this row to check eccgenerate() */</a>
+<a name="134"><span class="lineNum"> 134 </span> : : { 0xa14f973ba41fc41d, 0xa8 }, /* Use this row to check eccgenerate() */</a>
+<a name="135"><span class="lineNum"> 135 </span> : : { 0xa307356926b11148, 0x5a }, /* Use this row to check eccgenerate() */</a>
+<a name="136"><span class="lineNum"> 136 </span> : : { 0xc92b926c2cc0875f, 0x7e }, /* Use this row to check eccgenerate() */</a>
+<a name="137"><span class="lineNum"> 137 </span> : : { 0x3aeba13f95fa431f, 0x92 }, /* Use this row to check eccgenerate() */</a>
+<a name="138"><span class="lineNum"> 138 </span> : : { 0xc2d7424f1b3eff2b, 0xe6 }, /* Use this row to check eccgenerate() */</a>
+<a name="139"><span class="lineNum"> 139 </span> : : { 0x165f601d2c8e4863, 0x2b }, /* Use this row to check eccgenerate() */</a>
+<a name="140"><span class="lineNum"> 140 </span> : : { 0xc67cae255a241c00, 0x78 }, /* Use this row to check eccgenerate() */</a>
+<a name="141"><span class="lineNum"> 141 </span> : : { 0x5a269e2300263e3f, 0x07 }, /* Use this row to check eccgenerate() */</a>
+<a name="142"><span class="lineNum"> 142 </span> : : { 0x634a6d7f96701350, 0xe9 }, /* Use this row to check eccgenerate() */</a>
+<a name="143"><span class="lineNum"> 143 </span> : : { 0x34a28d23eab54536, 0xd2 }, /* Use this row to check eccgenerate() */</a>
+<a name="144"><span class="lineNum"> 144 </span> : : { 0xd3a5340cd130051e, 0x48 }, /* Use this row to check eccgenerate() */</a>
+<a name="145"><span class="lineNum"> 145 </span> : : { 0xfe236703190f9b4f, 0x7e }, /* Use this row to check eccgenerate() */</a>
+<a name="146"><span class="lineNum"> 146 </span> : : { 0x82a641187ef8245f, 0x20 }, /* Use this row to check eccgenerate() */</a>
+<a name="147"><span class="lineNum"> 147 </span> : : { 0xa0a74504541e3013, 0xc7 }, /* Use this row to check eccgenerate() */</a>
+<a name="148"><span class="lineNum"> 148 </span> : : { 0x5fd43b3b577d3356, 0x85 }, /* Use this row to check eccgenerate() */</a>
+<a name="149"><span class="lineNum"> 149 </span> : : { 0xfb9cf773fb955461, 0x06 }, /* Use this row to check eccgenerate() */</a>
+<a name="150"><span class="lineNum"> 150 </span> : : { 0x214766290024d376, 0x80 }, /* Use this row to check eccgenerate() */</a>
+<a name="151"><span class="lineNum"> 151 </span> : : { 0x2de45a569ea42c5d, 0x22 }, /* Use this row to check eccgenerate() */</a>
+<a name="152"><span class="lineNum"> 152 </span> : : { 0x349f707cea72f815, 0xf3 }, /* Use this row to check eccgenerate() */</a>
+<a name="153"><span class="lineNum"> 153 </span> : : { 0x05b1f74167cffc15, 0xe9 }, /* Use this row to check eccgenerate() */</a>
+<a name="154"><span class="lineNum"> 154 </span> : : { 0x945d4579f676b34b, 0x63 }, /* Use this row to check eccgenerate() */</a>
+<a name="155"><span class="lineNum"> 155 </span> : : { 0x519bcf4b1b10585f, 0x47 }, /* Use this row to check eccgenerate() */</a>
+<a name="156"><span class="lineNum"> 156 </span> : : { 0x1b36961e5adaf31e, 0x25 }, /* Use this row to check eccgenerate() */</a>
+<a name="157"><span class="lineNum"> 157 </span> : : { 0xf04a076fabc16d6f, 0x20 }, /* Use this row to check eccgenerate() */</a>
+<a name="158"><span class="lineNum"> 158 </span> : : { 0x9577b3257e80031e, 0xef }, /* Use this row to check eccgenerate() */</a>
+<a name="159"><span class="lineNum"> 159 </span> : : { 0x4fb1083c24ed9412, 0x97 }, /* Use this row to check eccgenerate() */</a>
+<a name="160"><span class="lineNum"> 160 </span> : : { 0x3dfc2f62681de831, 0x1f }, /* Use this row to check eccgenerate() */</a>
+<a name="161"><span class="lineNum"> 161 </span> : : { 0xe7150d114ed56f3f, 0x10 }, /* Use this row to check eccgenerate() */</a>
+<a name="162"><span class="lineNum"> 162 </span> : : { 0xa2f39f52bfa2717a, 0x40 }, /* Use this row to check eccgenerate() */</a>
+<a name="163"><span class="lineNum"> 163 </span> : : { 0x1720a55087bd5215, 0xb3 }, /* Use this row to check eccgenerate() */</a>
+<a name="164"><span class="lineNum"> 164 </span> : : { 0x8253a77601c8db0d, 0x45 }, /* Use this row to check eccgenerate() */</a>
+<a name="165"><span class="lineNum"> 165 </span> : : { 0x01ecae0412bd9c44, 0x5f }, /* Use this row to check eccgenerate() */</a>
+<a name="166"><span class="lineNum"> 166 </span> : : { 0xb161c921a39a0d20, 0x51 }, /* Use this row to check eccgenerate() */</a>
+<a name="167"><span class="lineNum"> 167 </span> : : { 0x8d0d06362ed0095b, 0x94 }, /* Use this row to check eccgenerate() */</a>
+<a name="168"><span class="lineNum"> 168 </span> : : { 0x969f0671e5003a1e, 0x9b }, /* Use this row to check eccgenerate() */</a>
+<a name="169"><span class="lineNum"> 169 </span> : : { 0xdb77ed6992befd77, 0x63 }, /* Use this row to check eccgenerate() */</a>
+<a name="170"><span class="lineNum"> 170 </span> : : { 0xadce55572afd4b6a, 0x3e }, /* Use this row to check eccgenerate() */</a>
+<a name="171"><span class="lineNum"> 171 </span> : : { 0x84d73f092c13bd35, 0x50 }, /* Use this row to check eccgenerate() */</a>
+<a name="172"><span class="lineNum"> 172 </span> : : { 0xd7d42a25c804ec75, 0x05 }, /* Use this row to check eccgenerate() */</a>
+<a name="173"><span class="lineNum"> 173 </span> : : { 0x4685ef1374224778, 0x72 }, /* Use this row to check eccgenerate() */</a>
+<a name="174"><span class="lineNum"> 174 </span> : : { 0x980fdc0a6d4cde4a, 0x9d }, /* Use this row to check eccgenerate() */</a>
+<a name="175"><span class="lineNum"> 175 </span> : : { 0xd569c67c9636f84f, 0x81 }, /* Use this row to check eccgenerate() */</a>
+<a name="176"><span class="lineNum"> 176 </span> : : { 0xe40b680fd60b0c6d, 0x2c }, /* Use this row to check eccgenerate() */</a>
+<a name="177"><span class="lineNum"> 177 </span> : : { 0x95ae7d67bc7fd30d, 0x72 }, /* Use this row to check eccgenerate() */</a>
+<a name="178"><span class="lineNum"> 178 </span> : : { 0x433d262386ff0762, 0xf4 }, /* Use this row to check eccgenerate() */</a>
+<a name="179"><span class="lineNum"> 179 </span> : : { 0x87c7e36facce2238, 0x5a }, /* Use this row to check eccgenerate() */</a>
+<a name="180"><span class="lineNum"> 180 </span> : : { 0xbf8bbf7cc590cd19, 0xe0 }, /* Use this row to check eccgenerate() */</a>
+<a name="181"><span class="lineNum"> 181 </span> : : { 0x682bdb3988b39274, 0x4f }, /* Use this row to check eccgenerate() */</a>
+<a name="182"><span class="lineNum"> 182 </span> : : { 0xb7839c4f70ed881e, 0x6b }, /* Use this row to check eccgenerate() */</a>
+<a name="183"><span class="lineNum"> 183 </span> : : { 0x55eec23cf538e16f, 0x72 }, /* Use this row to check eccgenerate() */</a>
+<a name="184"><span class="lineNum"> 184 </span> : : { 0x87f7de674d23a340, 0xb4 }, /* Use this row to check eccgenerate() */</a>
+<a name="185"><span class="lineNum"> 185 </span> : : { 0x7720ef2a3066b026, 0x7c }, /* Use this row to check eccgenerate() */</a>
+<a name="186"><span class="lineNum"> 186 </span> : : { 0x5d796d5c34c6343f, 0x5e }, /* Use this row to check eccgenerate() */</a>
+<a name="187"><span class="lineNum"> 187 </span> : : { 0xfcca2035fbf72e34, 0xc6 }, /* Use this row to check eccgenerate() */</a>
+<a name="188"><span class="lineNum"> 188 </span> : : { 0x6f1a762c344e9801, 0x87 }, /* Use this row to check eccgenerate() */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : { 0xa19a764c43501049, 0x35 }, /* Use this row to check eccgenerate() */</a>
+<a name="190"><span class="lineNum"> 190 </span> : : { 0xd9860819072a5237, 0x6a }, /* Use this row to check eccgenerate() */</a>
+<a name="191"><span class="lineNum"> 191 </span> : : { 0xdd355e2477043d49, 0x2d }, /* Use this row to check eccgenerate() */</a>
+<a name="192"><span class="lineNum"> 192 </span> : : { 0x33841057bd927028, 0xaa }, /* Use this row to check eccgenerate() */</a>
+<a name="193"><span class="lineNum"> 193 </span> : : { 0x4392780a73e4db0b, 0xfa }, /* Use this row to check eccgenerate() */</a>
+<a name="194"><span class="lineNum"> 194 </span> : : { 0x1fb3fe4377c1367a, 0x47 }, /* Use this row to check eccgenerate() */</a>
+<a name="195"><span class="lineNum"> 195 </span> : : { 0x3c520414ca595c7a, 0x58 }, /* Use this row to check eccgenerate() */</a>
+<a name="196"><span class="lineNum"> 196 </span> : : { 0x520def6ede3ebe40, 0xac }, /* Use this row to check eccgenerate() */</a>
+<a name="197"><span class="lineNum"> 197 </span> : : { 0x4e2c475fa57ddf4d, 0x5c }, /* Use this row to check eccgenerate() */</a>
+<a name="198"><span class="lineNum"> 198 </span> : : { 0x9ab6c03d09918b3e, 0x95 }, /* Use this row to check eccgenerate() */</a>
+<a name="199"><span class="lineNum"> 199 </span> : : { 0x56b42e7fa31a0a1c, 0x5d }, /* Use this row to check eccgenerate() */</a>
+<a name="200"><span class="lineNum"> 200 </span> : : { 0xd480ba4222ae9f25, 0x87 }, /* Use this row to check eccgenerate() */</a>
+<a name="201"><span class="lineNum"> 201 </span> : : { 0x5674d464cdd41d2a, 0xc7 }, /* Use this row to check eccgenerate() */</a>
+<a name="202"><span class="lineNum"> 202 </span> : : { 0xc8cc4c5e31fa271f, 0x6e }, /* Use this row to check eccgenerate() */</a>
+<a name="203"><span class="lineNum"> 203 </span> : : { 0x6548c020533ff519, 0x00 }, /* Use this row to check eccgenerate() */</a>
+<a name="204"><span class="lineNum"> 204 </span> : : { 0x968f056337e7c20a, 0x0e }, /* Use this row to check eccgenerate() */</a>
+<a name="205"><span class="lineNum"> 205 </span> : : { 0x3f11154207e3366d, 0xbe }, /* Use this row to check eccgenerate() */</a>
+<a name="206"><span class="lineNum"> 206 </span> : : { 0x7ee773366f160e7c, 0x53 }, /* Use this row to check eccgenerate() */</a>
+<a name="207"><span class="lineNum"> 207 </span> : : { 0x2ca97e241c477366, 0x1c }, /* Use this row to check eccgenerate() */</a>
+<a name="208"><span class="lineNum"> 208 </span> : : { 0x8f2b4f72b16b840d, 0x88 }, /* Use this row to check eccgenerate() */</a>
+<a name="209"><span class="lineNum"> 209 </span> : : { 0x282dbb076f3bf72e, 0xd0 }, /* Use this row to check eccgenerate() */</a>
+<a name="210"><span class="lineNum"> 210 </span> : : { 0x39955329afde4d36, 0xc7 }, /* Use this row to check eccgenerate() */</a>
+<a name="211"><span class="lineNum"> 211 </span> : : { 0x8d1d0c77657fbf1b, 0x22 }, /* Use this row to check eccgenerate() */</a>
+<a name="212"><span class="lineNum"> 212 </span> : : { 0x0afd9e698ba24218, 0x1a }, /* Use this row to check eccgenerate() */</a>
+<a name="213"><span class="lineNum"> 213 </span> : : { 0x9533ce56dc495356, 0x2a }, /* Use this row to check eccgenerate() */</a>
+<a name="214"><span class="lineNum"> 214 </span> : : { 0x7f645d72a4b35f27, 0x80 }, /* Use this row to check eccgenerate() */</a>
+<a name="215"><span class="lineNum"> 215 </span> : : { 0xc661ff4cebe7fc55, 0xe2 }, /* Use this row to check eccgenerate() */</a>
+<a name="216"><span class="lineNum"> 216 </span> : : { 0xb9bc1a0053e51735, 0xff }, /* Use this row to check eccgenerate() */</a>
+<a name="217"><span class="lineNum"> 217 </span> : : { 0x84df3f541dd6d331, 0x54 }, /* Use this row to check eccgenerate() */</a>
+<a name="218"><span class="lineNum"> 218 </span> : : { 0x7015c94b8189675e, 0x02 }, /* Use this row to check eccgenerate() */</a>
+<a name="219"><span class="lineNum"> 219 </span> : : { 0xb9702a69ea270075, 0x1f }, /* Use this row to check eccgenerate() */</a>
+<a name="220"><span class="lineNum"> 220 </span> : : { 0xf10a376206a5ce2e, 0x6f }, /* Use this row to check eccgenerate() */</a>
+<a name="221"><span class="lineNum"> 221 </span> : : { 0x75bbdc2af8813f2b, 0xb1 }, /* Use this row to check eccgenerate() */</a>
+<a name="222"><span class="lineNum"> 222 </span> : : { 0x14c9b2116ff2aa18, 0x7a }, /* Use this row to check eccgenerate() */</a>
+<a name="223"><span class="lineNum"> 223 </span> : : { 0x205e2f26a1645b4f, 0x2b }, /* Use this row to check eccgenerate() */</a>
+<a name="224"><span class="lineNum"> 224 </span> : : { 0x10a0527ea4f40104, 0xf6 }, /* Use this row to check eccgenerate() */</a>
+<a name="225"><span class="lineNum"> 225 </span> : : { 0x53d34f3a498bea2d, 0x93 }, /* Use this row to check eccgenerate() */</a>
+<a name="226"><span class="lineNum"> 226 </span> : : { 0xae0aaa494935a627, 0xbf }, /* Use this row to check eccgenerate() */</a>
+<a name="227"><span class="lineNum"> 227 </span> : : { 0xd4d7e83fe0f05b31, 0x58 }, /* Use this row to check eccgenerate() */</a>
+<a name="228"><span class="lineNum"> 228 </span> : : { 0xbc3aaf07b8074933, 0x74 }, /* Use this row to check eccgenerate() */</a>
+<a name="229"><span class="lineNum"> 229 </span> : : { 0x5cbba85a690bb716, 0xbf }, /* Use this row to check eccgenerate() */</a>
+<a name="230"><span class="lineNum"> 230 </span> : : { 0x55f3b36c3c9f0c7a, 0x3a }, /* Use this row to check eccgenerate() */</a>
+<a name="231"><span class="lineNum"> 231 </span> : : { 0x8f84242f231da827, 0x50 }, /* Use this row to check eccgenerate() */</a>
+<a name="232"><span class="lineNum"> 232 </span> : : { 0x40f37b590eb0ce6c, 0x9c }, /* Use this row to check eccgenerate() */</a>
+<a name="233"><span class="lineNum"> 233 </span> : : { 0x8f39364b14646403, 0x0b }, /* Use this row to check eccgenerate() */</a>
+<a name="234"><span class="lineNum"> 234 </span> : : { 0xfe8b6478b0084525, 0x21 }, /* Use this row to check eccgenerate() */</a>
+<a name="235"><span class="lineNum"> 235 </span> : : { 0xb6ad135448aa6034, 0x1c }, /* Use this row to check eccgenerate() */</a>
+<a name="236"><span class="lineNum"> 236 </span> : : { 0x402ca05fef969b5a, 0x90 }, /* Use this row to check eccgenerate() */</a>
+<a name="237"><span class="lineNum"> 237 </span> : : { 0x5e8946732b69f07e, 0xaa }, /* Use this row to check eccgenerate() */</a>
+<a name="238"><span class="lineNum"> 238 </span> : : { 0xcccd4b4e55f55271, 0xe8 }, /* Use this row to check eccgenerate() */</a>
+<a name="239"><span class="lineNum"> 239 </span> : : { 0xf9e954757ee77519, 0xf8 }, /* Use this row to check eccgenerate() */</a>
+<a name="240"><span class="lineNum"> 240 </span> : : { 0xc7726047dc6d9e4c, 0x67 }, /* Use this row to check eccgenerate() */</a>
+<a name="241"><span class="lineNum"> 241 </span> : : { 0x25a344744cbda42f, 0x77 }, /* Use this row to check eccgenerate() */</a>
+<a name="242"><span class="lineNum"> 242 </span> : : { 0x2cae0061757d0a11, 0xca }, /* Use this row to check eccgenerate() */</a>
+<a name="243"><span class="lineNum"> 243 </span> : : { 0x2d855344f97a2d34, 0x9b }, /* Use this row to check eccgenerate() */</a>
+<a name="244"><span class="lineNum"> 244 </span> : : { 0x6386e44ae9e8af68, 0x6c }, /* Use this row to check eccgenerate() */</a>
+<a name="245"><span class="lineNum"> 245 </span> : : { 0x2588bc628a40fc1e, 0x4c }, /* Use this row to check eccgenerate() */</a>
+<a name="246"><span class="lineNum"> 246 </span> : : { 0xad5da446b8799837, 0x31 }, /* Use this row to check eccgenerate() */</a>
+<a name="247"><span class="lineNum"> 247 </span> : : { 0xc6296724b40ce111, 0xde }, /* Use this row to check eccgenerate() */</a>
+<a name="248"><span class="lineNum"> 248 </span> : : { 0xc8704515ed502020, 0x72 }, /* Use this row to check eccgenerate() */</a>
+<a name="249"><span class="lineNum"> 249 </span> : : { 0x9d59654555639d6f, 0x16 }, /* Use this row to check eccgenerate() */</a>
+<a name="250"><span class="lineNum"> 250 </span> : : { 0x9e0dfe23c6fca90d, 0x37 }, /* Use this row to check eccgenerate() */</a>
+<a name="251"><span class="lineNum"> 251 </span> : : { 0xb593456853077919, 0xee }, /* Use this row to check eccgenerate() */</a>
+<a name="252"><span class="lineNum"> 252 </span> : : { 0x7e706918de399e03, 0xe7 }, /* Use this row to check eccgenerate() */</a>
+<a name="253"><span class="lineNum"> 253 </span> : : { 0x332ff174131d8c5b, 0x34 }, /* Use this row to check eccgenerate() */</a>
+<a name="254"><span class="lineNum"> 254 </span> : : { 0x920402754a3eb566, 0x2f }, /* Use this row to check eccgenerate() */</a>
+<a name="255"><span class="lineNum"> 255 </span> : : { 0x26ac53332c19466a, 0x0c }, /* Use this row to check eccgenerate() */</a>
+<a name="256"><span class="lineNum"> 256 </span> : : { 0x78d6ea195977623c, 0x6f }, /* Use this row to check eccgenerate() */</a>
+<a name="257"><span class="lineNum"> 257 </span> : : { 0xcff46c4d4b4f9827, 0x20 }, /* Use this row to check eccgenerate() */</a>
+<a name="258"><span class="lineNum"> 258 </span> : : { 0x44cac55ba584eb7a, 0x5f }, /* Use this row to check eccgenerate() */</a>
+<a name="259"><span class="lineNum"> 259 </span> : : { 0x8e6d9b63fc79c011, 0xc8 }, /* Use this row to check eccgenerate() */</a>
+<a name="260"><span class="lineNum"> 260 </span> : : { 0x86babc30a750aa26, 0x20 }, /* Use this row to check eccgenerate() */</a>
+<a name="261"><span class="lineNum"> 261 </span> : : { 0x5fca425eb3f55746, 0x12 }, /* Use this row to check eccgenerate() */</a>
+<a name="262"><span class="lineNum"> 262 </span> : : { 0x6702395833186177, 0xaf }, /* Use this row to check eccgenerate() */</a>
+<a name="263"><span class="lineNum"> 263 </span> : : { 0x2069811725f4a902, 0x87 }, /* Use this row to check eccgenerate() */</a>
+<a name="264"><span class="lineNum"> 264 </span> : : { 0x7b57477230737e6d, 0xd9 }, /* Use this row to check eccgenerate() */</a>
+<a name="265"><span class="lineNum"> 265 </span> : : { 0xf66f287bbdc2e65c, 0xfa }, /* Use this row to check eccgenerate() */</a>
+<a name="266"><span class="lineNum"> 266 </span> : : { 0x10ca5f7619654516, 0x52 }, /* Use this row to check eccgenerate() */</a>
+<a name="267"><span class="lineNum"> 267 </span> : : { 0xf79ee319ac036e63, 0x58 }, /* Use this row to check eccgenerate() */</a>
+<a name="268"><span class="lineNum"> 268 </span> : : { 0xbf20fa3e8e3ac90e, 0x82 }, /* Use this row to check eccgenerate() */</a>
+<a name="269"><span class="lineNum"> 269 </span> : : { 0xd8787e752bced40e, 0x54 }, /* Use this row to check eccgenerate() */</a>
+<a name="270"><span class="lineNum"> 270 </span> : : { 0x57e71a795125fc33, 0xfe }, /* Use this row to check eccgenerate() */</a>
+<a name="271"><span class="lineNum"> 271 </span> : : { 0xab9c5e70fe24d228, 0xfc }, /* Use this row to check eccgenerate() */</a>
+<a name="272"><span class="lineNum"> 272 </span> : : { 0x49746a50d0bd0513, 0x9d }, /* Use this row to check eccgenerate() */</a>
+<a name="273"><span class="lineNum"> 273 </span> : : { 0x7542f10d7a91cb3d, 0xb9 }, /* Use this row to check eccgenerate() */</a>
+<a name="274"><span class="lineNum"> 274 </span> : : { 0x760b8c4f8e3e302c, 0x82 }, /* Use this row to check eccgenerate() */</a>
+<a name="275"><span class="lineNum"> 275 </span> : : { 0x358fda5203b08c71, 0x23 }, /* Use this row to check eccgenerate() */</a>
+<a name="276"><span class="lineNum"> 276 </span> : : { 0xb6a5e437fdc54800, 0xb6 }, /* Use this row to check eccgenerate() */</a>
+<a name="277"><span class="lineNum"> 277 </span> : : { 0x30dea97795591d31, 0x7c }, /* Use this row to check eccgenerate() */</a>
+<a name="278"><span class="lineNum"> 278 </span> : : { 0xba4dc7331da81d10, 0x11 }, /* Use this row to check eccgenerate() */</a>
+<a name="279"><span class="lineNum"> 279 </span> : : { 0x4d1b9c7d51472b0f, 0x37 }, /* Use this row to check eccgenerate() */</a>
+<a name="280"><span class="lineNum"> 280 </span> : : { 0x0e0a126c35a50e26, 0xd6 }, /* Use this row to check eccgenerate() */</a>
+<a name="281"><span class="lineNum"> 281 </span> : : { 0x4e0a543c448bc478, 0x0f }, /* Use this row to check eccgenerate() */</a>
+<a name="282"><span class="lineNum"> 282 </span> : : { 0xf08e325c1fd47162, 0x6b }, /* Use this row to check eccgenerate() */</a>
+<a name="283"><span class="lineNum"> 283 </span> : : { 0xad0e3b7146a93756, 0x86 }, /* Use this row to check eccgenerate() */</a>
+<a name="284"><span class="lineNum"> 284 </span> : : { 0x71770c65afaf2c1b, 0xae }, /* Use this row to check eccgenerate() */</a>
+<a name="285"><span class="lineNum"> 285 </span> : : { 0x01d5284f8687b966, 0x37 }, /* Use this row to check eccgenerate() */</a>
+<a name="286"><span class="lineNum"> 286 </span> : : { 0x84ac8b0fc85e275e, 0x86 }, /* Use this row to check eccgenerate() */</a>
+<a name="287"><span class="lineNum"> 287 </span> : : { 0x981c2d71ac71873f, 0x4e }, /* Use this row to check eccgenerate() */</a>
+<a name="288"><span class="lineNum"> 288 </span> : : { 0x2603537dce20f65f, 0xb5 }, /* Use this row to check eccgenerate() */</a>
+<a name="289"><span class="lineNum"> 289 </span> : : { 0x5c5f260c0d5f1e7f, 0x0b }, /* Use this row to check eccgenerate() */</a>
+<a name="290"><span class="lineNum"> 290 </span> : : { 0x100fab709c0edf4c, 0xc9 }, /* Use this row to check eccgenerate() */</a>
+<a name="291"><span class="lineNum"> 291 </span> : : { 0x99d4274d91ee005f, 0x83 }, /* Use this row to check eccgenerate() */</a>
+<a name="292"><span class="lineNum"> 292 </span> : : { 0x26481e10c6b48f28, 0x16 }, /* Use this row to check eccgenerate() */</a>
+<a name="293"><span class="lineNum"> 293 </span> : : { 0xe45cad38cab2d144, 0x9c }, /* Use this row to check eccgenerate() */</a>
+<a name="294"><span class="lineNum"> 294 </span> : : { 0x1bfafc53e195e543, 0x8e }, /* Use this row to check eccgenerate() */</a>
+<a name="295"><span class="lineNum"> 295 </span> : : { 0x163bf46931784936, 0xdc }, /* Use this row to check eccgenerate() */</a>
+<a name="296"><span class="lineNum"> 296 </span> : : { 0x75030e2f29040f40, 0x48 }, /* Use this row to check eccgenerate() */</a>
+<a name="297"><span class="lineNum"> 297 </span> : : { 0x48d8802265454826, 0x2a }, /* Use this row to check eccgenerate() */</a>
+<a name="298"><span class="lineNum"> 298 </span> : : { 0xabee7f7c6592400b, 0x2b }, /* Use this row to check eccgenerate() */</a>
+<a name="299"><span class="lineNum"> 299 </span> : : { 0x15426d26f6e6bb13, 0x89 }, /* Use this row to check eccgenerate() */</a>
+<a name="300"><span class="lineNum"> 300 </span> : : { 0x7c6e757a1c668c61, 0x6d }, /* Use this row to check eccgenerate() */</a>
+<a name="301"><span class="lineNum"> 301 </span> : : { 0xe4c4b33f16179675, 0x74 }, /* Use this row to check eccgenerate() */</a>
+<a name="302"><span class="lineNum"> 302 </span> : : { 0xc2881d35001b010a, 0xd4 }, /* Use this row to check eccgenerate() */</a>
+<a name="303"><span class="lineNum"> 303 </span> : : { 0xce3bf7697de1e030, 0x65 }, /* Use this row to check eccgenerate() */</a>
+<a name="304"><span class="lineNum"> 304 </span> : : { 0x8a40ff2fe88b7032, 0x19 }, /* Use this row to check eccgenerate() */</a>
+<a name="305"><span class="lineNum"> 305 </span> : : { 0x849a4f7f2a9b1d76, 0x58 }, /* Use this row to check eccgenerate() */</a>
+<a name="306"><span class="lineNum"> 306 </span> : : { 0xbc891e559b4faa20, 0x4c }, /* Use this row to check eccgenerate() */</a>
+<a name="307"><span class="lineNum"> 307 </span> : : { 0x61043a491e6f774c, 0x28 }, /* Use this row to check eccgenerate() */</a>
+<a name="308"><span class="lineNum"> 308 </span> : : { 0xe8214911e2d13c65, 0x9e }, /* Use this row to check eccgenerate() */</a>
+<a name="309"><span class="lineNum"> 309 </span> : : { 0xc36722294561e701, 0x3d }, /* Use this row to check eccgenerate() */</a>
+<a name="310"><span class="lineNum"> 310 </span> : : { 0x77d93038031c4665, 0x55 }, /* Use this row to check eccgenerate() */</a>
+<a name="311"><span class="lineNum"> 311 </span> : : { 0x2c205525daa21613, 0x85 }, /* Use this row to check eccgenerate() */</a>
+<a name="312"><span class="lineNum"> 312 </span> : : { 0x3fe85e39ecdc3e67, 0x20 }, /* Use this row to check eccgenerate() */</a>
+<a name="313"><span class="lineNum"> 313 </span> : : { 0x526f7f7275f8d547, 0xa4 }, /* Use this row to check eccgenerate() */</a>
+<a name="314"><span class="lineNum"> 314 </span> : : { 0x6bdf915bead6de35, 0xac }, /* Use this row to check eccgenerate() */</a>
+<a name="315"><span class="lineNum"> 315 </span> : : { 0x063d6b1767b1ec18, 0x78 }, /* Use this row to check eccgenerate() */</a>
+<a name="316"><span class="lineNum"> 316 </span> : : { 0x7dc8820ee74d0756, 0x31 }, /* Use this row to check eccgenerate() */</a>
+<a name="317"><span class="lineNum"> 317 </span> : : { 0xe7680860ea011f57, 0x3f }, /* Use this row to check eccgenerate() */</a>
+<a name="318"><span class="lineNum"> 318 </span> : : { 0x67e3ff073f51a043, 0xd6 }, /* Use this row to check eccgenerate() */</a>
+<a name="319"><span class="lineNum"> 319 </span> : : { 0x27dd1076b6a4ff49, 0x10 }, /* Use this row to check eccgenerate() */</a>
+<a name="320"><span class="lineNum"> 320 </span> : : { 0xe03f1d40f223ff37, 0xec }, /* Use this row to check eccgenerate() */</a>
+<a name="321"><span class="lineNum"> 321 </span> : : { 0x8d73a958ab776075, 0x6f }, /* Use this row to check eccgenerate() */</a>
+<a name="322"><span class="lineNum"> 322 </span> : : { 0xc9e6d7419cc93b15, 0x8f }, /* Use this row to check eccgenerate() */</a>
+<a name="323"><span class="lineNum"> 323 </span> : : { 0x7f9b787aee77e321, 0xb7 }, /* Use this row to check eccgenerate() */</a>
+<a name="324"><span class="lineNum"> 324 </span> : : { 0x34d9ca23b1082153, 0xa9 }, /* Use this row to check eccgenerate() */</a>
+<a name="325"><span class="lineNum"> 325 </span> : : { 0xb424673842039b23, 0xe2 }, /* Use this row to check eccgenerate() */</a>
+<a name="326"><span class="lineNum"> 326 </span> : : { 0x1ca6b136abb2fb5b, 0xe1 }, /* Use this row to check eccgenerate() */</a>
+<a name="327"><span class="lineNum"> 327 </span> : : { 0x978f3a43e144bc5d, 0x64 }, /* Use this row to check eccgenerate() */</a>
+<a name="328"><span class="lineNum"> 328 </span> : : { 0x563d92255b8e1070, 0x14 }, /* Use this row to check eccgenerate() */</a>
+<a name="329"><span class="lineNum"> 329 </span> : : { 0x4565ef25e9feb935, 0x2d }, /* Use this row to check eccgenerate() */</a>
+<a name="330"><span class="lineNum"> 330 </span> : : { 0x50b0a64ec11c2401, 0x3c }, /* Use this row to check eccgenerate() */</a>
+<a name="331"><span class="lineNum"> 331 </span> : : { 0xa86a2b574ba25a3d, 0x8b }, /* Use this row to check eccgenerate() */</a>
+<a name="332"><span class="lineNum"> 332 </span> : : { 0x36a47914cd78295d, 0xf1 }, /* Use this row to check eccgenerate() */</a>
+<a name="333"><span class="lineNum"> 333 </span> : : { 0x0ccac9208fd33337, 0xe4 }, /* Use this row to check eccgenerate() */</a>
+<a name="334"><span class="lineNum"> 334 </span> : : { 0x457833019d87791c, 0xc4 }, /* Use this row to check eccgenerate() */</a>
+<a name="335"><span class="lineNum"> 335 </span> : : { 0x8fab785433a7da16, 0x0c }, /* Use this row to check eccgenerate() */</a>
+<a name="336"><span class="lineNum"> 336 </span> : : { 0xdf1e3b0c26b85041, 0x94 }, /* Use this row to check eccgenerate() */</a>
+<a name="337"><span class="lineNum"> 337 </span> : : { 0xc2818c561c1f222d, 0x9a }, /* Use this row to check eccgenerate() */</a>
+<a name="338"><span class="lineNum"> 338 </span> : : { 0x0b97054fa805134e, 0xec }, /* Use this row to check eccgenerate() */</a>
+<a name="339"><span class="lineNum"> 339 </span> : : { 0x5a0e3421411d0551, 0x57 }, /* Use this row to check eccgenerate() */</a>
+<a name="340"><span class="lineNum"> 340 </span> : : { 0x8420a0743f70d072, 0xa8 }, /* Use this row to check eccgenerate() */</a>
+<a name="341"><span class="lineNum"> 341 </span> : : { 0xea22cc4e0e339b59, 0x15 }, /* Use this row to check eccgenerate() */</a>
+<a name="342"><span class="lineNum"> 342 </span> : : { 0xef775737a0c6512b, 0xe7 }, /* Use this row to check eccgenerate() */</a>
+<a name="343"><span class="lineNum"> 343 </span> : : { 0xfc54621b81b20612, 0x9a }, /* Use this row to check eccgenerate() */</a>
+<a name="344"><span class="lineNum"> 344 </span> : : { 0x6bb1c04745b5e95c, 0x1e }, /* Use this row to check eccgenerate() */</a>
+<a name="345"><span class="lineNum"> 345 </span> : : { 0x06d20d5e41ba5141, 0x56 }, /* Use this row to check eccgenerate() */</a>
+<a name="346"><span class="lineNum"> 346 </span> : : { 0x8d5cac7ebb616716, 0x43 }, /* Use this row to check eccgenerate() */</a>
+<a name="347"><span class="lineNum"> 347 </span> : : { 0x89da9073ae3c3935, 0xb1 }, /* Use this row to check eccgenerate() */</a>
+<a name="348"><span class="lineNum"> 348 </span> : : { 0x3e106d6cc3002613, 0xec }, /* Use this row to check eccgenerate() */</a>
+<a name="349"><span class="lineNum"> 349 </span> : : { 0x60889f2f95a45a14, 0x69 }, /* Use this row to check eccgenerate() */</a>
+<a name="350"><span class="lineNum"> 350 </span> : : { 0xc94b352b8388a06d, 0x53 }, /* Use this row to check eccgenerate() */</a>
+<a name="351"><span class="lineNum"> 351 </span> : : { 0xa940f12ef0331804, 0x7a }, /* Use this row to check eccgenerate() */</a>
+<a name="352"><span class="lineNum"> 352 </span> : : </a>
+<a name="353"><span class="lineNum"> 353 </span> : : };</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : {</a>
+<a name="357"><span class="lineNum"> 357 </span> : : int i;</a>
+<a name="358"><span class="lineNum"> 358 </span> : : uint8_t ret_memcpy;</a>
+<a name="359"><span class="lineNum"> 359 </span> : : uint8_t ret_verify;</a>
+<a name="360"><span class="lineNum"> 360 </span> : : uint64_t dst;</a>
+<a name="361"><span class="lineNum"> 361 </span> : : uint64_t *buf;</a>
+<a name="362"><span class="lineNum"> 362 </span> : : struct ecc64 *ret_buf;</a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> : : /*</a>
+<a name="365"><span class="lineNum"> 365 </span> : : * Test that eccgenerate() still works, but skip the first 64 because they</a>
+<a name="366"><span class="lineNum"> 366 </span> : : * have intentional bitflips</a>
+<a name="367"><span class="lineNum"> 367 </span> : : */</a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 1 : printf(&quot;Checking eccgenerate()\n&quot;);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 257 : for (i = 64; i &lt; NUM_ECC_ROWS; i++) {</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 256 : if (eccgenerate(be64toh(ecc_data[i].data)) != ecc_data[i].ecc) {</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECC did not generate the correct value, expecting 0x%02x, got 0x%02x\n&quot;,</span></a>
+<a name="372"><span class="lineNum"> 372 </span> : : ecc_data[i].ecc, eccgenerate(be64toh(ecc_data[i].data)));</a>
+<a name="373"><span class="lineNum"> 373 </span> : : }</a>
+<a name="374"><span class="lineNum"> 374 </span> : : }</a>
+<a name="375"><span class="lineNum"> 375 </span> : : </a>
+<a name="376"><span class="lineNum"> 376 </span> : : /* Test that the ecc code can detect and recover bitflips */</a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 1 : printf(&quot;Testing bitflip recovery\n&quot;);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 65 : for (i = 0; i &lt; 64; i++) {</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 64 : ret_memcpy = memcpy_from_ecc(&amp;dst, &amp;ecc_data[i], sizeof(dst));</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 64 : if (dst != 0xffffffffffffffff || ret_memcpy) {</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECC code didn't correct bad bit %d in 0x%016lx\n&quot;, 63 - i, be64toh(ecc_data[i].data));</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : }</a>
+<a name="384"><span class="lineNum"> 384 </span> : : </a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 64 : ret_verify = eccverify(be64toh(ecc_data[i].data), ecc_data[i].ecc);</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 64 : if (ret_verify != 63 - i) {</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECC did not catch incorrect bit %d in row 0x%016lx 0x%02x, got 0x%02x\n&quot;,</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : i, ecc_data[i].data, ecc_data[i].ecc, ret_verify);</a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="390"><span class="lineNum"> 390 </span> : : }</a>
+<a name="391"><span class="lineNum"> 391 </span> : : }</a>
+<a name="392"><span class="lineNum"> 392 </span> : : </a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 1 : buf = malloc(NUM_ECC_ROWS * sizeof(*buf));</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 1 : if (!buf) {</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineNoCov"> 0 : ERR(&quot;malloc #1 failed during ecc test\n&quot;);</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : }</a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 1 : printf(&quot;pass\n&quot;);</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : </a>
+<a name="400"><span class="lineNum"> 400 </span> : : /* Test a large memcpy */</a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 1 : printf(&quot;Testing a large(ish) memcpy_from_ecc()\n&quot;);</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 1 : ret_memcpy = memcpy_from_ecc(buf, ecc_data, NUM_ECC_ROWS * sizeof(*buf));</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 1 : if (ret_memcpy) {</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECC Couldn't memcpy entire buffer\n&quot;);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : }</a>
+<a name="407"><span class="lineNum"> 407 </span> : : </a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 321 : for (i = 0; i &lt; NUM_ECC_ROWS; i++) {</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : /* Large memcpy should have fixed the bitflips */</a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 320 : if (i &lt; 64 &amp;&amp; buf[i] != 0xffffffffffffffff) {</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_from_ecc got it wrong for uint64_t number %d, got 0x%016lx, expecting 0xffffffffffffffff\n&quot;,</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : i, buf[i]);</a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="414"><span class="lineNum"> 414 </span> : : }</a>
+<a name="415"><span class="lineNum"> 415 </span> : : </a>
+<a name="416"><span class="lineNum"> 416 </span> : : /* But not changed any of the correct data */</a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 320 : if (i &gt; 63 &amp;&amp; buf[i] != ecc_data[i].data) {</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_from_ecc got it wrong for uint64_t number %d, git 0x%016lx, expecting 0x%016lx\n&quot;,</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : i, buf[i], ecc_data[i].data);</a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> : : }</a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 1 : printf(&quot;pass\n&quot;);</span></a>
+<a name="424"><span class="lineNum"> 424 </span> : : </a>
+<a name="425"><span class="lineNum"> 425 </span> : : /* Test a memcpy to add ecc data */</a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 1 : printf(&quot;Testing a large(ish) memcpy_to_ecc()\n&quot;);</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 1 : ret_buf = malloc(ecc_buffer_size(NUM_ECC_ROWS * sizeof(*buf)));</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 1 : if (!buf) {</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineNoCov"> 0 : ERR(&quot;malloc #2 failed during ecc test\n&quot;);</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="431"><span class="lineNum"> 431 </span> : : }</a>
+<a name="432"><span class="lineNum"> 432 </span> : : </a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 1 : ret_memcpy = memcpy_to_ecc(ret_buf, buf, NUM_ECC_ROWS * sizeof(*buf));</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 1 : if (ret_memcpy) {</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECC Couldn't memcpy entire buffer\n&quot;);</span></a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="437"><span class="lineNum"> 437 </span> : : }</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 321 : for (i = 0; i &lt; NUM_ECC_ROWS; i++) {</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : /* The data should be the same */</a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineCov"> 320 : if (ret_buf[i].data != buf[i]) {</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_to_ecc got it wrong on uint64_t %d, expecting 0x%016lx, got 0x%016lx\n&quot;,</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : i, buf[i], ret_buf[i].data);</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : }</a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> : : /* Check the correctness of ecc bytes */</a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 320 : if (ret_buf[i].ecc != ecc_data[i].ecc) {</span></a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_to_ecc got it on the ecc for uint64_t %d, expecting 0x%02x, got 0x%02x\n&quot;,</span></a>
+<a name="450"><span class="lineNum"> 450 </span> : : i, ecc_data[i].ecc, ret_buf[i].ecc);</a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="452"><span class="lineNum"> 452 </span> : : }</a>
+<a name="453"><span class="lineNum"> 453 </span> : : }</a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 1 : printf(&quot;ECC tests pass\n&quot;);</span></a>
+<a name="455"><span class="lineNum"> 455 </span> : : </a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineCov"> 1 : printf(&quot;ECC test error conditions\n&quot;);</span></a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 1 : if (memcpy_to_ecc(ret_buf, buf, 7) == 0) {</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_to_ecc didn't detect bad size 7\n&quot;);</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : }</a>
+<a name="461"><span class="lineNum"> 461 </span> : : </a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 1 : if (memcpy_to_ecc(ret_buf, buf, 15) == 0) {</span></a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_to_ecc didn't detect bad size 15\n&quot;);</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : }</a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 1 : if (memcpy_from_ecc(buf, ret_buf, 7) == 0) {</span></a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_from_ecc didn't detect bad size 7\n&quot;);</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="469"><span class="lineNum"> 469 </span> : : }</a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 1 : if (memcpy_from_ecc(buf, ret_buf, 15) == 0) {</span></a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : ERR(&quot;memcpy_from_ecc didn't detect bad size 15\n&quot;);</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="473"><span class="lineNum"> 473 </span> : : }</a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 1 : printf(&quot;ECC error conditions pass\n&quot;);</span></a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 1 : free(ret_buf);</span></a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> : : /* Check that unaligned address become aligned */</a>
+<a name="480"><span class="lineNum"> 480 </span> :<span class="lineCov"> 1 : if (ecc_buffer_align(0, 5) != 0) {</span></a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ecc_buffer_align(0, 5) not 0 -&gt; %ld\n&quot;, ecc_buffer_align(0, 5));</span></a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="483"><span class="lineNum"> 483 </span> : : }</a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineCov"> 1 : if (ecc_buffer_align(0, 8) != 0) {</span></a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ecc_buffer_align(0, 8) not 0 -&gt; %ld\n&quot;, ecc_buffer_align(0, 8));</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="488"><span class="lineNum"> 488 </span> : : }</a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 1 : if (ecc_buffer_align(0, 9) != 9) {</span></a>
+<a name="490"><span class="lineNum"> 490 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ecc_buffer_align(0, 9) not 9 -&gt; %ld\n&quot;, ecc_buffer_align(0, 9));</span></a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="492"><span class="lineNum"> 492 </span> : : }</a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 1 : if (ecc_buffer_align(0, 15) != 9) {</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ecc_buffer_align(0, 15) not 9 -&gt; %ld\n&quot;, ecc_buffer_align(0, 15));</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="496"><span class="lineNum"> 496 </span> : : }</a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 1 : if (ecc_buffer_align(5, 10) != 5) {</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ecc_buffer_align(5, 10) not 5 -&gt; %ld\n&quot;, ecc_buffer_align(5, 10));</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="500"><span class="lineNum"> 500 </span> : : }</a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 1 : if (ecc_buffer_align(5, 18) != 14) {</span></a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ecc_buffer_align(5, 18) not 14 -&gt; %ld\n&quot;, ecc_buffer_align(5, 18));</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> : : }</a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineCov"> 1 : if (ecc_buffer_align(0, 50) != 45) {</span></a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ecc_buffer_align(0, 50) not 45 -&gt; %ld\n&quot;, ecc_buffer_align(0, 50));</span></a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : }</a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="510"><span class="lineNum"> 510 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-flash.c.func-sort-c.html b/coverage-report/libflash/test/test-flash.c.func-sort-c.html
new file mode 100644
index 0000000..80a81f4
--- /dev/null
+++ b/coverage-report/libflash/test/test-flash.c.func-sort-c.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-flash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-flash.c<span style="font-size: 80%;"> (<a href="test-flash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">173</td>
+ <td class="headerCovTableEntry">260</td>
+ <td class="headerCovTableEntryLo">66.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="test-flash.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#353">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#326">sim_set_4b</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#333">sim_read</a></td>
+ <td class="coverFnHi">869</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#140">sim_do_address</a></td>
+ <td class="coverFnHi">8117</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#268">sim_send_addr</a></td>
+ <td class="coverFnHi">8117</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#156">sim_wbytes</a></td>
+ <td class="coverFnHi">16215</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#305">sim_cmd_wr</a></td>
+ <td class="coverFnHi">16236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#284">sim_cmd_rd</a></td>
+ <td class="coverFnHi">24354</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#214">sim_rbytes</a></td>
+ <td class="coverFnHi">24354</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#130">sim_end_cmd</a></td>
+ <td class="coverFnHi">40590</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#62">sim_start_cmd</a></td>
+ <td class="coverFnHi">40590</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-flash.c.func.html b/coverage-report/libflash/test/test-flash.c.func.html
new file mode 100644
index 0000000..8fbbc88
--- /dev/null
+++ b/coverage-report/libflash/test/test-flash.c.func.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-flash.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-flash.c<span style="font-size: 80%;"> (<a href="test-flash.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">173</td>
+ <td class="headerCovTableEntry">260</td>
+ <td class="headerCovTableEntryLo">66.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="test-flash.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#353">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#284">sim_cmd_rd</a></td>
+ <td class="coverFnHi">24354</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#305">sim_cmd_wr</a></td>
+ <td class="coverFnHi">16236</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#140">sim_do_address</a></td>
+ <td class="coverFnHi">8117</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#130">sim_end_cmd</a></td>
+ <td class="coverFnHi">40590</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#214">sim_rbytes</a></td>
+ <td class="coverFnHi">24354</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#333">sim_read</a></td>
+ <td class="coverFnHi">869</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#268">sim_send_addr</a></td>
+ <td class="coverFnHi">8117</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#326">sim_set_4b</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#62">sim_start_cmd</a></td>
+ <td class="coverFnHi">40590</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-flash.c.gcov.html#156">sim_wbytes</a></td>
+ <td class="coverFnHi">16215</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-flash.c.gcov.html b/coverage-report/libflash/test/test-flash.c.gcov.html
new file mode 100644
index 0000000..6ddaa67
--- /dev/null
+++ b/coverage-report/libflash/test/test-flash.c.gcov.html
@@ -0,0 +1,533 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-flash.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-flash.c<span style="font-size: 80%;"> (source / <a href="test-flash.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">173</td>
+ <td class="headerCovTableEntry">260</td>
+ <td class="headerCovTableEntryLo">66.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntry">11</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;libflash/libflash-priv.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;../libflash.c&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;../ecc.c&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : #define __unused __attribute__((unused))</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define ERR(fmt...) fprintf(stderr, fmt)</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : /* Flash commands */</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define CMD_PP 0x02</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #define CMD_READ 0x03</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #define CMD_WRDI 0x04</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #define CMD_RDSR 0x05</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define CMD_WREN 0x06</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #define CMD_SE 0x20</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #define CMD_RDSCUR 0x2b</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #define CMD_BE32K 0x52</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #define CMD_CE 0x60</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #define CMD_RDID 0x9f</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #define CMD_EN4B 0xb7</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #define CMD_BE 0xd8</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #define CMD_RDDPB 0xe0</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #define CMD_RDSPB 0xe2</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #define CMD_EX4B 0xe9</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : /* Flash status bits */</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define STAT_WIP 0x01</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #define STAT_WEN 0x02</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : static uint8_t *sim_image;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : static uint32_t sim_image_sz = 0x100000;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : static uint32_t sim_index;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : static uint32_t sim_addr;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : static uint32_t sim_er_size;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : static uint8_t sim_sr;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : static bool sim_fl_4b;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : static bool sim_ct_4b;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : static enum sim_state {</a>
+<a name="50"><span class="lineNum"> 50 </span> : : sim_state_idle,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : sim_state_rdid,</a>
+<a name="52"><span class="lineNum"> 52 </span> : : sim_state_rdsr,</a>
+<a name="53"><span class="lineNum"> 53 </span> : : sim_state_read_addr,</a>
+<a name="54"><span class="lineNum"> 54 </span> : : sim_state_read_data,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : sim_state_write_addr,</a>
+<a name="56"><span class="lineNum"> 56 </span> : : sim_state_write_data,</a>
+<a name="57"><span class="lineNum"> 57 </span> : : sim_state_erase_addr,</a>
+<a name="58"><span class="lineNum"> 58 </span> : : sim_state_erase_done,</a>
+<a name="59"><span class="lineNum"> 59 </span> : : } sim_state;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> : : /*</a>
+<a name="62"><span class="lineNum"> 62 </span> : : * Simulated flash &amp; controller</a>
+<a name="63"><span class="lineNum"> 63 </span> : : */</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 40590 : static int sim_start_cmd(uint8_t cmd)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : {</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 40590 : if (sim_state != sim_state_idle) {</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: Command %02x in wrong state %d\n&quot;, cmd, sim_state);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : }</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 40590 : sim_index = 0;</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 40590 : sim_addr = 0;</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 40590 : switch(cmd) {</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : case CMD_RDID:</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : sim_state = sim_state_rdid;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 24353 : case CMD_RDSR:</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 24353 : sim_state = sim_state_rdsr;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 24353 : break;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : case CMD_EX4B:</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : sim_fl_4b = false;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : case CMD_EN4B:</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineNoCov"> 0 : sim_fl_4b = true;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 8118 : case CMD_WREN:</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 8118 : sim_sr |= STAT_WEN;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 8118 : break;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineNoCov"> 0 : case CMD_READ:</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineNoCov"> 0 : sim_state = sim_state_read_addr;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineNoCov"> 0 : if (sim_ct_4b != sim_fl_4b)</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: 4b mode mismatch in READ !\n&quot;);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 8098 : case CMD_PP:</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 8098 : sim_state = sim_state_write_addr;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 8098 : if (sim_ct_4b != sim_fl_4b)</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: 4b mode mismatch in PP !\n&quot;);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 8098 : if (!(sim_sr &amp; STAT_WEN))</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: PP without WEN, ignoring... \n&quot;);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 8098 : break;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 19 : case CMD_SE:</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : case CMD_BE32K:</a>
+<a name="104"><span class="lineNum"> 104 </span> : : case CMD_BE:</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 19 : if (sim_ct_4b != sim_fl_4b)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: 4b mode mismatch in SE/BE !\n&quot;);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 19 : if (!(sim_sr &amp; STAT_WEN))</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: SE/BE without WEN, ignoring... \n&quot;);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 19 : sim_state = sim_state_erase_addr;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 19 : switch(cmd) {</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 18 : case CMD_SE: sim_er_size = 0x1000; break;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineNoCov"> 0 : case CMD_BE32K: sim_er_size = 0x8000; break;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : case CMD_BE: sim_er_size = 0x10000; break;</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : }</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 19 : break;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : case CMD_CE:</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineNoCov"> 0 : if (!(sim_sr &amp; STAT_WEN)) {</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: CE without WEN, ignoring... \n&quot;);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : }</a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineNoCov"> 0 : memset(sim_image, 0xff, sim_image_sz);</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineNoCov"> 0 : sim_sr |= STAT_WIP;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineNoCov"> 0 : sim_sr &amp;= ~STAT_WEN;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: Unsupported command %02x\n&quot;, cmd);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : }</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 40590 : return 0;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : }</a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 40590 : static void sim_end_cmd(void)</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : {</a>
+<a name="134"><span class="lineNum"> 134 </span> : : /* For write and sector/block erase, set WIP &amp; clear WEN here */</a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 40590 : if (sim_state == sim_state_write_data) {</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 8098 : sim_sr |= STAT_WIP;</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 8098 : sim_sr &amp;= ~STAT_WEN;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : }</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 40590 : sim_state = sim_state_idle;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 40590 : }</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 8117 : static bool sim_do_address(const uint8_t **buf, uint32_t *len)</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : {</a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 8117 : uint8_t asize = sim_fl_4b ? 4 : 3;</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 8117 : const uint8_t *p = *buf;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 24351 : while(*len) {</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 24351 : sim_addr = (sim_addr &lt;&lt; 8) | *(p++);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 24351 : *buf = p;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 24351 : *len = *len - 1;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 24351 : sim_index++;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 24351 : if (sim_index &gt;= asize)</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 8117 : return true;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : }</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 16215 : static int sim_wbytes(const void *buf, uint32_t len)</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : {</a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 16215 : const uint8_t *b = buf;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : bool addr_complete;</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 16215 : again:</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 16215 : switch(sim_state) {</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : case sim_state_read_addr:</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : addr_complete = sim_do_address(&amp;b, &amp;len);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : if (addr_complete) {</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineNoCov"> 0 : sim_state = sim_state_read_data;</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineNoCov"> 0 : sim_index = 0;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineNoCov"> 0 : if (len)</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineNoCov"> 0 : goto again;</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : }</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 8098 : case sim_state_write_addr:</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 8098 : addr_complete = sim_do_address(&amp;b, &amp;len);</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 8098 : if (addr_complete) {</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 8098 : sim_state = sim_state_write_data;</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 8098 : sim_index = 0;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 8098 : if (len)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineNoCov"> 0 : goto again;</span></a>
+<a name="181"><span class="lineNum"> 181 </span> : : }</a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 8098 : break;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 8098 : case sim_state_write_data:</span></a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 8098 : if (!(sim_sr &amp; STAT_WEN))</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 224283 : while(len--) {</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 216185 : uint8_t c = *(b++);</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 216185 : if (sim_addr &gt;= sim_image_sz) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: Write past end of flash\n&quot;);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : /* Flash write only clears bits */</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 216185 : sim_image[sim_addr] &amp;= c;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 216185 : sim_addr = (sim_addr &amp; 0xffffff00) |</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 216185 : ((sim_addr + 1) &amp; 0xff);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> : : }</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 8098 : break;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 19 : case sim_state_erase_addr:</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 19 : if (!(sim_sr &amp; STAT_WEN))</span></a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 19 : addr_complete = sim_do_address(&amp;b, &amp;len);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 19 : if (addr_complete) {</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 19 : memset(sim_image + sim_addr, 0xff, sim_er_size);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 19 : sim_sr |= STAT_WIP;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 19 : sim_sr &amp;= ~STAT_WEN;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 19 : sim_state = sim_state_erase_done;</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : }</a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 19 : break;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: Write in wrong state %d\n&quot;, sim_state);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : }</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 16215 : return 0;</span></a>
+<a name="214"><span class="lineNum"> 214 </span> : : }</a>
+<a name="215"><span class="lineNum"> 215 </span> : : </a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 24354 : static int sim_rbytes(void *buf, uint32_t len)</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : {</a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 24354 : uint8_t *b = buf;</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 24354 : switch(sim_state) {</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : case sim_state_rdid:</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 4 : while(len--) {</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 3 : switch(sim_index) {</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 1 : case 0:</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1 : *(b++) = 0x55;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 1 : case 1:</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 1 : *(b++) = 0xaa;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 1 : case 2:</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 1 : *(b++) = 0x55;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: RDID index %d\n&quot;, sim_index);</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : *(b++) = 0;</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : }</a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 3 : sim_index++;</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : }</a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 24353 : case sim_state_rdsr:</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 48706 : while(len--) {</span></a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 24353 : *(b++) = sim_sr;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 24353 : if (sim_index &gt; 0)</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: RDSR index %d\n&quot;, sim_index);</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 24353 : sim_index++;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> : : /* If WIP was 1, clear it, ie, simulate write/erase</a>
+<a name="249"><span class="lineNum"> 249 </span> : : * completion</a>
+<a name="250"><span class="lineNum"> 250 </span> : : */</a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 24353 : sim_sr &amp;= ~STAT_WIP;</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : }</a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 24353 : break;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineNoCov"> 0 : case sim_state_read_data:</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : while(len--) {</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineNoCov"> 0 : if (sim_addr &gt;= sim_image_sz) {</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: Read past end of flash\n&quot;);</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : }</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : *(b++) = sim_image[sim_addr++];</span></a>
+<a name="261"><span class="lineNum"> 261 </span> : : }</a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: Read in wrong state %d\n&quot;, sim_state);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 24354 : return 0;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : }</a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 8117 : static int sim_send_addr(uint32_t addr)</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : {</a>
+<a name="272"><span class="lineNum"> 272 </span> : : const void *ap;</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> : : /* Layout address MSB first in memory */</a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 8117 : addr = cpu_to_be32(addr);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> : : /* Send the right amount of bytes */</a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 8117 : ap = (char *)&amp;addr;</span></a>
+<a name="279"><span class="lineNum"> 279 </span> : : </a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 8117 : if (sim_ct_4b)</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : return sim_wbytes(ap, 4);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : else</a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 8117 : return sim_wbytes(ap + 1, 3);</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : }</a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 24354 : static int sim_cmd_rd(struct spi_flash_ctrl *ctrl __unused, uint8_t cmd,</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : bool has_addr, uint32_t addr, void *buffer,</a>
+<a name="288"><span class="lineNum"> 288 </span> : : uint32_t size)</a>
+<a name="289"><span class="lineNum"> 289 </span> : : {</a>
+<a name="290"><span class="lineNum"> 290 </span> : : int rc;</a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 24354 : rc = sim_start_cmd(cmd);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 24354 : if (rc)</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 24354 : if (has_addr) {</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineNoCov"> 0 : rc = sim_send_addr(addr);</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="299"><span class="lineNum"> 299 </span> : : }</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 24354 : if (buffer &amp;&amp; size)</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 24354 : rc = sim_rbytes(buffer, size);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : bail:</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 24354 : sim_end_cmd();</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 24354 : return rc;</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : }</a>
+<a name="306"><span class="lineNum"> 306 </span> : : </a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 16236 : static int sim_cmd_wr(struct spi_flash_ctrl *ctrl __unused, uint8_t cmd,</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : bool has_addr, uint32_t addr, const void *buffer,</a>
+<a name="309"><span class="lineNum"> 309 </span> : : uint32_t size)</a>
+<a name="310"><span class="lineNum"> 310 </span> : : {</a>
+<a name="311"><span class="lineNum"> 311 </span> : : int rc;</a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 16236 : rc = sim_start_cmd(cmd);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 16236 : if (rc)</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 16236 : if (has_addr) {</span></a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 8117 : rc = sim_send_addr(addr);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 8117 : if (rc)</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : goto bail;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : }</a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 16236 : if (buffer &amp;&amp; size)</span></a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 8098 : rc = sim_wbytes(buffer, size);</span></a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 8138 : bail:</span></a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 16236 : sim_end_cmd();</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 16236 : return rc;</span></a>
+<a name="326"><span class="lineNum"> 326 </span> : : }</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 1 : static int sim_set_4b(struct spi_flash_ctrl *ctrl __unused, bool enable)</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : {</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 1 : sim_ct_4b = enable;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : }</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 869 : static int sim_read(struct spi_flash_ctrl *ctrl __unused, uint32_t pos,</span></a>
+<a name="336"><span class="lineNum"> 336 </span> : : void *buf, uint32_t len)</a>
+<a name="337"><span class="lineNum"> 337 </span> : : {</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 869 : if (sim_ct_4b != sim_fl_4b)</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : ERR(&quot;SIM: 4b mode mismatch in autoread !\n&quot;);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 869 : if ((pos + len) &lt; pos)</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 869 : if ((pos + len) &gt; sim_image_sz)</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 869 : memcpy(buf, sim_image + pos, len);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 869 : return 0;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : };</a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> : : struct spi_flash_ctrl sim_ctrl = {</a>
+<a name="349"><span class="lineNum"> 349 </span> : : .cmd_wr = sim_cmd_wr,</a>
+<a name="350"><span class="lineNum"> 350 </span> : : .cmd_rd = sim_cmd_rd,</a>
+<a name="351"><span class="lineNum"> 351 </span> : : .set_4b = sim_set_4b,</a>
+<a name="352"><span class="lineNum"> 352 </span> : : .read = sim_read,</a>
+<a name="353"><span class="lineNum"> 353 </span> : : };</a>
+<a name="354"><span class="lineNum"> 354 </span> : : </a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : {</a>
+<a name="357"><span class="lineNum"> 357 </span> : : struct blocklevel_device *bl;</a>
+<a name="358"><span class="lineNum"> 358 </span> : : uint64_t total_size;</a>
+<a name="359"><span class="lineNum"> 359 </span> : : uint32_t erase_granule;</a>
+<a name="360"><span class="lineNum"> 360 </span> : : const char *name;</a>
+<a name="361"><span class="lineNum"> 361 </span> : : uint16_t *test;</a>
+<a name="362"><span class="lineNum"> 362 </span> : : struct ecc64 *ecc_test;</a>
+<a name="363"><span class="lineNum"> 363 </span> : : uint64_t *test64;</a>
+<a name="364"><span class="lineNum"> 364 </span> : : int i, rc;</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1 : sim_image = malloc(sim_image_sz);</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 1 : memset(sim_image, 0xff, sim_image_sz);</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 1 : test = malloc(0x10000 * 2);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 1 : rc = flash_init(&amp;sim_ctrl, &amp;bl, NULL);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineNoCov"> 0 : ERR(&quot;flash_init failed with err %d\n&quot;, rc);</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : }</a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 1 : rc = flash_get_info(bl, &amp;name, &amp;total_size, &amp;erase_granule);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineNoCov"> 0 : ERR(&quot;flash_get_info failed with err %d\n&quot;, rc);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="379"><span class="lineNum"> 379 </span> : : }</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> : : /* Make up a test pattern */</a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 65537 : for (i=0; i&lt;0x10000;i++)</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 65536 : test[i] = cpu_to_be16(i);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> : : </a>
+<a name="385"><span class="lineNum"> 385 </span> : : /* Write 64k of stuff at 0 and at 128k */</a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineCov"> 1 : printf(&quot;Writing test patterns...\n&quot;);</span></a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 1 : flash_smart_write(bl, 0, test, 0x10000);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineCov"> 1 : flash_smart_write(bl, 0x20000, test, 0x10000);</span></a>
+<a name="389"><span class="lineNum"> 389 </span> : : </a>
+<a name="390"><span class="lineNum"> 390 </span> : : /* Write &quot;Hello world&quot; straddling the 64k boundary */</a>
+<a name="391"><span class="lineNum"> 391 </span> : : #define HW &quot;Hello World&quot;</a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 1 : printf(&quot;Writing test string...\n&quot;);</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 1 : flash_smart_write(bl, 0xfffc, HW, sizeof(HW));</span></a>
+<a name="394"><span class="lineNum"> 394 </span> : : </a>
+<a name="395"><span class="lineNum"> 395 </span> : : /* Check result */</a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineCov"> 1 : if (memcmp(sim_image + 0xfffc, HW, sizeof(HW))) {</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Test string mismatch !\n&quot;);</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : }</a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 1 : printf(&quot;Test string pass\n&quot;);</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 1 : if (memcmp(sim_image, test, 0xfffc)) {</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Test pattern mismatch !\n&quot;);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="404"><span class="lineNum"> 404 </span> : : }</a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 1 : printf(&quot;Test pattern pass\n&quot;);</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineCov"> 1 : printf(&quot;Test ECC interfaces\n&quot;);</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 1 : flash_smart_write_corrected(bl, 0, test, 0x10000, 1);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 1 : ecc_test = (struct ecc64 *)sim_image;</span></a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 1 : test64 = (uint64_t *)test;</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 7282 : for (i = 0; i &lt; 0x10000 / sizeof(*ecc_test); i++) {</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 7281 : if (test64[i] != ecc_test[i].data) {</span></a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineNoCov"> 0 : ERR(&quot;flash_smart_write_corrected() pattern missmatch at %d: 0x%016lx vs 0x%016lx\n&quot;,</span></a>
+<a name="414"><span class="lineNum"> 414 </span> : : i, test64[i], ecc_test[i].data);</a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : }</a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 7281 : if (ecc_test[i].ecc != eccgenerate(be64toh(test64[i]))) {</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineNoCov"> 0 : ERR(&quot;ECCs don't match 0x%02x vs 0x%02x\n&quot;, ecc_test[i].ecc, eccgenerate(test64[i]));</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> : : }</a>
+<a name="421"><span class="lineNum"> 421 </span> : : }</a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineCov"> 1 : printf(&quot;Test ECC interface pass\n&quot;);</span></a>
+<a name="423"><span class="lineNum"> 423 </span> : : </a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 1 : printf(&quot;Test ECC erase\n&quot;);</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 1 : if (flash_erase(bl, 0, 0x10000) != 0) {</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : ERR(&quot;flash_erase didn't return 0\n&quot;);</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : }</a>
+<a name="429"><span class="lineNum"> 429 </span> : : </a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 7282 : for (i = 0; i &lt; 0x10000 / sizeof(*ecc_test); i++) {</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 7281 : uint8_t zero = 0;</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 7281 : if (ecc_test[i].data != 0xFFFFFFFFFFFFFFFF) {</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Data not properly cleared at %d\n&quot;, i);</span></a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="435"><span class="lineNum"> 435 </span> : : }</a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineCov"> 7281 : rc = flash_write(bl, i * sizeof(*ecc_test) + 8, &amp;zero, 1, 0);</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 7281 : if (rc || ecc_test[i].ecc != 0) {</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Cleared data not correctly ECCed: 0x%02x (0x%016lx) expecting 0 at %d\n&quot;, ecc_test[i].ecc, ecc_test[i].data, i);</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : exit(1);</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : }</a>
+<a name="441"><span class="lineNum"> 441 </span> : : }</a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 1 : printf(&quot;Test ECC erase pass\n&quot;);</span></a>
+<a name="443"><span class="lineNum"> 443 </span> : : </a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 1 : flash_exit(bl);</span></a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 1 : free(test);</span></a>
+<a name="446"><span class="lineNum"> 446 </span> : : </a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="448"><span class="lineNum"> 448 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-ipmi-hiomap.c.func-sort-c.html b/coverage-report/libflash/test/test-ipmi-hiomap.c.func-sort-c.html
new file mode 100644
index 0000000..e38c0ec
--- /dev/null
+++ b/coverage-report/libflash/test/test-ipmi-hiomap.c.func-sort-c.html
@@ -0,0 +1,357 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-ipmi-hiomap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-ipmi-hiomap.c<span style="font-size: 80%;"> (<a href="test-ipmi-hiomap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">646</td>
+ <td class="headerCovTableEntry">661</td>
+ <td class="headerCovTableEntryHi">97.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">69</td>
+ <td class="headerCovTableEntry">69</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="test-ipmi-hiomap.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#3375">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2009">test_hiomap_ack_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2101">test_hiomap_ack_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2072">test_hiomap_ack_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1861">test_hiomap_create_read_window_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2310">test_hiomap_create_read_window_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2262">test_hiomap_create_read_window_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1903">test_hiomap_create_write_window_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2405">test_hiomap_create_write_window_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2357">test_hiomap_create_write_window_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2041">test_hiomap_erase_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2697">test_hiomap_erase_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2651">test_hiomap_erase_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#674">test_hiomap_event_daemon_lost_flash_control</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#597">test_hiomap_event_daemon_ready</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#780">test_hiomap_event_daemon_regained_flash_control_dirty</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#644">test_hiomap_event_daemon_restarted</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#620">test_hiomap_event_daemon_stopped</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1990">test_hiomap_flush_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2601">test_hiomap_flush_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2553">test_hiomap_flush_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1829">test_hiomap_get_flash_info_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2225">test_hiomap_get_flash_info_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2194">test_hiomap_get_flash_info_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1800">test_hiomap_get_info_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2163">test_hiomap_get_info_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2132">test_hiomap_get_info_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#578">test_hiomap_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1948">test_hiomap_mark_dirty_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2506">test_hiomap_mark_dirty_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2455">test_hiomap_mark_dirty_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1668">test_hiomap_protocol_bad_sequence</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1578">test_hiomap_protocol_erase_one_block</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1562">test_hiomap_protocol_erase_one_block_twice</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1502">test_hiomap_protocol_erase_two_blocks</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1593">test_hiomap_protocol_event_before_erase</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1119">test_hiomap_protocol_event_before_read</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1377">test_hiomap_protocol_event_before_write</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1630">test_hiomap_protocol_event_during_erase</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1153">test_hiomap_protocol_event_during_read</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1411">test_hiomap_protocol_event_during_write</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1735">test_hiomap_protocol_get_flash_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1762">test_hiomap_protocol_persistent_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1050">test_hiomap_protocol_read_1block_1byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#956">test_hiomap_protocol_read_one_block</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1083">test_hiomap_protocol_read_one_block_twice</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#976">test_hiomap_protocol_read_one_byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1030">test_hiomap_protocol_read_two_blocks</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2916">test_hiomap_protocol_recovery_failure_ack</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#3283">test_hiomap_protocol_recovery_failure_get_flash_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#3100">test_hiomap_protocol_recovery_failure_get_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#923">test_hiomap_protocol_reset_recovery</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1293">test_hiomap_protocol_write_1block_1byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1189">test_hiomap_protocol_write_one_block</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1357">test_hiomap_protocol_write_one_block_twice</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1208">test_hiomap_protocol_write_one_byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1274">test_hiomap_protocol_write_two_blocks</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1697">test_hiomap_protocol_action_error</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#224">lpc_read_success</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#89">scenario_advance</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#196">ipmi_sel_register</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#83">scenario_enter</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#103">scenario_exit</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#149">ipmi_queue_msg_sync</a></td>
+ <td class="coverFnHi">320</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#143">ipmi_free_msg</a></td>
+ <td class="coverFnHi">328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#113">ipmi_init_msg</a></td>
+ <td class="coverFnHi">328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#126">ipmi_mkmsg</a></td>
+ <td class="coverFnHi">328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#206">lpc_write</a></td>
+ <td class="coverFnHi">13314</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#215">lpc_read</a></td>
+ <td class="coverFnHi">15362</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-ipmi-hiomap.c.func.html b/coverage-report/libflash/test/test-ipmi-hiomap.c.func.html
new file mode 100644
index 0000000..76e6ea9
--- /dev/null
+++ b/coverage-report/libflash/test/test-ipmi-hiomap.c.func.html
@@ -0,0 +1,357 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-ipmi-hiomap.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-ipmi-hiomap.c<span style="font-size: 80%;"> (<a href="test-ipmi-hiomap.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">646</td>
+ <td class="headerCovTableEntry">661</td>
+ <td class="headerCovTableEntryHi">97.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">69</td>
+ <td class="headerCovTableEntry">69</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="test-ipmi-hiomap.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#143">ipmi_free_msg</a></td>
+ <td class="coverFnHi">328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#113">ipmi_init_msg</a></td>
+ <td class="coverFnHi">328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#126">ipmi_mkmsg</a></td>
+ <td class="coverFnHi">328</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#149">ipmi_queue_msg_sync</a></td>
+ <td class="coverFnHi">320</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#196">ipmi_sel_register</a></td>
+ <td class="coverFnHi">52</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#215">lpc_read</a></td>
+ <td class="coverFnHi">15362</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#224">lpc_read_success</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#206">lpc_write</a></td>
+ <td class="coverFnHi">13314</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#3375">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#89">scenario_advance</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#83">scenario_enter</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#103">scenario_exit</a></td>
+ <td class="coverFnHi">57</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2009">test_hiomap_ack_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2101">test_hiomap_ack_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2072">test_hiomap_ack_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1861">test_hiomap_create_read_window_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2310">test_hiomap_create_read_window_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2262">test_hiomap_create_read_window_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1903">test_hiomap_create_write_window_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2405">test_hiomap_create_write_window_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2357">test_hiomap_create_write_window_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2041">test_hiomap_erase_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2697">test_hiomap_erase_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2651">test_hiomap_erase_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#674">test_hiomap_event_daemon_lost_flash_control</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#597">test_hiomap_event_daemon_ready</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#780">test_hiomap_event_daemon_regained_flash_control_dirty</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#644">test_hiomap_event_daemon_restarted</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#620">test_hiomap_event_daemon_stopped</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1990">test_hiomap_flush_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2601">test_hiomap_flush_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2553">test_hiomap_flush_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1829">test_hiomap_get_flash_info_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2225">test_hiomap_get_flash_info_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2194">test_hiomap_get_flash_info_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1800">test_hiomap_get_info_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2163">test_hiomap_get_info_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2132">test_hiomap_get_info_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#578">test_hiomap_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1948">test_hiomap_mark_dirty_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2506">test_hiomap_mark_dirty_malformed_large</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2455">test_hiomap_mark_dirty_malformed_small</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1697">test_hiomap_protocol_action_error</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1668">test_hiomap_protocol_bad_sequence</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1578">test_hiomap_protocol_erase_one_block</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1562">test_hiomap_protocol_erase_one_block_twice</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1502">test_hiomap_protocol_erase_two_blocks</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1593">test_hiomap_protocol_event_before_erase</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1119">test_hiomap_protocol_event_before_read</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1377">test_hiomap_protocol_event_before_write</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1630">test_hiomap_protocol_event_during_erase</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1153">test_hiomap_protocol_event_during_read</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1411">test_hiomap_protocol_event_during_write</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1735">test_hiomap_protocol_get_flash_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1762">test_hiomap_protocol_persistent_error</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1050">test_hiomap_protocol_read_1block_1byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#956">test_hiomap_protocol_read_one_block</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1083">test_hiomap_protocol_read_one_block_twice</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#976">test_hiomap_protocol_read_one_byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1030">test_hiomap_protocol_read_two_blocks</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#2916">test_hiomap_protocol_recovery_failure_ack</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#3283">test_hiomap_protocol_recovery_failure_get_flash_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#3100">test_hiomap_protocol_recovery_failure_get_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#923">test_hiomap_protocol_reset_recovery</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1293">test_hiomap_protocol_write_1block_1byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1189">test_hiomap_protocol_write_one_block</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1357">test_hiomap_protocol_write_one_block_twice</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1208">test_hiomap_protocol_write_one_byte</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-ipmi-hiomap.c.gcov.html#1274">test_hiomap_protocol_write_two_blocks</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-ipmi-hiomap.c.gcov.html b/coverage-report/libflash/test/test-ipmi-hiomap.c.gcov.html
new file mode 100644
index 0000000..19c422e
--- /dev/null
+++ b/coverage-report/libflash/test/test-ipmi-hiomap.c.gcov.html
@@ -0,0 +1,3473 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-ipmi-hiomap.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-ipmi-hiomap.c<span style="font-size: 80%;"> (source / <a href="test-ipmi-hiomap.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">646</td>
+ <td class="headerCovTableEntry">661</td>
+ <td class="headerCovTableEntryHi">97.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">69</td>
+ <td class="headerCovTableEntry">69</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2018-2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;assert.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;ccan/container_of/container_of.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;libflash/blocklevel.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;lock.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;lpc.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;hiomap.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;ipmi.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;opal-api.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;platform.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;../ipmi-hiomap.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;../errors.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : /* Stub for blocklevel debug macros */</a>
+<a name="20"><span class="lineNum"> 20 </span> : : bool libflash_debug;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : const struct bmc_sw_config bmc_sw_hiomap = {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : .ipmi_oem_hiomap_cmd = IPMI_CODE(0x3a, 0x5a),</a>
+<a name="24"><span class="lineNum"> 24 </span> : : };</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : const struct bmc_platform _bmc_platform = {</a>
+<a name="27"><span class="lineNum"> 27 </span> : : .name = &quot;generic:hiomap&quot;,</a>
+<a name="28"><span class="lineNum"> 28 </span> : : .sw = &amp;bmc_sw_hiomap,</a>
+<a name="29"><span class="lineNum"> 29 </span> : : };</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : enum scenario_event_type {</a>
+<a name="32"><span class="lineNum"> 32 </span> : : scenario_sentinel = 0,</a>
+<a name="33"><span class="lineNum"> 33 </span> : : scenario_event_p,</a>
+<a name="34"><span class="lineNum"> 34 </span> : : scenario_cmd,</a>
+<a name="35"><span class="lineNum"> 35 </span> : : scenario_sel,</a>
+<a name="36"><span class="lineNum"> 36 </span> : : scenario_delay,</a>
+<a name="37"><span class="lineNum"> 37 </span> : : };</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : struct scenario_cmd_data {</a>
+<a name="40"><span class="lineNum"> 40 </span> : : uint8_t cmd;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : uint8_t seq;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : uint8_t args[13];</a>
+<a name="43"><span class="lineNum"> 43 </span> : : } __attribute__((packed));</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct scenario_cmd {</a>
+<a name="46"><span class="lineNum"> 46 </span> : : struct scenario_cmd_data req;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : struct scenario_cmd_data resp;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : uint8_t cc;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : size_t resp_size;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : };</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> : : struct scenario_sel {</a>
+<a name="53"><span class="lineNum"> 53 </span> : : uint8_t bmc_state;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : };</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> : : struct scenario_event {</a>
+<a name="57"><span class="lineNum"> 57 </span> : : enum scenario_event_type type;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : union {</a>
+<a name="59"><span class="lineNum"> 59 </span> : : const struct scenario_event *p;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : struct scenario_cmd c;</a>
+<a name="61"><span class="lineNum"> 61 </span> : : struct scenario_sel s;</a>
+<a name="62"><span class="lineNum"> 62 </span> : : };</a>
+<a name="63"><span class="lineNum"> 63 </span> : : };</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : #define SCENARIO_SENTINEL { .type = scenario_sentinel }</a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> : : struct ipmi_sel {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : void (*fn)(uint8_t data, void *context);</a>
+<a name="69"><span class="lineNum"> 69 </span> : : void *context;</a>
+<a name="70"><span class="lineNum"> 70 </span> : : };</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : struct ipmi_msg_ctx {</a>
+<a name="73"><span class="lineNum"> 73 </span> : : const struct scenario_event *scenario;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : const struct scenario_event *cursor;</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> : : struct ipmi_sel sel;</a>
+<a name="77"><span class="lineNum"> 77 </span> : : </a>
+<a name="78"><span class="lineNum"> 78 </span> : : struct ipmi_msg msg;</a>
+<a name="79"><span class="lineNum"> 79 </span> : : };</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : struct ipmi_msg_ctx ipmi_msg_ctx;</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : const struct bmc_platform *bmc_platform = &amp;_bmc_platform;</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 57 : static void scenario_enter(const struct scenario_event *scenario)</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : {</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 57 : ipmi_msg_ctx.scenario = scenario;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 57 : ipmi_msg_ctx.cursor = scenario;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 57 : }</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 5 : static void scenario_advance(void)</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : {</a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 5 : struct ipmi_msg_ctx *ctx = &amp;ipmi_msg_ctx;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 5 : assert(ctx-&gt;cursor-&gt;type == scenario_delay);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 5 : ctx-&gt;cursor++;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> : : /* Deliver all the undelayed, scheduled SELs */</a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 12 : while (ctx-&gt;cursor-&gt;type == scenario_sel) {</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 7 : ctx-&gt;sel.fn(ctx-&gt;cursor-&gt;s.bmc_state, ctx-&gt;sel.context);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 7 : ctx-&gt;cursor++;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : }</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 5 : }</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 57 : static void scenario_exit(void)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : {</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 57 : if (ipmi_msg_ctx.cursor-&gt;type != scenario_sentinel) {</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineNoCov"> 0 : ptrdiff_t d = ipmi_msg_ctx.cursor - ipmi_msg_ctx.scenario;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineNoCov"> 0 : printf(&quot;%s: Exiting on event %tu with event type %d \n&quot;,</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : __func__, d, ipmi_msg_ctx.cursor-&gt;type);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : }</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 57 : }</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 328 : void ipmi_init_msg(struct ipmi_msg *msg, int interface __attribute__((unused)),</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : uint32_t code, void (*complete)(struct ipmi_msg *),</a>
+<a name="117"><span class="lineNum"> 117 </span> : : void *user_data, size_t req_size, size_t resp_size)</a>
+<a name="118"><span class="lineNum"> 118 </span> : : {</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 328 : msg-&gt;backend = NULL;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 328 : msg-&gt;cmd = IPMI_CMD(code);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 328 : msg-&gt;netfn = IPMI_NETFN(code) &lt;&lt; 2;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 328 : msg-&gt;req_size = req_size;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 328 : msg-&gt;resp_size = resp_size;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 328 : msg-&gt;complete = complete;</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 328 : msg-&gt;user_data = user_data;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 328 : }</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 328 : struct ipmi_msg *ipmi_mkmsg(int interface __attribute__((unused)),</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : uint32_t code, void (*complete)(struct ipmi_msg *),</a>
+<a name="130"><span class="lineNum"> 130 </span> : : void *user_data, void *req_data, size_t req_size,</a>
+<a name="131"><span class="lineNum"> 131 </span> : : size_t resp_size)</a>
+<a name="132"><span class="lineNum"> 132 </span> : : {</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 328 : struct ipmi_msg *msg = &amp;ipmi_msg_ctx.msg;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 328 : ipmi_init_msg(msg, 0 /* some bogus value */, code, complete, user_data,</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : req_size, resp_size);</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 328 : msg-&gt;data = malloc(req_size &gt; resp_size ? req_size : resp_size);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 328 : if (req_data)</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 328 : memcpy(msg-&gt;data, req_data, req_size);</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 328 : return msg;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 328 : void ipmi_free_msg(struct ipmi_msg *msg __attribute__((unused)))</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : {</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 328 : if (msg)</span></a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 328 : free(msg-&gt;data);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 328 : }</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 320 : void ipmi_queue_msg_sync(struct ipmi_msg *msg)</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : {</a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 320 : struct ipmi_msg_ctx *ctx = container_of(msg, struct ipmi_msg_ctx, msg);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : const struct scenario_cmd *cmd;</a>
+<a name="155"><span class="lineNum"> 155 </span> : : </a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 320 : if (ctx-&gt;cursor-&gt;type == scenario_cmd) {</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 71 : cmd = &amp;ctx-&gt;cursor-&gt;c;</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 249 : } else if (ctx-&gt;cursor-&gt;type == scenario_event_p) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 249 : assert(ctx-&gt;cursor-&gt;p-&gt;type == scenario_cmd);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 249 : cmd = &amp;ctx-&gt;cursor-&gt;p-&gt;c;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : } else {</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineNoCov"> 0 : printf(&quot;Got unexpected request:\n&quot;);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineNoCov"> 0 : for (ssize_t i = 0; i &lt; msg-&gt;req_size; i++)</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : printf(&quot;msg-&gt;data[%zd]: 0x%02x\n&quot;, i, msg-&gt;data[i]);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : }</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 320 : assert((msg-&gt;netfn &gt;&gt; 2) == 0x3a);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 320 : assert(msg-&gt;cmd == 0x5a);</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 320 : assert(msg-&gt;req_size &gt;= 2);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 320 : if (memcmp(msg-&gt;data, &amp;cmd-&gt;req, msg-&gt;req_size)) {</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineNoCov"> 0 : printf(&quot;Comparing received vs expected message\n&quot;);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : for (ssize_t i = 0; i &lt; msg-&gt;req_size; i++) {</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : printf(&quot;msg-&gt;data[%zd]: 0x%02x, cmd-&gt;req[%zd]: 0x%02x\n&quot;,</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineNoCov"> 0 : i, msg-&gt;data[i], i, ((uint8_t *)(&amp;cmd-&gt;req))[i]);</span></a>
+<a name="177"><span class="lineNum"> 177 </span> : : }</a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : assert(false);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : }</a>
+<a name="180"><span class="lineNum"> 180 </span> : : </a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 320 : msg-&gt;cc = cmd-&gt;cc;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 320 : memcpy(msg-&gt;data, &amp;cmd-&gt;resp, msg-&gt;resp_size);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : </a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 320 : if (cmd-&gt;resp_size)</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 16 : msg-&gt;resp_size = cmd-&gt;resp_size;</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : </a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 320 : msg-&gt;complete(msg);</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 320 : ctx-&gt;cursor++;</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> : : /* Deliver all the scheduled SELs */</a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 337 : while (ctx-&gt;cursor-&gt;type == scenario_sel) {</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 17 : ctx-&gt;sel.fn(ctx-&gt;cursor-&gt;s.bmc_state, ctx-&gt;sel.context);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 17 : ctx-&gt;cursor++;</span></a>
+<a name="195"><span class="lineNum"> 195 </span> : : }</a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 320 : }</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : </a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 52 : int ipmi_sel_register(uint8_t oem_cmd __attribute__((unused)),</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : void (*fn)(uint8_t data, void *context),</a>
+<a name="200"><span class="lineNum"> 200 </span> : : void *context)</a>
+<a name="201"><span class="lineNum"> 201 </span> : : {</a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 52 : ipmi_msg_ctx.sel.fn = fn;</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 52 : ipmi_msg_ctx.sel.context = context;</span></a>
+<a name="204"><span class="lineNum"> 204 </span> : : </a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 52 : return 0;</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : }</a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 13314 : int64_t lpc_write(enum OpalLPCAddressType addr_type __attribute__((unused)),</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : uint32_t addr __attribute__((unused)),</a>
+<a name="210"><span class="lineNum"> 210 </span> : : uint32_t data __attribute__((unused)),</a>
+<a name="211"><span class="lineNum"> 211 </span> : : uint32_t sz)</a>
+<a name="212"><span class="lineNum"> 212 </span> : : {</a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineCov"> 13314 : assert(sz != 0);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 13314 : return 0;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> : : </a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 15362 : int64_t lpc_read(enum OpalLPCAddressType addr_type __attribute__((unused)),</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : uint32_t addr __attribute__((unused)), uint32_t *data,</a>
+<a name="219"><span class="lineNum"> 219 </span> : : uint32_t sz)</a>
+<a name="220"><span class="lineNum"> 220 </span> : : {</a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 15362 : memset(data, 0xaa, sz);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 15362 : return 0;</span></a>
+<a name="224"><span class="lineNum"> 224 </span> : : }</a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 4 : static bool lpc_read_success(const uint8_t *buf, size_t len)</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : {</a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 4 : if (len &lt; 64) {</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 2 : while (len--)</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 1 : if (*buf++ != 0xaa)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : return true;</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : }</a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 195 : for (int i = 0; i &lt; 64; i++)</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 192 : if (buf[i] != 0xaa)</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> : : </a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 3 : return !memcmp(buf, buf + 64, len - 64);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : }</a>
+<a name="241"><span class="lineNum"> 241 </span> : : </a>
+<a name="242"><span class="lineNum"> 242 </span> : : /* Commonly used messages */</a>
+<a name="243"><span class="lineNum"> 243 </span> : : </a>
+<a name="244"><span class="lineNum"> 244 </span> : : static const struct scenario_event hiomap_ack_call = {</a>
+<a name="245"><span class="lineNum"> 245 </span> : : .type = scenario_cmd,</a>
+<a name="246"><span class="lineNum"> 246 </span> : : .c = {</a>
+<a name="247"><span class="lineNum"> 247 </span> : : .req = {</a>
+<a name="248"><span class="lineNum"> 248 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="249"><span class="lineNum"> 249 </span> : : .seq = 1,</a>
+<a name="250"><span class="lineNum"> 250 </span> : : .args = {</a>
+<a name="251"><span class="lineNum"> 251 </span> : : [0] = HIOMAP_E_ACK_MASK,</a>
+<a name="252"><span class="lineNum"> 252 </span> : : },</a>
+<a name="253"><span class="lineNum"> 253 </span> : : },</a>
+<a name="254"><span class="lineNum"> 254 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="255"><span class="lineNum"> 255 </span> : : .resp = {</a>
+<a name="256"><span class="lineNum"> 256 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="257"><span class="lineNum"> 257 </span> : : .seq = 1,</a>
+<a name="258"><span class="lineNum"> 258 </span> : : },</a>
+<a name="259"><span class="lineNum"> 259 </span> : : },</a>
+<a name="260"><span class="lineNum"> 260 </span> : : };</a>
+<a name="261"><span class="lineNum"> 261 </span> : : </a>
+<a name="262"><span class="lineNum"> 262 </span> : : static const struct scenario_event hiomap_get_info_call = {</a>
+<a name="263"><span class="lineNum"> 263 </span> : : .type = scenario_cmd,</a>
+<a name="264"><span class="lineNum"> 264 </span> : : .c = {</a>
+<a name="265"><span class="lineNum"> 265 </span> : : .req = {</a>
+<a name="266"><span class="lineNum"> 266 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="267"><span class="lineNum"> 267 </span> : : .seq = 2,</a>
+<a name="268"><span class="lineNum"> 268 </span> : : .args = {</a>
+<a name="269"><span class="lineNum"> 269 </span> : : [0] = HIOMAP_V2,</a>
+<a name="270"><span class="lineNum"> 270 </span> : : },</a>
+<a name="271"><span class="lineNum"> 271 </span> : : },</a>
+<a name="272"><span class="lineNum"> 272 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="273"><span class="lineNum"> 273 </span> : : .resp = {</a>
+<a name="274"><span class="lineNum"> 274 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="275"><span class="lineNum"> 275 </span> : : .seq = 2,</a>
+<a name="276"><span class="lineNum"> 276 </span> : : .args = {</a>
+<a name="277"><span class="lineNum"> 277 </span> : : [0] = HIOMAP_V2,</a>
+<a name="278"><span class="lineNum"> 278 </span> : : [1] = 12,</a>
+<a name="279"><span class="lineNum"> 279 </span> : : [2] = 8, [3] = 0,</a>
+<a name="280"><span class="lineNum"> 280 </span> : : },</a>
+<a name="281"><span class="lineNum"> 281 </span> : : },</a>
+<a name="282"><span class="lineNum"> 282 </span> : : },</a>
+<a name="283"><span class="lineNum"> 283 </span> : : };</a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> : : static const struct scenario_event hiomap_get_flash_info_call = {</a>
+<a name="286"><span class="lineNum"> 286 </span> : : .type = scenario_cmd,</a>
+<a name="287"><span class="lineNum"> 287 </span> : : .c = {</a>
+<a name="288"><span class="lineNum"> 288 </span> : : .req = {</a>
+<a name="289"><span class="lineNum"> 289 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="290"><span class="lineNum"> 290 </span> : : .seq = 3,</a>
+<a name="291"><span class="lineNum"> 291 </span> : : .args = {</a>
+<a name="292"><span class="lineNum"> 292 </span> : : },</a>
+<a name="293"><span class="lineNum"> 293 </span> : : },</a>
+<a name="294"><span class="lineNum"> 294 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="295"><span class="lineNum"> 295 </span> : : .resp = {</a>
+<a name="296"><span class="lineNum"> 296 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="297"><span class="lineNum"> 297 </span> : : .seq = 3,</a>
+<a name="298"><span class="lineNum"> 298 </span> : : .args = {</a>
+<a name="299"><span class="lineNum"> 299 </span> : : [0] = 0x00, [1] = 0x20,</a>
+<a name="300"><span class="lineNum"> 300 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="301"><span class="lineNum"> 301 </span> : : },</a>
+<a name="302"><span class="lineNum"> 302 </span> : : },</a>
+<a name="303"><span class="lineNum"> 303 </span> : : },</a>
+<a name="304"><span class="lineNum"> 304 </span> : : };</a>
+<a name="305"><span class="lineNum"> 305 </span> : : </a>
+<a name="306"><span class="lineNum"> 306 </span> : : static const struct scenario_event</a>
+<a name="307"><span class="lineNum"> 307 </span> : : hiomap_create_read_window_qs0l1_rs0l1_call = {</a>
+<a name="308"><span class="lineNum"> 308 </span> : : .type = scenario_cmd,</a>
+<a name="309"><span class="lineNum"> 309 </span> : : .c = {</a>
+<a name="310"><span class="lineNum"> 310 </span> : : .req = {</a>
+<a name="311"><span class="lineNum"> 311 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="312"><span class="lineNum"> 312 </span> : : .seq = 4,</a>
+<a name="313"><span class="lineNum"> 313 </span> : : .args = {</a>
+<a name="314"><span class="lineNum"> 314 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="315"><span class="lineNum"> 315 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="316"><span class="lineNum"> 316 </span> : : },</a>
+<a name="317"><span class="lineNum"> 317 </span> : : },</a>
+<a name="318"><span class="lineNum"> 318 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="319"><span class="lineNum"> 319 </span> : : .resp = {</a>
+<a name="320"><span class="lineNum"> 320 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="321"><span class="lineNum"> 321 </span> : : .seq = 4,</a>
+<a name="322"><span class="lineNum"> 322 </span> : : .args = {</a>
+<a name="323"><span class="lineNum"> 323 </span> : : [0] = 0xff, [1] = 0x0f,</a>
+<a name="324"><span class="lineNum"> 324 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="325"><span class="lineNum"> 325 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="326"><span class="lineNum"> 326 </span> : : },</a>
+<a name="327"><span class="lineNum"> 327 </span> : : },</a>
+<a name="328"><span class="lineNum"> 328 </span> : : },</a>
+<a name="329"><span class="lineNum"> 329 </span> : : };</a>
+<a name="330"><span class="lineNum"> 330 </span> : : </a>
+<a name="331"><span class="lineNum"> 331 </span> : : static const struct scenario_event</a>
+<a name="332"><span class="lineNum"> 332 </span> : : hiomap_create_read_window_qs0l2_rs0l1_call = {</a>
+<a name="333"><span class="lineNum"> 333 </span> : : .type = scenario_cmd,</a>
+<a name="334"><span class="lineNum"> 334 </span> : : .c = {</a>
+<a name="335"><span class="lineNum"> 335 </span> : : .req = {</a>
+<a name="336"><span class="lineNum"> 336 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="337"><span class="lineNum"> 337 </span> : : .seq = 4,</a>
+<a name="338"><span class="lineNum"> 338 </span> : : .args = {</a>
+<a name="339"><span class="lineNum"> 339 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="340"><span class="lineNum"> 340 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="341"><span class="lineNum"> 341 </span> : : },</a>
+<a name="342"><span class="lineNum"> 342 </span> : : },</a>
+<a name="343"><span class="lineNum"> 343 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="344"><span class="lineNum"> 344 </span> : : .resp = {</a>
+<a name="345"><span class="lineNum"> 345 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="346"><span class="lineNum"> 346 </span> : : .seq = 4,</a>
+<a name="347"><span class="lineNum"> 347 </span> : : .args = {</a>
+<a name="348"><span class="lineNum"> 348 </span> : : [0] = 0xff, [1] = 0x0f,</a>
+<a name="349"><span class="lineNum"> 349 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="350"><span class="lineNum"> 350 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="351"><span class="lineNum"> 351 </span> : : },</a>
+<a name="352"><span class="lineNum"> 352 </span> : : },</a>
+<a name="353"><span class="lineNum"> 353 </span> : : },</a>
+<a name="354"><span class="lineNum"> 354 </span> : : };</a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> : : static const struct scenario_event</a>
+<a name="357"><span class="lineNum"> 357 </span> : : hiomap_create_write_window_qs0l1_rs0l1_call = {</a>
+<a name="358"><span class="lineNum"> 358 </span> : : .type = scenario_cmd,</a>
+<a name="359"><span class="lineNum"> 359 </span> : : .c = {</a>
+<a name="360"><span class="lineNum"> 360 </span> : : .req = {</a>
+<a name="361"><span class="lineNum"> 361 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="362"><span class="lineNum"> 362 </span> : : .seq = 4,</a>
+<a name="363"><span class="lineNum"> 363 </span> : : .args = {</a>
+<a name="364"><span class="lineNum"> 364 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="365"><span class="lineNum"> 365 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="366"><span class="lineNum"> 366 </span> : : },</a>
+<a name="367"><span class="lineNum"> 367 </span> : : },</a>
+<a name="368"><span class="lineNum"> 368 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="369"><span class="lineNum"> 369 </span> : : .resp = {</a>
+<a name="370"><span class="lineNum"> 370 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="371"><span class="lineNum"> 371 </span> : : .seq = 4,</a>
+<a name="372"><span class="lineNum"> 372 </span> : : .args = {</a>
+<a name="373"><span class="lineNum"> 373 </span> : : [0] = 0xff, [1] = 0x0f,</a>
+<a name="374"><span class="lineNum"> 374 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="375"><span class="lineNum"> 375 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="376"><span class="lineNum"> 376 </span> : : },</a>
+<a name="377"><span class="lineNum"> 377 </span> : : },</a>
+<a name="378"><span class="lineNum"> 378 </span> : : },</a>
+<a name="379"><span class="lineNum"> 379 </span> : : };</a>
+<a name="380"><span class="lineNum"> 380 </span> : : </a>
+<a name="381"><span class="lineNum"> 381 </span> : : static const struct scenario_event hiomap_mark_dirty_qs0l1_call = {</a>
+<a name="382"><span class="lineNum"> 382 </span> : : .type = scenario_cmd,</a>
+<a name="383"><span class="lineNum"> 383 </span> : : .c = {</a>
+<a name="384"><span class="lineNum"> 384 </span> : : .req = {</a>
+<a name="385"><span class="lineNum"> 385 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="386"><span class="lineNum"> 386 </span> : : .seq = 5,</a>
+<a name="387"><span class="lineNum"> 387 </span> : : .args = {</a>
+<a name="388"><span class="lineNum"> 388 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="389"><span class="lineNum"> 389 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="390"><span class="lineNum"> 390 </span> : : },</a>
+<a name="391"><span class="lineNum"> 391 </span> : : },</a>
+<a name="392"><span class="lineNum"> 392 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="393"><span class="lineNum"> 393 </span> : : .resp = {</a>
+<a name="394"><span class="lineNum"> 394 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="395"><span class="lineNum"> 395 </span> : : .seq = 5,</a>
+<a name="396"><span class="lineNum"> 396 </span> : : },</a>
+<a name="397"><span class="lineNum"> 397 </span> : : },</a>
+<a name="398"><span class="lineNum"> 398 </span> : : };</a>
+<a name="399"><span class="lineNum"> 399 </span> : : </a>
+<a name="400"><span class="lineNum"> 400 </span> : : static const struct scenario_event</a>
+<a name="401"><span class="lineNum"> 401 </span> : : hiomap_create_write_window_qs0l2_rs0l1_call = {</a>
+<a name="402"><span class="lineNum"> 402 </span> : : .type = scenario_cmd,</a>
+<a name="403"><span class="lineNum"> 403 </span> : : .c = {</a>
+<a name="404"><span class="lineNum"> 404 </span> : : .req = {</a>
+<a name="405"><span class="lineNum"> 405 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="406"><span class="lineNum"> 406 </span> : : .seq = 4,</a>
+<a name="407"><span class="lineNum"> 407 </span> : : .args = {</a>
+<a name="408"><span class="lineNum"> 408 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="409"><span class="lineNum"> 409 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="410"><span class="lineNum"> 410 </span> : : },</a>
+<a name="411"><span class="lineNum"> 411 </span> : : },</a>
+<a name="412"><span class="lineNum"> 412 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="413"><span class="lineNum"> 413 </span> : : .resp = {</a>
+<a name="414"><span class="lineNum"> 414 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="415"><span class="lineNum"> 415 </span> : : .seq = 4,</a>
+<a name="416"><span class="lineNum"> 416 </span> : : .args = {</a>
+<a name="417"><span class="lineNum"> 417 </span> : : [0] = 0xff, [1] = 0x0f,</a>
+<a name="418"><span class="lineNum"> 418 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="419"><span class="lineNum"> 419 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="420"><span class="lineNum"> 420 </span> : : },</a>
+<a name="421"><span class="lineNum"> 421 </span> : : },</a>
+<a name="422"><span class="lineNum"> 422 </span> : : },</a>
+<a name="423"><span class="lineNum"> 423 </span> : : };</a>
+<a name="424"><span class="lineNum"> 424 </span> : : </a>
+<a name="425"><span class="lineNum"> 425 </span> : : static const struct scenario_event hiomap_flush_call = {</a>
+<a name="426"><span class="lineNum"> 426 </span> : : .type = scenario_cmd,</a>
+<a name="427"><span class="lineNum"> 427 </span> : : .c = {</a>
+<a name="428"><span class="lineNum"> 428 </span> : : .req = {</a>
+<a name="429"><span class="lineNum"> 429 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="430"><span class="lineNum"> 430 </span> : : .seq = 6,</a>
+<a name="431"><span class="lineNum"> 431 </span> : : },</a>
+<a name="432"><span class="lineNum"> 432 </span> : : .resp = {</a>
+<a name="433"><span class="lineNum"> 433 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="434"><span class="lineNum"> 434 </span> : : .seq = 6,</a>
+<a name="435"><span class="lineNum"> 435 </span> : : },</a>
+<a name="436"><span class="lineNum"> 436 </span> : : },</a>
+<a name="437"><span class="lineNum"> 437 </span> : : };</a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> : : static const struct scenario_event</a>
+<a name="440"><span class="lineNum"> 440 </span> : : hiomap_create_write_window_qs1l1_rs1l1_call = {</a>
+<a name="441"><span class="lineNum"> 441 </span> : : .type = scenario_cmd,</a>
+<a name="442"><span class="lineNum"> 442 </span> : : .c = {</a>
+<a name="443"><span class="lineNum"> 443 </span> : : .req = {</a>
+<a name="444"><span class="lineNum"> 444 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="445"><span class="lineNum"> 445 </span> : : .seq = 7,</a>
+<a name="446"><span class="lineNum"> 446 </span> : : .args = {</a>
+<a name="447"><span class="lineNum"> 447 </span> : : [0] = 0x01, [1] = 0x00,</a>
+<a name="448"><span class="lineNum"> 448 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="449"><span class="lineNum"> 449 </span> : : },</a>
+<a name="450"><span class="lineNum"> 450 </span> : : },</a>
+<a name="451"><span class="lineNum"> 451 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="452"><span class="lineNum"> 452 </span> : : .resp = {</a>
+<a name="453"><span class="lineNum"> 453 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="454"><span class="lineNum"> 454 </span> : : .seq = 7,</a>
+<a name="455"><span class="lineNum"> 455 </span> : : .args = {</a>
+<a name="456"><span class="lineNum"> 456 </span> : : [0] = 0xfe, [1] = 0x0f,</a>
+<a name="457"><span class="lineNum"> 457 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="458"><span class="lineNum"> 458 </span> : : [4] = 0x01, [5] = 0x00,</a>
+<a name="459"><span class="lineNum"> 459 </span> : : },</a>
+<a name="460"><span class="lineNum"> 460 </span> : : },</a>
+<a name="461"><span class="lineNum"> 461 </span> : : },</a>
+<a name="462"><span class="lineNum"> 462 </span> : : };</a>
+<a name="463"><span class="lineNum"> 463 </span> : : </a>
+<a name="464"><span class="lineNum"> 464 </span> : : static const struct scenario_event hiomap_erase_qs0l1_call = {</a>
+<a name="465"><span class="lineNum"> 465 </span> : : .type = scenario_cmd,</a>
+<a name="466"><span class="lineNum"> 466 </span> : : .c = {</a>
+<a name="467"><span class="lineNum"> 467 </span> : : .req = {</a>
+<a name="468"><span class="lineNum"> 468 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="469"><span class="lineNum"> 469 </span> : : .seq = 5,</a>
+<a name="470"><span class="lineNum"> 470 </span> : : .args = {</a>
+<a name="471"><span class="lineNum"> 471 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="472"><span class="lineNum"> 472 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="473"><span class="lineNum"> 473 </span> : : },</a>
+<a name="474"><span class="lineNum"> 474 </span> : : },</a>
+<a name="475"><span class="lineNum"> 475 </span> : : .resp = {</a>
+<a name="476"><span class="lineNum"> 476 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="477"><span class="lineNum"> 477 </span> : : .seq = 5,</a>
+<a name="478"><span class="lineNum"> 478 </span> : : },</a>
+<a name="479"><span class="lineNum"> 479 </span> : : },</a>
+<a name="480"><span class="lineNum"> 480 </span> : : };</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> : : static const struct scenario_event hiomap_reset_call_seq_4 = {</a>
+<a name="483"><span class="lineNum"> 483 </span> : : .type = scenario_cmd,</a>
+<a name="484"><span class="lineNum"> 484 </span> : : .c = {</a>
+<a name="485"><span class="lineNum"> 485 </span> : : .req = {</a>
+<a name="486"><span class="lineNum"> 486 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="487"><span class="lineNum"> 487 </span> : : .seq = 4,</a>
+<a name="488"><span class="lineNum"> 488 </span> : : },</a>
+<a name="489"><span class="lineNum"> 489 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="490"><span class="lineNum"> 490 </span> : : .resp = {</a>
+<a name="491"><span class="lineNum"> 491 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="492"><span class="lineNum"> 492 </span> : : .seq = 4,</a>
+<a name="493"><span class="lineNum"> 493 </span> : : },</a>
+<a name="494"><span class="lineNum"> 494 </span> : : },</a>
+<a name="495"><span class="lineNum"> 495 </span> : : };</a>
+<a name="496"><span class="lineNum"> 496 </span> : : </a>
+<a name="497"><span class="lineNum"> 497 </span> : : static const struct scenario_event hiomap_reset_call_seq_5 = {</a>
+<a name="498"><span class="lineNum"> 498 </span> : : .type = scenario_cmd,</a>
+<a name="499"><span class="lineNum"> 499 </span> : : .c = {</a>
+<a name="500"><span class="lineNum"> 500 </span> : : .req = {</a>
+<a name="501"><span class="lineNum"> 501 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="502"><span class="lineNum"> 502 </span> : : .seq = 5,</a>
+<a name="503"><span class="lineNum"> 503 </span> : : },</a>
+<a name="504"><span class="lineNum"> 504 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="505"><span class="lineNum"> 505 </span> : : .resp = {</a>
+<a name="506"><span class="lineNum"> 506 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="507"><span class="lineNum"> 507 </span> : : .seq = 5,</a>
+<a name="508"><span class="lineNum"> 508 </span> : : },</a>
+<a name="509"><span class="lineNum"> 509 </span> : : },</a>
+<a name="510"><span class="lineNum"> 510 </span> : : };</a>
+<a name="511"><span class="lineNum"> 511 </span> : : </a>
+<a name="512"><span class="lineNum"> 512 </span> : : static const struct scenario_event hiomap_reset_call_seq_6 = {</a>
+<a name="513"><span class="lineNum"> 513 </span> : : .type = scenario_cmd,</a>
+<a name="514"><span class="lineNum"> 514 </span> : : .c = {</a>
+<a name="515"><span class="lineNum"> 515 </span> : : .req = {</a>
+<a name="516"><span class="lineNum"> 516 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="517"><span class="lineNum"> 517 </span> : : .seq = 6,</a>
+<a name="518"><span class="lineNum"> 518 </span> : : },</a>
+<a name="519"><span class="lineNum"> 519 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="520"><span class="lineNum"> 520 </span> : : .resp = {</a>
+<a name="521"><span class="lineNum"> 521 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="522"><span class="lineNum"> 522 </span> : : .seq = 6,</a>
+<a name="523"><span class="lineNum"> 523 </span> : : },</a>
+<a name="524"><span class="lineNum"> 524 </span> : : },</a>
+<a name="525"><span class="lineNum"> 525 </span> : : };</a>
+<a name="526"><span class="lineNum"> 526 </span> : : </a>
+<a name="527"><span class="lineNum"> 527 </span> : : static const struct scenario_event hiomap_reset_call_seq_7 = {</a>
+<a name="528"><span class="lineNum"> 528 </span> : : .type = scenario_cmd,</a>
+<a name="529"><span class="lineNum"> 529 </span> : : .c = {</a>
+<a name="530"><span class="lineNum"> 530 </span> : : .req = {</a>
+<a name="531"><span class="lineNum"> 531 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="532"><span class="lineNum"> 532 </span> : : .seq = 7,</a>
+<a name="533"><span class="lineNum"> 533 </span> : : },</a>
+<a name="534"><span class="lineNum"> 534 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="535"><span class="lineNum"> 535 </span> : : .resp = {</a>
+<a name="536"><span class="lineNum"> 536 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="537"><span class="lineNum"> 537 </span> : : .seq = 7,</a>
+<a name="538"><span class="lineNum"> 538 </span> : : },</a>
+<a name="539"><span class="lineNum"> 539 </span> : : },</a>
+<a name="540"><span class="lineNum"> 540 </span> : : };</a>
+<a name="541"><span class="lineNum"> 541 </span> : : </a>
+<a name="542"><span class="lineNum"> 542 </span> : : static const struct scenario_event hiomap_reset_call_seq_9 = {</a>
+<a name="543"><span class="lineNum"> 543 </span> : : .type = scenario_cmd,</a>
+<a name="544"><span class="lineNum"> 544 </span> : : .c = {</a>
+<a name="545"><span class="lineNum"> 545 </span> : : .req = {</a>
+<a name="546"><span class="lineNum"> 546 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="547"><span class="lineNum"> 547 </span> : : .seq = 9,</a>
+<a name="548"><span class="lineNum"> 548 </span> : : },</a>
+<a name="549"><span class="lineNum"> 549 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="550"><span class="lineNum"> 550 </span> : : .resp = {</a>
+<a name="551"><span class="lineNum"> 551 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="552"><span class="lineNum"> 552 </span> : : .seq = 9,</a>
+<a name="553"><span class="lineNum"> 553 </span> : : },</a>
+<a name="554"><span class="lineNum"> 554 </span> : : },</a>
+<a name="555"><span class="lineNum"> 555 </span> : : };</a>
+<a name="556"><span class="lineNum"> 556 </span> : : </a>
+<a name="557"><span class="lineNum"> 557 </span> : : static const struct scenario_event hiomap_reset_call_seq_a = {</a>
+<a name="558"><span class="lineNum"> 558 </span> : : .type = scenario_cmd,</a>
+<a name="559"><span class="lineNum"> 559 </span> : : .c = {</a>
+<a name="560"><span class="lineNum"> 560 </span> : : .req = {</a>
+<a name="561"><span class="lineNum"> 561 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="562"><span class="lineNum"> 562 </span> : : .seq = 0xa,</a>
+<a name="563"><span class="lineNum"> 563 </span> : : },</a>
+<a name="564"><span class="lineNum"> 564 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="565"><span class="lineNum"> 565 </span> : : .resp = {</a>
+<a name="566"><span class="lineNum"> 566 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="567"><span class="lineNum"> 567 </span> : : .seq = 0xa,</a>
+<a name="568"><span class="lineNum"> 568 </span> : : },</a>
+<a name="569"><span class="lineNum"> 569 </span> : : },</a>
+<a name="570"><span class="lineNum"> 570 </span> : : };</a>
+<a name="571"><span class="lineNum"> 571 </span> : : </a>
+<a name="572"><span class="lineNum"> 572 </span> : : static const struct scenario_event scenario_hiomap_init[] = {</a>
+<a name="573"><span class="lineNum"> 573 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="574"><span class="lineNum"> 574 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="575"><span class="lineNum"> 575 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="576"><span class="lineNum"> 576 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_4, },</a>
+<a name="577"><span class="lineNum"> 577 </span> : : SCENARIO_SENTINEL,</a>
+<a name="578"><span class="lineNum"> 578 </span> : : };</a>
+<a name="579"><span class="lineNum"> 579 </span> : : </a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineCov"> 1 : static void test_hiomap_init(void)</span></a>
+<a name="581"><span class="lineNum"> 581 </span> : : {</a>
+<a name="582"><span class="lineNum"> 582 </span> : : struct blocklevel_device *bl;</a>
+<a name="583"><span class="lineNum"> 583 </span> : : </a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_init);</span></a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> : : static const struct scenario_event scenario_hiomap_event_daemon_ready[] = {</a>
+<a name="591"><span class="lineNum"> 591 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="592"><span class="lineNum"> 592 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="593"><span class="lineNum"> 593 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="594"><span class="lineNum"> 594 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_DAEMON_READY } },</a>
+<a name="595"><span class="lineNum"> 595 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_4, },</a>
+<a name="596"><span class="lineNum"> 596 </span> : : SCENARIO_SENTINEL,</a>
+<a name="597"><span class="lineNum"> 597 </span> : : };</a>
+<a name="598"><span class="lineNum"> 598 </span> : : </a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineCov"> 1 : static void test_hiomap_event_daemon_ready(void)</span></a>
+<a name="600"><span class="lineNum"> 600 </span> : : {</a>
+<a name="601"><span class="lineNum"> 601 </span> : : struct blocklevel_device *bl;</a>
+<a name="602"><span class="lineNum"> 602 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="603"><span class="lineNum"> 603 </span> : : </a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_event_daemon_ready);</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineCov"> 1 : assert(ctx-&gt;bmc_state == HIOMAP_E_DAEMON_READY);</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="610"><span class="lineNum"> 610 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="611"><span class="lineNum"> 611 </span> : : </a>
+<a name="612"><span class="lineNum"> 612 </span> : : static const struct scenario_event scenario_hiomap_event_daemon_stopped[] = {</a>
+<a name="613"><span class="lineNum"> 613 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="614"><span class="lineNum"> 614 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="615"><span class="lineNum"> 615 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="616"><span class="lineNum"> 616 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_DAEMON_READY } },</a>
+<a name="617"><span class="lineNum"> 617 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_PROTOCOL_RESET } },</a>
+<a name="618"><span class="lineNum"> 618 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_4, },</a>
+<a name="619"><span class="lineNum"> 619 </span> : : SCENARIO_SENTINEL,</a>
+<a name="620"><span class="lineNum"> 620 </span> : : };</a>
+<a name="621"><span class="lineNum"> 621 </span> : : </a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineCov"> 1 : static void test_hiomap_event_daemon_stopped(void)</span></a>
+<a name="623"><span class="lineNum"> 623 </span> : : {</a>
+<a name="624"><span class="lineNum"> 624 </span> : : struct blocklevel_device *bl;</a>
+<a name="625"><span class="lineNum"> 625 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="626"><span class="lineNum"> 626 </span> : : </a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_event_daemon_stopped);</span></a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 1 : assert(ctx-&gt;bmc_state == HIOMAP_E_PROTOCOL_RESET);</span></a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="634"><span class="lineNum"> 634 </span> : : </a>
+<a name="635"><span class="lineNum"> 635 </span> : : static const struct scenario_event scenario_hiomap_event_daemon_restarted[] = {</a>
+<a name="636"><span class="lineNum"> 636 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="637"><span class="lineNum"> 637 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="638"><span class="lineNum"> 638 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="639"><span class="lineNum"> 639 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_DAEMON_READY } },</a>
+<a name="640"><span class="lineNum"> 640 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_PROTOCOL_RESET } },</a>
+<a name="641"><span class="lineNum"> 641 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_DAEMON_READY } },</a>
+<a name="642"><span class="lineNum"> 642 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_4, },</a>
+<a name="643"><span class="lineNum"> 643 </span> : : SCENARIO_SENTINEL,</a>
+<a name="644"><span class="lineNum"> 644 </span> : : };</a>
+<a name="645"><span class="lineNum"> 645 </span> : : </a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineCov"> 1 : static void test_hiomap_event_daemon_restarted(void)</span></a>
+<a name="647"><span class="lineNum"> 647 </span> : : {</a>
+<a name="648"><span class="lineNum"> 648 </span> : : struct blocklevel_device *bl;</a>
+<a name="649"><span class="lineNum"> 649 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="650"><span class="lineNum"> 650 </span> : : </a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_event_daemon_restarted);</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 1 : assert(ctx-&gt;bmc_state == (HIOMAP_E_DAEMON_READY | HIOMAP_E_PROTOCOL_RESET));</span></a>
+<a name="655"><span class="lineNum"> 655 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="656"><span class="lineNum"> 656 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="658"><span class="lineNum"> 658 </span> : : </a>
+<a name="659"><span class="lineNum"> 659 </span> : : static const struct scenario_event</a>
+<a name="660"><span class="lineNum"> 660 </span> : : scenario_hiomap_event_daemon_lost_flash_control[] = {</a>
+<a name="661"><span class="lineNum"> 661 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="662"><span class="lineNum"> 662 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="663"><span class="lineNum"> 663 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="664"><span class="lineNum"> 664 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_DAEMON_READY } },</a>
+<a name="665"><span class="lineNum"> 665 </span> : : {</a>
+<a name="666"><span class="lineNum"> 666 </span> : : .type = scenario_sel,</a>
+<a name="667"><span class="lineNum"> 667 </span> : : .s = {</a>
+<a name="668"><span class="lineNum"> 668 </span> : : .bmc_state = (HIOMAP_E_DAEMON_READY</a>
+<a name="669"><span class="lineNum"> 669 </span> : : | HIOMAP_E_FLASH_LOST),</a>
+<a name="670"><span class="lineNum"> 670 </span> : : }</a>
+<a name="671"><span class="lineNum"> 671 </span> : : },</a>
+<a name="672"><span class="lineNum"> 672 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="673"><span class="lineNum"> 673 </span> : : SCENARIO_SENTINEL,</a>
+<a name="674"><span class="lineNum"> 674 </span> : : };</a>
+<a name="675"><span class="lineNum"> 675 </span> : : </a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineCov"> 1 : static void test_hiomap_event_daemon_lost_flash_control(void)</span></a>
+<a name="677"><span class="lineNum"> 677 </span> : : {</a>
+<a name="678"><span class="lineNum"> 678 </span> : : struct blocklevel_device *bl;</a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineCov"> 1 : size_t len = 2 * (1 &lt;&lt; 12);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> : : void *buf;</a>
+<a name="681"><span class="lineNum"> 681 </span> : : </a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 1 : buf = malloc(len);</span></a>
+<a name="683"><span class="lineNum"> 683 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="684"><span class="lineNum"> 684 </span> : : </a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_event_daemon_lost_flash_control);</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 1 : assert(bl-&gt;read(bl, 0, buf, len) == FLASH_ERR_AGAIN);</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : </a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="692"><span class="lineNum"> 692 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="693"><span class="lineNum"> 693 </span> : : </a>
+<a name="694"><span class="lineNum"> 694 </span> : : static const struct scenario_event</a>
+<a name="695"><span class="lineNum"> 695 </span> : : scenario_hiomap_event_daemon_regained_flash_control_dirty[] = {</a>
+<a name="696"><span class="lineNum"> 696 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="697"><span class="lineNum"> 697 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="698"><span class="lineNum"> 698 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="699"><span class="lineNum"> 699 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_DAEMON_READY } },</a>
+<a name="700"><span class="lineNum"> 700 </span> : : {</a>
+<a name="701"><span class="lineNum"> 701 </span> : : .type = scenario_cmd,</a>
+<a name="702"><span class="lineNum"> 702 </span> : : .c = {</a>
+<a name="703"><span class="lineNum"> 703 </span> : : .req = {</a>
+<a name="704"><span class="lineNum"> 704 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="705"><span class="lineNum"> 705 </span> : : .seq = 4,</a>
+<a name="706"><span class="lineNum"> 706 </span> : : .args = {</a>
+<a name="707"><span class="lineNum"> 707 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="708"><span class="lineNum"> 708 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="709"><span class="lineNum"> 709 </span> : : },</a>
+<a name="710"><span class="lineNum"> 710 </span> : : },</a>
+<a name="711"><span class="lineNum"> 711 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="712"><span class="lineNum"> 712 </span> : : .resp = {</a>
+<a name="713"><span class="lineNum"> 713 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="714"><span class="lineNum"> 714 </span> : : .seq = 4,</a>
+<a name="715"><span class="lineNum"> 715 </span> : : .args = {</a>
+<a name="716"><span class="lineNum"> 716 </span> : : [0] = 0xfe, [1] = 0x0f,</a>
+<a name="717"><span class="lineNum"> 717 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="718"><span class="lineNum"> 718 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="719"><span class="lineNum"> 719 </span> : : },</a>
+<a name="720"><span class="lineNum"> 720 </span> : : },</a>
+<a name="721"><span class="lineNum"> 721 </span> : : },</a>
+<a name="722"><span class="lineNum"> 722 </span> : : },</a>
+<a name="723"><span class="lineNum"> 723 </span> : : {</a>
+<a name="724"><span class="lineNum"> 724 </span> : : .type = scenario_delay</a>
+<a name="725"><span class="lineNum"> 725 </span> : : },</a>
+<a name="726"><span class="lineNum"> 726 </span> : : {</a>
+<a name="727"><span class="lineNum"> 727 </span> : : .type = scenario_sel,</a>
+<a name="728"><span class="lineNum"> 728 </span> : : .s = {</a>
+<a name="729"><span class="lineNum"> 729 </span> : : .bmc_state = (HIOMAP_E_DAEMON_READY</a>
+<a name="730"><span class="lineNum"> 730 </span> : : | HIOMAP_E_FLASH_LOST),</a>
+<a name="731"><span class="lineNum"> 731 </span> : : }</a>
+<a name="732"><span class="lineNum"> 732 </span> : : },</a>
+<a name="733"><span class="lineNum"> 733 </span> : : {</a>
+<a name="734"><span class="lineNum"> 734 </span> : : .type = scenario_sel,</a>
+<a name="735"><span class="lineNum"> 735 </span> : : .s = {</a>
+<a name="736"><span class="lineNum"> 736 </span> : : .bmc_state = (HIOMAP_E_DAEMON_READY</a>
+<a name="737"><span class="lineNum"> 737 </span> : : | HIOMAP_E_WINDOW_RESET),</a>
+<a name="738"><span class="lineNum"> 738 </span> : : }</a>
+<a name="739"><span class="lineNum"> 739 </span> : : },</a>
+<a name="740"><span class="lineNum"> 740 </span> : : {</a>
+<a name="741"><span class="lineNum"> 741 </span> : : .type = scenario_cmd,</a>
+<a name="742"><span class="lineNum"> 742 </span> : : .c = {</a>
+<a name="743"><span class="lineNum"> 743 </span> : : .req = {</a>
+<a name="744"><span class="lineNum"> 744 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="745"><span class="lineNum"> 745 </span> : : .seq = 5,</a>
+<a name="746"><span class="lineNum"> 746 </span> : : .args = { [0] = HIOMAP_E_WINDOW_RESET },</a>
+<a name="747"><span class="lineNum"> 747 </span> : : },</a>
+<a name="748"><span class="lineNum"> 748 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="749"><span class="lineNum"> 749 </span> : : .resp = {</a>
+<a name="750"><span class="lineNum"> 750 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="751"><span class="lineNum"> 751 </span> : : .seq = 5,</a>
+<a name="752"><span class="lineNum"> 752 </span> : : }</a>
+<a name="753"><span class="lineNum"> 753 </span> : : }</a>
+<a name="754"><span class="lineNum"> 754 </span> : : },</a>
+<a name="755"><span class="lineNum"> 755 </span> : : {</a>
+<a name="756"><span class="lineNum"> 756 </span> : : .type = scenario_cmd,</a>
+<a name="757"><span class="lineNum"> 757 </span> : : .c = {</a>
+<a name="758"><span class="lineNum"> 758 </span> : : .req = {</a>
+<a name="759"><span class="lineNum"> 759 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="760"><span class="lineNum"> 760 </span> : : .seq = 6,</a>
+<a name="761"><span class="lineNum"> 761 </span> : : .args = {</a>
+<a name="762"><span class="lineNum"> 762 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="763"><span class="lineNum"> 763 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="764"><span class="lineNum"> 764 </span> : : },</a>
+<a name="765"><span class="lineNum"> 765 </span> : : },</a>
+<a name="766"><span class="lineNum"> 766 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="767"><span class="lineNum"> 767 </span> : : .resp = {</a>
+<a name="768"><span class="lineNum"> 768 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="769"><span class="lineNum"> 769 </span> : : .seq = 6,</a>
+<a name="770"><span class="lineNum"> 770 </span> : : .args = {</a>
+<a name="771"><span class="lineNum"> 771 </span> : : [0] = 0xfe, [1] = 0x0f,</a>
+<a name="772"><span class="lineNum"> 772 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="773"><span class="lineNum"> 773 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="774"><span class="lineNum"> 774 </span> : : },</a>
+<a name="775"><span class="lineNum"> 775 </span> : : },</a>
+<a name="776"><span class="lineNum"> 776 </span> : : },</a>
+<a name="777"><span class="lineNum"> 777 </span> : : },</a>
+<a name="778"><span class="lineNum"> 778 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_7, },</a>
+<a name="779"><span class="lineNum"> 779 </span> : : SCENARIO_SENTINEL,</a>
+<a name="780"><span class="lineNum"> 780 </span> : : };</a>
+<a name="781"><span class="lineNum"> 781 </span> : : </a>
+<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 1 : static void test_hiomap_event_daemon_regained_flash_control_dirty(void)</span></a>
+<a name="783"><span class="lineNum"> 783 </span> : : {</a>
+<a name="784"><span class="lineNum"> 784 </span> : : struct blocklevel_device *bl;</a>
+<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 1 : size_t len = 2 * (1 &lt;&lt; 12);</span></a>
+<a name="786"><span class="lineNum"> 786 </span> : : void *buf;</a>
+<a name="787"><span class="lineNum"> 787 </span> : : </a>
+<a name="788"><span class="lineNum"> 788 </span> :<span class="lineCov"> 1 : buf = malloc(len);</span></a>
+<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="790"><span class="lineNum"> 790 </span> : : </a>
+<a name="791"><span class="lineNum"> 791 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_event_daemon_regained_flash_control_dirty);</span></a>
+<a name="792"><span class="lineNum"> 792 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="793"><span class="lineNum"> 793 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="794"><span class="lineNum"> 794 </span> :<span class="lineCov"> 1 : scenario_advance();</span></a>
+<a name="795"><span class="lineNum"> 795 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="796"><span class="lineNum"> 796 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="797"><span class="lineNum"> 797 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="798"><span class="lineNum"> 798 </span> : : </a>
+<a name="799"><span class="lineNum"> 799 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="800"><span class="lineNum"> 800 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="801"><span class="lineNum"> 801 </span> : : </a>
+<a name="802"><span class="lineNum"> 802 </span> : : static const struct scenario_event scenario_hiomap_protocol_reset_recovery[] = {</a>
+<a name="803"><span class="lineNum"> 803 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="804"><span class="lineNum"> 804 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="805"><span class="lineNum"> 805 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="806"><span class="lineNum"> 806 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_DAEMON_READY } },</a>
+<a name="807"><span class="lineNum"> 807 </span> : : {</a>
+<a name="808"><span class="lineNum"> 808 </span> : : .type = scenario_cmd,</a>
+<a name="809"><span class="lineNum"> 809 </span> : : .c = {</a>
+<a name="810"><span class="lineNum"> 810 </span> : : .req = {</a>
+<a name="811"><span class="lineNum"> 811 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="812"><span class="lineNum"> 812 </span> : : .seq = 4,</a>
+<a name="813"><span class="lineNum"> 813 </span> : : .args = {</a>
+<a name="814"><span class="lineNum"> 814 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="815"><span class="lineNum"> 815 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="816"><span class="lineNum"> 816 </span> : : },</a>
+<a name="817"><span class="lineNum"> 817 </span> : : },</a>
+<a name="818"><span class="lineNum"> 818 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="819"><span class="lineNum"> 819 </span> : : .resp = {</a>
+<a name="820"><span class="lineNum"> 820 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="821"><span class="lineNum"> 821 </span> : : .seq = 4,</a>
+<a name="822"><span class="lineNum"> 822 </span> : : .args = {</a>
+<a name="823"><span class="lineNum"> 823 </span> : : [0] = 0xfe, [1] = 0x0f,</a>
+<a name="824"><span class="lineNum"> 824 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="825"><span class="lineNum"> 825 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="826"><span class="lineNum"> 826 </span> : : },</a>
+<a name="827"><span class="lineNum"> 827 </span> : : },</a>
+<a name="828"><span class="lineNum"> 828 </span> : : },</a>
+<a name="829"><span class="lineNum"> 829 </span> : : },</a>
+<a name="830"><span class="lineNum"> 830 </span> : : {</a>
+<a name="831"><span class="lineNum"> 831 </span> : : .type = scenario_delay</a>
+<a name="832"><span class="lineNum"> 832 </span> : : },</a>
+<a name="833"><span class="lineNum"> 833 </span> : : {</a>
+<a name="834"><span class="lineNum"> 834 </span> : : .type = scenario_sel,</a>
+<a name="835"><span class="lineNum"> 835 </span> : : .s = { .bmc_state = HIOMAP_E_PROTOCOL_RESET, }</a>
+<a name="836"><span class="lineNum"> 836 </span> : : },</a>
+<a name="837"><span class="lineNum"> 837 </span> : : {</a>
+<a name="838"><span class="lineNum"> 838 </span> : : .type = scenario_sel,</a>
+<a name="839"><span class="lineNum"> 839 </span> : : .s = { .bmc_state = HIOMAP_E_DAEMON_READY, }</a>
+<a name="840"><span class="lineNum"> 840 </span> : : },</a>
+<a name="841"><span class="lineNum"> 841 </span> : : {</a>
+<a name="842"><span class="lineNum"> 842 </span> : : .type = scenario_cmd,</a>
+<a name="843"><span class="lineNum"> 843 </span> : : .c = {</a>
+<a name="844"><span class="lineNum"> 844 </span> : : .req = {</a>
+<a name="845"><span class="lineNum"> 845 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="846"><span class="lineNum"> 846 </span> : : .seq = 5,</a>
+<a name="847"><span class="lineNum"> 847 </span> : : .args = { [0] = HIOMAP_E_PROTOCOL_RESET },</a>
+<a name="848"><span class="lineNum"> 848 </span> : : },</a>
+<a name="849"><span class="lineNum"> 849 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="850"><span class="lineNum"> 850 </span> : : .resp = {</a>
+<a name="851"><span class="lineNum"> 851 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="852"><span class="lineNum"> 852 </span> : : .seq = 5,</a>
+<a name="853"><span class="lineNum"> 853 </span> : : }</a>
+<a name="854"><span class="lineNum"> 854 </span> : : }</a>
+<a name="855"><span class="lineNum"> 855 </span> : : },</a>
+<a name="856"><span class="lineNum"> 856 </span> : : {</a>
+<a name="857"><span class="lineNum"> 857 </span> : : .type = scenario_cmd,</a>
+<a name="858"><span class="lineNum"> 858 </span> : : .c = {</a>
+<a name="859"><span class="lineNum"> 859 </span> : : .req = {</a>
+<a name="860"><span class="lineNum"> 860 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="861"><span class="lineNum"> 861 </span> : : .seq = 6,</a>
+<a name="862"><span class="lineNum"> 862 </span> : : .args = {</a>
+<a name="863"><span class="lineNum"> 863 </span> : : [0] = HIOMAP_V2,</a>
+<a name="864"><span class="lineNum"> 864 </span> : : },</a>
+<a name="865"><span class="lineNum"> 865 </span> : : },</a>
+<a name="866"><span class="lineNum"> 866 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="867"><span class="lineNum"> 867 </span> : : .resp = {</a>
+<a name="868"><span class="lineNum"> 868 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="869"><span class="lineNum"> 869 </span> : : .seq = 6,</a>
+<a name="870"><span class="lineNum"> 870 </span> : : .args = {</a>
+<a name="871"><span class="lineNum"> 871 </span> : : [0] = HIOMAP_V2,</a>
+<a name="872"><span class="lineNum"> 872 </span> : : [1] = 12,</a>
+<a name="873"><span class="lineNum"> 873 </span> : : [2] = 8, [3] = 0,</a>
+<a name="874"><span class="lineNum"> 874 </span> : : },</a>
+<a name="875"><span class="lineNum"> 875 </span> : : },</a>
+<a name="876"><span class="lineNum"> 876 </span> : : },</a>
+<a name="877"><span class="lineNum"> 877 </span> : : },</a>
+<a name="878"><span class="lineNum"> 878 </span> : : {</a>
+<a name="879"><span class="lineNum"> 879 </span> : : .type = scenario_cmd,</a>
+<a name="880"><span class="lineNum"> 880 </span> : : .c = {</a>
+<a name="881"><span class="lineNum"> 881 </span> : : .req = {</a>
+<a name="882"><span class="lineNum"> 882 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="883"><span class="lineNum"> 883 </span> : : .seq = 7,</a>
+<a name="884"><span class="lineNum"> 884 </span> : : .args = {</a>
+<a name="885"><span class="lineNum"> 885 </span> : : },</a>
+<a name="886"><span class="lineNum"> 886 </span> : : },</a>
+<a name="887"><span class="lineNum"> 887 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="888"><span class="lineNum"> 888 </span> : : .resp = {</a>
+<a name="889"><span class="lineNum"> 889 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="890"><span class="lineNum"> 890 </span> : : .seq = 7,</a>
+<a name="891"><span class="lineNum"> 891 </span> : : .args = {</a>
+<a name="892"><span class="lineNum"> 892 </span> : : [0] = 0x00, [1] = 0x20,</a>
+<a name="893"><span class="lineNum"> 893 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="894"><span class="lineNum"> 894 </span> : : },</a>
+<a name="895"><span class="lineNum"> 895 </span> : : },</a>
+<a name="896"><span class="lineNum"> 896 </span> : : },</a>
+<a name="897"><span class="lineNum"> 897 </span> : : },</a>
+<a name="898"><span class="lineNum"> 898 </span> : : {</a>
+<a name="899"><span class="lineNum"> 899 </span> : : .type = scenario_cmd,</a>
+<a name="900"><span class="lineNum"> 900 </span> : : .c = {</a>
+<a name="901"><span class="lineNum"> 901 </span> : : .req = {</a>
+<a name="902"><span class="lineNum"> 902 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="903"><span class="lineNum"> 903 </span> : : .seq = 8,</a>
+<a name="904"><span class="lineNum"> 904 </span> : : .args = {</a>
+<a name="905"><span class="lineNum"> 905 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="906"><span class="lineNum"> 906 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="907"><span class="lineNum"> 907 </span> : : },</a>
+<a name="908"><span class="lineNum"> 908 </span> : : },</a>
+<a name="909"><span class="lineNum"> 909 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="910"><span class="lineNum"> 910 </span> : : .resp = {</a>
+<a name="911"><span class="lineNum"> 911 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="912"><span class="lineNum"> 912 </span> : : .seq = 8,</a>
+<a name="913"><span class="lineNum"> 913 </span> : : .args = {</a>
+<a name="914"><span class="lineNum"> 914 </span> : : [0] = 0xfe, [1] = 0x0f,</a>
+<a name="915"><span class="lineNum"> 915 </span> : : [2] = 0x02, [3] = 0x00,</a>
+<a name="916"><span class="lineNum"> 916 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="917"><span class="lineNum"> 917 </span> : : },</a>
+<a name="918"><span class="lineNum"> 918 </span> : : },</a>
+<a name="919"><span class="lineNum"> 919 </span> : : },</a>
+<a name="920"><span class="lineNum"> 920 </span> : : },</a>
+<a name="921"><span class="lineNum"> 921 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_9, },</a>
+<a name="922"><span class="lineNum"> 922 </span> : : SCENARIO_SENTINEL,</a>
+<a name="923"><span class="lineNum"> 923 </span> : : };</a>
+<a name="924"><span class="lineNum"> 924 </span> : : </a>
+<a name="925"><span class="lineNum"> 925 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_reset_recovery(void)</span></a>
+<a name="926"><span class="lineNum"> 926 </span> : : {</a>
+<a name="927"><span class="lineNum"> 927 </span> : : struct blocklevel_device *bl;</a>
+<a name="928"><span class="lineNum"> 928 </span> :<span class="lineCov"> 1 : size_t len = 2 * (1 &lt;&lt; 12);</span></a>
+<a name="929"><span class="lineNum"> 929 </span> : : void *buf;</a>
+<a name="930"><span class="lineNum"> 930 </span> : : </a>
+<a name="931"><span class="lineNum"> 931 </span> :<span class="lineCov"> 1 : buf = malloc(len);</span></a>
+<a name="932"><span class="lineNum"> 932 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="933"><span class="lineNum"> 933 </span> : : </a>
+<a name="934"><span class="lineNum"> 934 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_reset_recovery);</span></a>
+<a name="935"><span class="lineNum"> 935 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="936"><span class="lineNum"> 936 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="937"><span class="lineNum"> 937 </span> :<span class="lineCov"> 1 : scenario_advance();</span></a>
+<a name="938"><span class="lineNum"> 938 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="939"><span class="lineNum"> 939 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="940"><span class="lineNum"> 940 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="941"><span class="lineNum"> 941 </span> : : </a>
+<a name="942"><span class="lineNum"> 942 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="943"><span class="lineNum"> 943 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="944"><span class="lineNum"> 944 </span> : : </a>
+<a name="945"><span class="lineNum"> 945 </span> : : static const struct scenario_event</a>
+<a name="946"><span class="lineNum"> 946 </span> : : scenario_hiomap_protocol_read_one_block[] = {</a>
+<a name="947"><span class="lineNum"> 947 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="948"><span class="lineNum"> 948 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="949"><span class="lineNum"> 949 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="950"><span class="lineNum"> 950 </span> : : {</a>
+<a name="951"><span class="lineNum"> 951 </span> : : .type = scenario_event_p,</a>
+<a name="952"><span class="lineNum"> 952 </span> : : .p = &amp;hiomap_create_read_window_qs0l1_rs0l1_call,</a>
+<a name="953"><span class="lineNum"> 953 </span> : : },</a>
+<a name="954"><span class="lineNum"> 954 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="955"><span class="lineNum"> 955 </span> : : SCENARIO_SENTINEL,</a>
+<a name="956"><span class="lineNum"> 956 </span> : : };</a>
+<a name="957"><span class="lineNum"> 957 </span> : : </a>
+<a name="958"><span class="lineNum"> 958 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_read_one_block(void)</span></a>
+<a name="959"><span class="lineNum"> 959 </span> : : {</a>
+<a name="960"><span class="lineNum"> 960 </span> : : struct blocklevel_device *bl;</a>
+<a name="961"><span class="lineNum"> 961 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="962"><span class="lineNum"> 962 </span> : : uint8_t *buf;</a>
+<a name="963"><span class="lineNum"> 963 </span> : : size_t len;</a>
+<a name="964"><span class="lineNum"> 964 </span> : : </a>
+<a name="965"><span class="lineNum"> 965 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_read_one_block);</span></a>
+<a name="966"><span class="lineNum"> 966 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="967"><span class="lineNum"> 967 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="968"><span class="lineNum"> 968 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="969"><span class="lineNum"> 969 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="970"><span class="lineNum"> 970 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="971"><span class="lineNum"> 971 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="972"><span class="lineNum"> 972 </span> :<span class="lineCov"> 1 : assert(lpc_read_success(buf, len));</span></a>
+<a name="973"><span class="lineNum"> 973 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="975"><span class="lineNum"> 975 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="976"><span class="lineNum"> 976 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="977"><span class="lineNum"> 977 </span> : : </a>
+<a name="978"><span class="lineNum"> 978 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_read_one_byte(void)</span></a>
+<a name="979"><span class="lineNum"> 979 </span> : : {</a>
+<a name="980"><span class="lineNum"> 980 </span> : : struct blocklevel_device *bl;</a>
+<a name="981"><span class="lineNum"> 981 </span> : : uint8_t *buf;</a>
+<a name="982"><span class="lineNum"> 982 </span> : : size_t len;</a>
+<a name="983"><span class="lineNum"> 983 </span> : : </a>
+<a name="984"><span class="lineNum"> 984 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_read_one_block);</span></a>
+<a name="985"><span class="lineNum"> 985 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="986"><span class="lineNum"> 986 </span> :<span class="lineCov"> 1 : len = 1;</span></a>
+<a name="987"><span class="lineNum"> 987 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="988"><span class="lineNum"> 988 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="989"><span class="lineNum"> 989 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="990"><span class="lineNum"> 990 </span> :<span class="lineCov"> 1 : assert(lpc_read_success(buf, len));</span></a>
+<a name="991"><span class="lineNum"> 991 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="992"><span class="lineNum"> 992 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="993"><span class="lineNum"> 993 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="994"><span class="lineNum"> 994 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="995"><span class="lineNum"> 995 </span> : : </a>
+<a name="996"><span class="lineNum"> 996 </span> : : static const struct scenario_event</a>
+<a name="997"><span class="lineNum"> 997 </span> : : scenario_hiomap_protocol_read_two_blocks[] = {</a>
+<a name="998"><span class="lineNum"> 998 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="999"><span class="lineNum"> 999 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1000"><span class="lineNum"> 1000 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1001"><span class="lineNum"> 1001 </span> : : {</a>
+<a name="1002"><span class="lineNum"> 1002 </span> : : .type = scenario_event_p,</a>
+<a name="1003"><span class="lineNum"> 1003 </span> : : .p = &amp;hiomap_create_read_window_qs0l2_rs0l1_call,</a>
+<a name="1004"><span class="lineNum"> 1004 </span> : : },</a>
+<a name="1005"><span class="lineNum"> 1005 </span> : : {</a>
+<a name="1006"><span class="lineNum"> 1006 </span> : : .type = scenario_cmd,</a>
+<a name="1007"><span class="lineNum"> 1007 </span> : : .c = {</a>
+<a name="1008"><span class="lineNum"> 1008 </span> : : .req = {</a>
+<a name="1009"><span class="lineNum"> 1009 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="1010"><span class="lineNum"> 1010 </span> : : .seq = 5,</a>
+<a name="1011"><span class="lineNum"> 1011 </span> : : .args = {</a>
+<a name="1012"><span class="lineNum"> 1012 </span> : : [0] = 0x01, [1] = 0x00,</a>
+<a name="1013"><span class="lineNum"> 1013 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1014"><span class="lineNum"> 1014 </span> : : },</a>
+<a name="1015"><span class="lineNum"> 1015 </span> : : },</a>
+<a name="1016"><span class="lineNum"> 1016 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="1017"><span class="lineNum"> 1017 </span> : : .resp = {</a>
+<a name="1018"><span class="lineNum"> 1018 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="1019"><span class="lineNum"> 1019 </span> : : .seq = 5,</a>
+<a name="1020"><span class="lineNum"> 1020 </span> : : .args = {</a>
+<a name="1021"><span class="lineNum"> 1021 </span> : : [0] = 0xfe, [1] = 0x0f,</a>
+<a name="1022"><span class="lineNum"> 1022 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1023"><span class="lineNum"> 1023 </span> : : [4] = 0x01, [5] = 0x00,</a>
+<a name="1024"><span class="lineNum"> 1024 </span> : : },</a>
+<a name="1025"><span class="lineNum"> 1025 </span> : : },</a>
+<a name="1026"><span class="lineNum"> 1026 </span> : : },</a>
+<a name="1027"><span class="lineNum"> 1027 </span> : : },</a>
+<a name="1028"><span class="lineNum"> 1028 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="1029"><span class="lineNum"> 1029 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1030"><span class="lineNum"> 1030 </span> : : };</a>
+<a name="1031"><span class="lineNum"> 1031 </span> : : </a>
+<a name="1032"><span class="lineNum"> 1032 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_read_two_blocks(void)</span></a>
+<a name="1033"><span class="lineNum"> 1033 </span> : : {</a>
+<a name="1034"><span class="lineNum"> 1034 </span> : : struct blocklevel_device *bl;</a>
+<a name="1035"><span class="lineNum"> 1035 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1036"><span class="lineNum"> 1036 </span> : : uint8_t *buf;</a>
+<a name="1037"><span class="lineNum"> 1037 </span> : : size_t len;</a>
+<a name="1038"><span class="lineNum"> 1038 </span> : : </a>
+<a name="1039"><span class="lineNum"> 1039 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_read_two_blocks);</span></a>
+<a name="1040"><span class="lineNum"> 1040 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1041"><span class="lineNum"> 1041 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1042"><span class="lineNum"> 1042 </span> :<span class="lineCov"> 1 : len = 2 * (1 &lt;&lt; ctx-&gt;block_size_shift);</span></a>
+<a name="1043"><span class="lineNum"> 1043 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1044"><span class="lineNum"> 1044 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1045"><span class="lineNum"> 1045 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="1046"><span class="lineNum"> 1046 </span> :<span class="lineCov"> 1 : assert(lpc_read_success(buf, len));</span></a>
+<a name="1047"><span class="lineNum"> 1047 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1048"><span class="lineNum"> 1048 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1049"><span class="lineNum"> 1049 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1050"><span class="lineNum"> 1050 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1051"><span class="lineNum"> 1051 </span> : : </a>
+<a name="1052"><span class="lineNum"> 1052 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_read_1block_1byte(void)</span></a>
+<a name="1053"><span class="lineNum"> 1053 </span> : : {</a>
+<a name="1054"><span class="lineNum"> 1054 </span> : : struct blocklevel_device *bl;</a>
+<a name="1055"><span class="lineNum"> 1055 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1056"><span class="lineNum"> 1056 </span> : : uint8_t *buf;</a>
+<a name="1057"><span class="lineNum"> 1057 </span> : : size_t len;</a>
+<a name="1058"><span class="lineNum"> 1058 </span> : : </a>
+<a name="1059"><span class="lineNum"> 1059 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_read_two_blocks);</span></a>
+<a name="1060"><span class="lineNum"> 1060 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1061"><span class="lineNum"> 1061 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1062"><span class="lineNum"> 1062 </span> :<span class="lineCov"> 1 : len = (1 &lt;&lt; ctx-&gt;block_size_shift) + 1;</span></a>
+<a name="1063"><span class="lineNum"> 1063 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1064"><span class="lineNum"> 1064 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1065"><span class="lineNum"> 1065 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="1066"><span class="lineNum"> 1066 </span> :<span class="lineCov"> 1 : assert(lpc_read_success(buf, len));</span></a>
+<a name="1067"><span class="lineNum"> 1067 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1068"><span class="lineNum"> 1068 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1069"><span class="lineNum"> 1069 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1070"><span class="lineNum"> 1070 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1071"><span class="lineNum"> 1071 </span> : : </a>
+<a name="1072"><span class="lineNum"> 1072 </span> : : static const struct scenario_event</a>
+<a name="1073"><span class="lineNum"> 1073 </span> : : scenario_hiomap_protocol_read_one_block_twice[] = {</a>
+<a name="1074"><span class="lineNum"> 1074 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1075"><span class="lineNum"> 1075 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1076"><span class="lineNum"> 1076 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1077"><span class="lineNum"> 1077 </span> : : {</a>
+<a name="1078"><span class="lineNum"> 1078 </span> : : .type = scenario_event_p,</a>
+<a name="1079"><span class="lineNum"> 1079 </span> : : .p = &amp;hiomap_create_read_window_qs0l1_rs0l1_call,</a>
+<a name="1080"><span class="lineNum"> 1080 </span> : : },</a>
+<a name="1081"><span class="lineNum"> 1081 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="1082"><span class="lineNum"> 1082 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1083"><span class="lineNum"> 1083 </span> : : };</a>
+<a name="1084"><span class="lineNum"> 1084 </span> : : </a>
+<a name="1085"><span class="lineNum"> 1085 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_read_one_block_twice(void)</span></a>
+<a name="1086"><span class="lineNum"> 1086 </span> : : {</a>
+<a name="1087"><span class="lineNum"> 1087 </span> : : struct blocklevel_device *bl;</a>
+<a name="1088"><span class="lineNum"> 1088 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1089"><span class="lineNum"> 1089 </span> : : uint8_t *buf;</a>
+<a name="1090"><span class="lineNum"> 1090 </span> : : size_t len;</a>
+<a name="1091"><span class="lineNum"> 1091 </span> : : </a>
+<a name="1092"><span class="lineNum"> 1092 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_read_one_block_twice);</span></a>
+<a name="1093"><span class="lineNum"> 1093 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1094"><span class="lineNum"> 1094 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1095"><span class="lineNum"> 1095 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1096"><span class="lineNum"> 1096 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1097"><span class="lineNum"> 1097 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1098"><span class="lineNum"> 1098 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="1099"><span class="lineNum"> 1099 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;read(bl, 0, buf, len));</span></a>
+<a name="1100"><span class="lineNum"> 1100 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1101"><span class="lineNum"> 1101 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1102"><span class="lineNum"> 1102 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1103"><span class="lineNum"> 1103 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1104"><span class="lineNum"> 1104 </span> : : </a>
+<a name="1105"><span class="lineNum"> 1105 </span> : : static const struct scenario_event</a>
+<a name="1106"><span class="lineNum"> 1106 </span> : : scenario_hiomap_protocol_event_before_action[] = {</a>
+<a name="1107"><span class="lineNum"> 1107 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1108"><span class="lineNum"> 1108 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1109"><span class="lineNum"> 1109 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1110"><span class="lineNum"> 1110 </span> : : {</a>
+<a name="1111"><span class="lineNum"> 1111 </span> : : .type = scenario_sel,</a>
+<a name="1112"><span class="lineNum"> 1112 </span> : : .s = {</a>
+<a name="1113"><span class="lineNum"> 1113 </span> : : .bmc_state = HIOMAP_E_DAEMON_READY |</a>
+<a name="1114"><span class="lineNum"> 1114 </span> : : HIOMAP_E_FLASH_LOST,</a>
+<a name="1115"><span class="lineNum"> 1115 </span> : : }</a>
+<a name="1116"><span class="lineNum"> 1116 </span> : : },</a>
+<a name="1117"><span class="lineNum"> 1117 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="1118"><span class="lineNum"> 1118 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1119"><span class="lineNum"> 1119 </span> : : };</a>
+<a name="1120"><span class="lineNum"> 1120 </span> : : </a>
+<a name="1121"><span class="lineNum"> 1121 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_event_before_read(void)</span></a>
+<a name="1122"><span class="lineNum"> 1122 </span> : : {</a>
+<a name="1123"><span class="lineNum"> 1123 </span> : : struct blocklevel_device *bl;</a>
+<a name="1124"><span class="lineNum"> 1124 </span> : : char buf;</a>
+<a name="1125"><span class="lineNum"> 1125 </span> : : int rc;</a>
+<a name="1126"><span class="lineNum"> 1126 </span> : : </a>
+<a name="1127"><span class="lineNum"> 1127 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_event_before_action);</span></a>
+<a name="1128"><span class="lineNum"> 1128 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1129"><span class="lineNum"> 1129 </span> :<span class="lineCov"> 1 : rc = bl-&gt;read(bl, 0, &amp;buf, sizeof(buf));</span></a>
+<a name="1130"><span class="lineNum"> 1130 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_AGAIN);</span></a>
+<a name="1131"><span class="lineNum"> 1131 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1132"><span class="lineNum"> 1132 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1133"><span class="lineNum"> 1133 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1134"><span class="lineNum"> 1134 </span> : : </a>
+<a name="1135"><span class="lineNum"> 1135 </span> : : static const struct scenario_event</a>
+<a name="1136"><span class="lineNum"> 1136 </span> : : scenario_hiomap_protocol_event_during_read[] = {</a>
+<a name="1137"><span class="lineNum"> 1137 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1138"><span class="lineNum"> 1138 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1139"><span class="lineNum"> 1139 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1140"><span class="lineNum"> 1140 </span> : : {</a>
+<a name="1141"><span class="lineNum"> 1141 </span> : : .type = scenario_event_p,</a>
+<a name="1142"><span class="lineNum"> 1142 </span> : : .p = &amp;hiomap_create_read_window_qs0l1_rs0l1_call,</a>
+<a name="1143"><span class="lineNum"> 1143 </span> : : },</a>
+<a name="1144"><span class="lineNum"> 1144 </span> : : {</a>
+<a name="1145"><span class="lineNum"> 1145 </span> : : .type = scenario_sel,</a>
+<a name="1146"><span class="lineNum"> 1146 </span> : : .s = {</a>
+<a name="1147"><span class="lineNum"> 1147 </span> : : .bmc_state = HIOMAP_E_DAEMON_READY |</a>
+<a name="1148"><span class="lineNum"> 1148 </span> : : HIOMAP_E_FLASH_LOST,</a>
+<a name="1149"><span class="lineNum"> 1149 </span> : : }</a>
+<a name="1150"><span class="lineNum"> 1150 </span> : : },</a>
+<a name="1151"><span class="lineNum"> 1151 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="1152"><span class="lineNum"> 1152 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1153"><span class="lineNum"> 1153 </span> : : };</a>
+<a name="1154"><span class="lineNum"> 1154 </span> : : </a>
+<a name="1155"><span class="lineNum"> 1155 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_event_during_read(void)</span></a>
+<a name="1156"><span class="lineNum"> 1156 </span> : : {</a>
+<a name="1157"><span class="lineNum"> 1157 </span> : : struct blocklevel_device *bl;</a>
+<a name="1158"><span class="lineNum"> 1158 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1159"><span class="lineNum"> 1159 </span> : : uint8_t *buf;</a>
+<a name="1160"><span class="lineNum"> 1160 </span> : : size_t len;</a>
+<a name="1161"><span class="lineNum"> 1161 </span> : : int rc;</a>
+<a name="1162"><span class="lineNum"> 1162 </span> : : </a>
+<a name="1163"><span class="lineNum"> 1163 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_event_during_read);</span></a>
+<a name="1164"><span class="lineNum"> 1164 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1165"><span class="lineNum"> 1165 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1166"><span class="lineNum"> 1166 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1167"><span class="lineNum"> 1167 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1168"><span class="lineNum"> 1168 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1169"><span class="lineNum"> 1169 </span> :<span class="lineCov"> 1 : rc = bl-&gt;read(bl, 0, buf, len);</span></a>
+<a name="1170"><span class="lineNum"> 1170 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_AGAIN);</span></a>
+<a name="1171"><span class="lineNum"> 1171 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1172"><span class="lineNum"> 1172 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1173"><span class="lineNum"> 1173 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1174"><span class="lineNum"> 1174 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1175"><span class="lineNum"> 1175 </span> : : </a>
+<a name="1176"><span class="lineNum"> 1176 </span> : : static const struct scenario_event</a>
+<a name="1177"><span class="lineNum"> 1177 </span> : : scenario_hiomap_protocol_write_one_block[] = {</a>
+<a name="1178"><span class="lineNum"> 1178 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1179"><span class="lineNum"> 1179 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1180"><span class="lineNum"> 1180 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1181"><span class="lineNum"> 1181 </span> : : {</a>
+<a name="1182"><span class="lineNum"> 1182 </span> : : .type = scenario_event_p,</a>
+<a name="1183"><span class="lineNum"> 1183 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1184"><span class="lineNum"> 1184 </span> : : },</a>
+<a name="1185"><span class="lineNum"> 1185 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_mark_dirty_qs0l1_call, },</a>
+<a name="1186"><span class="lineNum"> 1186 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="1187"><span class="lineNum"> 1187 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_7, },</a>
+<a name="1188"><span class="lineNum"> 1188 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1189"><span class="lineNum"> 1189 </span> : : };</a>
+<a name="1190"><span class="lineNum"> 1190 </span> : : </a>
+<a name="1191"><span class="lineNum"> 1191 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_write_one_block(void)</span></a>
+<a name="1192"><span class="lineNum"> 1192 </span> : : {</a>
+<a name="1193"><span class="lineNum"> 1193 </span> : : struct blocklevel_device *bl;</a>
+<a name="1194"><span class="lineNum"> 1194 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1195"><span class="lineNum"> 1195 </span> : : uint8_t *buf;</a>
+<a name="1196"><span class="lineNum"> 1196 </span> : : size_t len;</a>
+<a name="1197"><span class="lineNum"> 1197 </span> : : </a>
+<a name="1198"><span class="lineNum"> 1198 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_write_one_block);</span></a>
+<a name="1199"><span class="lineNum"> 1199 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1200"><span class="lineNum"> 1200 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1201"><span class="lineNum"> 1201 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1202"><span class="lineNum"> 1202 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1203"><span class="lineNum"> 1203 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1204"><span class="lineNum"> 1204 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;write(bl, 0, buf, len));</span></a>
+<a name="1205"><span class="lineNum"> 1205 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1206"><span class="lineNum"> 1206 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1207"><span class="lineNum"> 1207 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1208"><span class="lineNum"> 1208 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1209"><span class="lineNum"> 1209 </span> : : </a>
+<a name="1210"><span class="lineNum"> 1210 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_write_one_byte(void)</span></a>
+<a name="1211"><span class="lineNum"> 1211 </span> : : {</a>
+<a name="1212"><span class="lineNum"> 1212 </span> : : struct blocklevel_device *bl;</a>
+<a name="1213"><span class="lineNum"> 1213 </span> : : uint8_t *buf;</a>
+<a name="1214"><span class="lineNum"> 1214 </span> : : size_t len;</a>
+<a name="1215"><span class="lineNum"> 1215 </span> : : </a>
+<a name="1216"><span class="lineNum"> 1216 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_write_one_block);</span></a>
+<a name="1217"><span class="lineNum"> 1217 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1218"><span class="lineNum"> 1218 </span> :<span class="lineCov"> 1 : len = 1;</span></a>
+<a name="1219"><span class="lineNum"> 1219 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1220"><span class="lineNum"> 1220 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1221"><span class="lineNum"> 1221 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;write(bl, 0, buf, len));</span></a>
+<a name="1222"><span class="lineNum"> 1222 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1223"><span class="lineNum"> 1223 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1224"><span class="lineNum"> 1224 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1225"><span class="lineNum"> 1225 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1226"><span class="lineNum"> 1226 </span> : : </a>
+<a name="1227"><span class="lineNum"> 1227 </span> : : static const struct scenario_event</a>
+<a name="1228"><span class="lineNum"> 1228 </span> : : scenario_hiomap_protocol_write_two_blocks[] = {</a>
+<a name="1229"><span class="lineNum"> 1229 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1230"><span class="lineNum"> 1230 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1231"><span class="lineNum"> 1231 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1232"><span class="lineNum"> 1232 </span> : : {</a>
+<a name="1233"><span class="lineNum"> 1233 </span> : : .type = scenario_event_p,</a>
+<a name="1234"><span class="lineNum"> 1234 </span> : : .p = &amp;hiomap_create_write_window_qs0l2_rs0l1_call,</a>
+<a name="1235"><span class="lineNum"> 1235 </span> : : },</a>
+<a name="1236"><span class="lineNum"> 1236 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_mark_dirty_qs0l1_call, },</a>
+<a name="1237"><span class="lineNum"> 1237 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="1238"><span class="lineNum"> 1238 </span> : : {</a>
+<a name="1239"><span class="lineNum"> 1239 </span> : : .type = scenario_event_p,</a>
+<a name="1240"><span class="lineNum"> 1240 </span> : : .p = &amp;hiomap_create_write_window_qs1l1_rs1l1_call,</a>
+<a name="1241"><span class="lineNum"> 1241 </span> : : },</a>
+<a name="1242"><span class="lineNum"> 1242 </span> : : {</a>
+<a name="1243"><span class="lineNum"> 1243 </span> : : .type = scenario_cmd,</a>
+<a name="1244"><span class="lineNum"> 1244 </span> : : .c = {</a>
+<a name="1245"><span class="lineNum"> 1245 </span> : : .req = {</a>
+<a name="1246"><span class="lineNum"> 1246 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="1247"><span class="lineNum"> 1247 </span> : : .seq = 8,</a>
+<a name="1248"><span class="lineNum"> 1248 </span> : : .args = {</a>
+<a name="1249"><span class="lineNum"> 1249 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="1250"><span class="lineNum"> 1250 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1251"><span class="lineNum"> 1251 </span> : : },</a>
+<a name="1252"><span class="lineNum"> 1252 </span> : : },</a>
+<a name="1253"><span class="lineNum"> 1253 </span> : : .resp = {</a>
+<a name="1254"><span class="lineNum"> 1254 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="1255"><span class="lineNum"> 1255 </span> : : .seq = 8,</a>
+<a name="1256"><span class="lineNum"> 1256 </span> : : },</a>
+<a name="1257"><span class="lineNum"> 1257 </span> : : },</a>
+<a name="1258"><span class="lineNum"> 1258 </span> : : },</a>
+<a name="1259"><span class="lineNum"> 1259 </span> : : {</a>
+<a name="1260"><span class="lineNum"> 1260 </span> : : .type = scenario_cmd,</a>
+<a name="1261"><span class="lineNum"> 1261 </span> : : .c = {</a>
+<a name="1262"><span class="lineNum"> 1262 </span> : : .req = {</a>
+<a name="1263"><span class="lineNum"> 1263 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1264"><span class="lineNum"> 1264 </span> : : .seq = 9,</a>
+<a name="1265"><span class="lineNum"> 1265 </span> : : },</a>
+<a name="1266"><span class="lineNum"> 1266 </span> : : .resp = {</a>
+<a name="1267"><span class="lineNum"> 1267 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1268"><span class="lineNum"> 1268 </span> : : .seq = 9,</a>
+<a name="1269"><span class="lineNum"> 1269 </span> : : },</a>
+<a name="1270"><span class="lineNum"> 1270 </span> : : },</a>
+<a name="1271"><span class="lineNum"> 1271 </span> : : },</a>
+<a name="1272"><span class="lineNum"> 1272 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_a, },</a>
+<a name="1273"><span class="lineNum"> 1273 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1274"><span class="lineNum"> 1274 </span> : : };</a>
+<a name="1275"><span class="lineNum"> 1275 </span> : : </a>
+<a name="1276"><span class="lineNum"> 1276 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_write_two_blocks(void)</span></a>
+<a name="1277"><span class="lineNum"> 1277 </span> : : {</a>
+<a name="1278"><span class="lineNum"> 1278 </span> : : struct blocklevel_device *bl;</a>
+<a name="1279"><span class="lineNum"> 1279 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1280"><span class="lineNum"> 1280 </span> : : uint8_t *buf;</a>
+<a name="1281"><span class="lineNum"> 1281 </span> : : size_t len;</a>
+<a name="1282"><span class="lineNum"> 1282 </span> : : </a>
+<a name="1283"><span class="lineNum"> 1283 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_write_two_blocks);</span></a>
+<a name="1284"><span class="lineNum"> 1284 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1285"><span class="lineNum"> 1285 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1286"><span class="lineNum"> 1286 </span> :<span class="lineCov"> 1 : len = 2 * (1 &lt;&lt; ctx-&gt;block_size_shift);</span></a>
+<a name="1287"><span class="lineNum"> 1287 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1288"><span class="lineNum"> 1288 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1289"><span class="lineNum"> 1289 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;write(bl, 0, buf, len));</span></a>
+<a name="1290"><span class="lineNum"> 1290 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1291"><span class="lineNum"> 1291 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1292"><span class="lineNum"> 1292 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1293"><span class="lineNum"> 1293 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1294"><span class="lineNum"> 1294 </span> : : </a>
+<a name="1295"><span class="lineNum"> 1295 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_write_1block_1byte(void)</span></a>
+<a name="1296"><span class="lineNum"> 1296 </span> : : {</a>
+<a name="1297"><span class="lineNum"> 1297 </span> : : struct blocklevel_device *bl;</a>
+<a name="1298"><span class="lineNum"> 1298 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1299"><span class="lineNum"> 1299 </span> : : uint8_t *buf;</a>
+<a name="1300"><span class="lineNum"> 1300 </span> : : size_t len;</a>
+<a name="1301"><span class="lineNum"> 1301 </span> : : </a>
+<a name="1302"><span class="lineNum"> 1302 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_write_two_blocks);</span></a>
+<a name="1303"><span class="lineNum"> 1303 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1304"><span class="lineNum"> 1304 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1305"><span class="lineNum"> 1305 </span> :<span class="lineCov"> 1 : len = (1 &lt;&lt; ctx-&gt;block_size_shift) + 1;</span></a>
+<a name="1306"><span class="lineNum"> 1306 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1307"><span class="lineNum"> 1307 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1308"><span class="lineNum"> 1308 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;write(bl, 0, buf, len));</span></a>
+<a name="1309"><span class="lineNum"> 1309 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1310"><span class="lineNum"> 1310 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1311"><span class="lineNum"> 1311 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1312"><span class="lineNum"> 1312 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1313"><span class="lineNum"> 1313 </span> : : </a>
+<a name="1314"><span class="lineNum"> 1314 </span> : : static const struct scenario_event</a>
+<a name="1315"><span class="lineNum"> 1315 </span> : : scenario_hiomap_protocol_write_one_block_twice[] = {</a>
+<a name="1316"><span class="lineNum"> 1316 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1317"><span class="lineNum"> 1317 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1318"><span class="lineNum"> 1318 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1319"><span class="lineNum"> 1319 </span> : : {</a>
+<a name="1320"><span class="lineNum"> 1320 </span> : : .type = scenario_event_p,</a>
+<a name="1321"><span class="lineNum"> 1321 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1322"><span class="lineNum"> 1322 </span> : : },</a>
+<a name="1323"><span class="lineNum"> 1323 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_mark_dirty_qs0l1_call, },</a>
+<a name="1324"><span class="lineNum"> 1324 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="1325"><span class="lineNum"> 1325 </span> : : {</a>
+<a name="1326"><span class="lineNum"> 1326 </span> : : .type = scenario_cmd,</a>
+<a name="1327"><span class="lineNum"> 1327 </span> : : .c = {</a>
+<a name="1328"><span class="lineNum"> 1328 </span> : : .req = {</a>
+<a name="1329"><span class="lineNum"> 1329 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="1330"><span class="lineNum"> 1330 </span> : : .seq = 7,</a>
+<a name="1331"><span class="lineNum"> 1331 </span> : : .args = {</a>
+<a name="1332"><span class="lineNum"> 1332 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="1333"><span class="lineNum"> 1333 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1334"><span class="lineNum"> 1334 </span> : : },</a>
+<a name="1335"><span class="lineNum"> 1335 </span> : : },</a>
+<a name="1336"><span class="lineNum"> 1336 </span> : : .resp = {</a>
+<a name="1337"><span class="lineNum"> 1337 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="1338"><span class="lineNum"> 1338 </span> : : .seq = 7,</a>
+<a name="1339"><span class="lineNum"> 1339 </span> : : },</a>
+<a name="1340"><span class="lineNum"> 1340 </span> : : },</a>
+<a name="1341"><span class="lineNum"> 1341 </span> : : },</a>
+<a name="1342"><span class="lineNum"> 1342 </span> : : {</a>
+<a name="1343"><span class="lineNum"> 1343 </span> : : .type = scenario_cmd,</a>
+<a name="1344"><span class="lineNum"> 1344 </span> : : .c = {</a>
+<a name="1345"><span class="lineNum"> 1345 </span> : : .req = {</a>
+<a name="1346"><span class="lineNum"> 1346 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1347"><span class="lineNum"> 1347 </span> : : .seq = 8,</a>
+<a name="1348"><span class="lineNum"> 1348 </span> : : },</a>
+<a name="1349"><span class="lineNum"> 1349 </span> : : .resp = {</a>
+<a name="1350"><span class="lineNum"> 1350 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1351"><span class="lineNum"> 1351 </span> : : .seq = 8,</a>
+<a name="1352"><span class="lineNum"> 1352 </span> : : },</a>
+<a name="1353"><span class="lineNum"> 1353 </span> : : },</a>
+<a name="1354"><span class="lineNum"> 1354 </span> : : },</a>
+<a name="1355"><span class="lineNum"> 1355 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_9, },</a>
+<a name="1356"><span class="lineNum"> 1356 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1357"><span class="lineNum"> 1357 </span> : : };</a>
+<a name="1358"><span class="lineNum"> 1358 </span> : : </a>
+<a name="1359"><span class="lineNum"> 1359 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_write_one_block_twice(void)</span></a>
+<a name="1360"><span class="lineNum"> 1360 </span> : : {</a>
+<a name="1361"><span class="lineNum"> 1361 </span> : : struct blocklevel_device *bl;</a>
+<a name="1362"><span class="lineNum"> 1362 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1363"><span class="lineNum"> 1363 </span> : : uint8_t *buf;</a>
+<a name="1364"><span class="lineNum"> 1364 </span> : : size_t len;</a>
+<a name="1365"><span class="lineNum"> 1365 </span> : : </a>
+<a name="1366"><span class="lineNum"> 1366 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_write_one_block_twice);</span></a>
+<a name="1367"><span class="lineNum"> 1367 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1368"><span class="lineNum"> 1368 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1369"><span class="lineNum"> 1369 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1370"><span class="lineNum"> 1370 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1371"><span class="lineNum"> 1371 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1372"><span class="lineNum"> 1372 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;write(bl, 0, buf, len));</span></a>
+<a name="1373"><span class="lineNum"> 1373 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;write(bl, 0, buf, len));</span></a>
+<a name="1374"><span class="lineNum"> 1374 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1375"><span class="lineNum"> 1375 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1376"><span class="lineNum"> 1376 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1377"><span class="lineNum"> 1377 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1378"><span class="lineNum"> 1378 </span> : : </a>
+<a name="1379"><span class="lineNum"> 1379 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_event_before_write(void)</span></a>
+<a name="1380"><span class="lineNum"> 1380 </span> : : {</a>
+<a name="1381"><span class="lineNum"> 1381 </span> : : struct blocklevel_device *bl;</a>
+<a name="1382"><span class="lineNum"> 1382 </span> : : char buf;</a>
+<a name="1383"><span class="lineNum"> 1383 </span> : : int rc;</a>
+<a name="1384"><span class="lineNum"> 1384 </span> : : </a>
+<a name="1385"><span class="lineNum"> 1385 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_event_before_action);</span></a>
+<a name="1386"><span class="lineNum"> 1386 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1387"><span class="lineNum"> 1387 </span> :<span class="lineCov"> 1 : rc = bl-&gt;write(bl, 0, &amp;buf, sizeof(buf));</span></a>
+<a name="1388"><span class="lineNum"> 1388 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_AGAIN);</span></a>
+<a name="1389"><span class="lineNum"> 1389 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1390"><span class="lineNum"> 1390 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1391"><span class="lineNum"> 1391 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1392"><span class="lineNum"> 1392 </span> : : </a>
+<a name="1393"><span class="lineNum"> 1393 </span> : : static const struct scenario_event</a>
+<a name="1394"><span class="lineNum"> 1394 </span> : : scenario_hiomap_protocol_event_during_write[] = {</a>
+<a name="1395"><span class="lineNum"> 1395 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1396"><span class="lineNum"> 1396 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1397"><span class="lineNum"> 1397 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1398"><span class="lineNum"> 1398 </span> : : {</a>
+<a name="1399"><span class="lineNum"> 1399 </span> : : .type = scenario_event_p,</a>
+<a name="1400"><span class="lineNum"> 1400 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1401"><span class="lineNum"> 1401 </span> : : },</a>
+<a name="1402"><span class="lineNum"> 1402 </span> : : {</a>
+<a name="1403"><span class="lineNum"> 1403 </span> : : .type = scenario_sel,</a>
+<a name="1404"><span class="lineNum"> 1404 </span> : : .s = {</a>
+<a name="1405"><span class="lineNum"> 1405 </span> : : .bmc_state = HIOMAP_E_DAEMON_READY |</a>
+<a name="1406"><span class="lineNum"> 1406 </span> : : HIOMAP_E_FLASH_LOST,</a>
+<a name="1407"><span class="lineNum"> 1407 </span> : : }</a>
+<a name="1408"><span class="lineNum"> 1408 </span> : : },</a>
+<a name="1409"><span class="lineNum"> 1409 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="1410"><span class="lineNum"> 1410 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1411"><span class="lineNum"> 1411 </span> : : };</a>
+<a name="1412"><span class="lineNum"> 1412 </span> : : </a>
+<a name="1413"><span class="lineNum"> 1413 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_event_during_write(void)</span></a>
+<a name="1414"><span class="lineNum"> 1414 </span> : : {</a>
+<a name="1415"><span class="lineNum"> 1415 </span> : : struct blocklevel_device *bl;</a>
+<a name="1416"><span class="lineNum"> 1416 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1417"><span class="lineNum"> 1417 </span> : : size_t len;</a>
+<a name="1418"><span class="lineNum"> 1418 </span> : : char *buf;</a>
+<a name="1419"><span class="lineNum"> 1419 </span> : : int rc;</a>
+<a name="1420"><span class="lineNum"> 1420 </span> : : </a>
+<a name="1421"><span class="lineNum"> 1421 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_event_during_write);</span></a>
+<a name="1422"><span class="lineNum"> 1422 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1423"><span class="lineNum"> 1423 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1424"><span class="lineNum"> 1424 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1425"><span class="lineNum"> 1425 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1426"><span class="lineNum"> 1426 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1427"><span class="lineNum"> 1427 </span> :<span class="lineCov"> 1 : rc = bl-&gt;write(bl, 0, buf, len);</span></a>
+<a name="1428"><span class="lineNum"> 1428 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1429"><span class="lineNum"> 1429 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_AGAIN);</span></a>
+<a name="1430"><span class="lineNum"> 1430 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1431"><span class="lineNum"> 1431 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1432"><span class="lineNum"> 1432 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1433"><span class="lineNum"> 1433 </span> : : </a>
+<a name="1434"><span class="lineNum"> 1434 </span> : : static const struct scenario_event</a>
+<a name="1435"><span class="lineNum"> 1435 </span> : : scenario_hiomap_protocol_erase_one_block[] = {</a>
+<a name="1436"><span class="lineNum"> 1436 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1437"><span class="lineNum"> 1437 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1438"><span class="lineNum"> 1438 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1439"><span class="lineNum"> 1439 </span> : : {</a>
+<a name="1440"><span class="lineNum"> 1440 </span> : : .type = scenario_event_p,</a>
+<a name="1441"><span class="lineNum"> 1441 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1442"><span class="lineNum"> 1442 </span> : : },</a>
+<a name="1443"><span class="lineNum"> 1443 </span> : : {</a>
+<a name="1444"><span class="lineNum"> 1444 </span> : : .type = scenario_event_p,</a>
+<a name="1445"><span class="lineNum"> 1445 </span> : : .p = &amp;hiomap_erase_qs0l1_call,</a>
+<a name="1446"><span class="lineNum"> 1446 </span> : : },</a>
+<a name="1447"><span class="lineNum"> 1447 </span> : : {</a>
+<a name="1448"><span class="lineNum"> 1448 </span> : : .type = scenario_event_p,</a>
+<a name="1449"><span class="lineNum"> 1449 </span> : : .p = &amp;hiomap_flush_call,</a>
+<a name="1450"><span class="lineNum"> 1450 </span> : : },</a>
+<a name="1451"><span class="lineNum"> 1451 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_7, },</a>
+<a name="1452"><span class="lineNum"> 1452 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1453"><span class="lineNum"> 1453 </span> : : };</a>
+<a name="1454"><span class="lineNum"> 1454 </span> : : </a>
+<a name="1455"><span class="lineNum"> 1455 </span> : : static const struct scenario_event</a>
+<a name="1456"><span class="lineNum"> 1456 </span> : : scenario_hiomap_protocol_erase_two_blocks[] = {</a>
+<a name="1457"><span class="lineNum"> 1457 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1458"><span class="lineNum"> 1458 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1459"><span class="lineNum"> 1459 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1460"><span class="lineNum"> 1460 </span> : : {</a>
+<a name="1461"><span class="lineNum"> 1461 </span> : : .type = scenario_event_p,</a>
+<a name="1462"><span class="lineNum"> 1462 </span> : : .p = &amp;hiomap_create_write_window_qs0l2_rs0l1_call,</a>
+<a name="1463"><span class="lineNum"> 1463 </span> : : },</a>
+<a name="1464"><span class="lineNum"> 1464 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_erase_qs0l1_call, },</a>
+<a name="1465"><span class="lineNum"> 1465 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="1466"><span class="lineNum"> 1466 </span> : : {</a>
+<a name="1467"><span class="lineNum"> 1467 </span> : : .type = scenario_event_p,</a>
+<a name="1468"><span class="lineNum"> 1468 </span> : : .p = &amp;hiomap_create_write_window_qs1l1_rs1l1_call,</a>
+<a name="1469"><span class="lineNum"> 1469 </span> : : },</a>
+<a name="1470"><span class="lineNum"> 1470 </span> : : {</a>
+<a name="1471"><span class="lineNum"> 1471 </span> : : .type = scenario_cmd,</a>
+<a name="1472"><span class="lineNum"> 1472 </span> : : .c = {</a>
+<a name="1473"><span class="lineNum"> 1473 </span> : : .req = {</a>
+<a name="1474"><span class="lineNum"> 1474 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="1475"><span class="lineNum"> 1475 </span> : : .seq = 8,</a>
+<a name="1476"><span class="lineNum"> 1476 </span> : : .args = {</a>
+<a name="1477"><span class="lineNum"> 1477 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="1478"><span class="lineNum"> 1478 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1479"><span class="lineNum"> 1479 </span> : : },</a>
+<a name="1480"><span class="lineNum"> 1480 </span> : : },</a>
+<a name="1481"><span class="lineNum"> 1481 </span> : : .resp = {</a>
+<a name="1482"><span class="lineNum"> 1482 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="1483"><span class="lineNum"> 1483 </span> : : .seq = 8,</a>
+<a name="1484"><span class="lineNum"> 1484 </span> : : },</a>
+<a name="1485"><span class="lineNum"> 1485 </span> : : },</a>
+<a name="1486"><span class="lineNum"> 1486 </span> : : },</a>
+<a name="1487"><span class="lineNum"> 1487 </span> : : {</a>
+<a name="1488"><span class="lineNum"> 1488 </span> : : .type = scenario_cmd,</a>
+<a name="1489"><span class="lineNum"> 1489 </span> : : .c = {</a>
+<a name="1490"><span class="lineNum"> 1490 </span> : : .req = {</a>
+<a name="1491"><span class="lineNum"> 1491 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1492"><span class="lineNum"> 1492 </span> : : .seq = 9,</a>
+<a name="1493"><span class="lineNum"> 1493 </span> : : },</a>
+<a name="1494"><span class="lineNum"> 1494 </span> : : .resp = {</a>
+<a name="1495"><span class="lineNum"> 1495 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1496"><span class="lineNum"> 1496 </span> : : .seq = 9,</a>
+<a name="1497"><span class="lineNum"> 1497 </span> : : },</a>
+<a name="1498"><span class="lineNum"> 1498 </span> : : },</a>
+<a name="1499"><span class="lineNum"> 1499 </span> : : },</a>
+<a name="1500"><span class="lineNum"> 1500 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_a, },</a>
+<a name="1501"><span class="lineNum"> 1501 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1502"><span class="lineNum"> 1502 </span> : : };</a>
+<a name="1503"><span class="lineNum"> 1503 </span> : : </a>
+<a name="1504"><span class="lineNum"> 1504 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_erase_two_blocks(void)</span></a>
+<a name="1505"><span class="lineNum"> 1505 </span> : : {</a>
+<a name="1506"><span class="lineNum"> 1506 </span> : : struct blocklevel_device *bl;</a>
+<a name="1507"><span class="lineNum"> 1507 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1508"><span class="lineNum"> 1508 </span> : : size_t len;</a>
+<a name="1509"><span class="lineNum"> 1509 </span> : : </a>
+<a name="1510"><span class="lineNum"> 1510 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_erase_two_blocks);</span></a>
+<a name="1511"><span class="lineNum"> 1511 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1512"><span class="lineNum"> 1512 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1513"><span class="lineNum"> 1513 </span> :<span class="lineCov"> 1 : len = 2 * (1 &lt;&lt; ctx-&gt;block_size_shift);</span></a>
+<a name="1514"><span class="lineNum"> 1514 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="1515"><span class="lineNum"> 1515 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1516"><span class="lineNum"> 1516 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1517"><span class="lineNum"> 1517 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1518"><span class="lineNum"> 1518 </span> : : </a>
+<a name="1519"><span class="lineNum"> 1519 </span> : : static const struct scenario_event</a>
+<a name="1520"><span class="lineNum"> 1520 </span> : : scenario_hiomap_protocol_erase_one_block_twice[] = {</a>
+<a name="1521"><span class="lineNum"> 1521 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1522"><span class="lineNum"> 1522 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1523"><span class="lineNum"> 1523 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1524"><span class="lineNum"> 1524 </span> : : {</a>
+<a name="1525"><span class="lineNum"> 1525 </span> : : .type = scenario_event_p,</a>
+<a name="1526"><span class="lineNum"> 1526 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1527"><span class="lineNum"> 1527 </span> : : },</a>
+<a name="1528"><span class="lineNum"> 1528 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_erase_qs0l1_call, },</a>
+<a name="1529"><span class="lineNum"> 1529 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="1530"><span class="lineNum"> 1530 </span> : : {</a>
+<a name="1531"><span class="lineNum"> 1531 </span> : : .type = scenario_cmd,</a>
+<a name="1532"><span class="lineNum"> 1532 </span> : : .c = {</a>
+<a name="1533"><span class="lineNum"> 1533 </span> : : .req = {</a>
+<a name="1534"><span class="lineNum"> 1534 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="1535"><span class="lineNum"> 1535 </span> : : .seq = 7,</a>
+<a name="1536"><span class="lineNum"> 1536 </span> : : .args = {</a>
+<a name="1537"><span class="lineNum"> 1537 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="1538"><span class="lineNum"> 1538 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1539"><span class="lineNum"> 1539 </span> : : },</a>
+<a name="1540"><span class="lineNum"> 1540 </span> : : },</a>
+<a name="1541"><span class="lineNum"> 1541 </span> : : .resp = {</a>
+<a name="1542"><span class="lineNum"> 1542 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="1543"><span class="lineNum"> 1543 </span> : : .seq = 7,</a>
+<a name="1544"><span class="lineNum"> 1544 </span> : : },</a>
+<a name="1545"><span class="lineNum"> 1545 </span> : : },</a>
+<a name="1546"><span class="lineNum"> 1546 </span> : : },</a>
+<a name="1547"><span class="lineNum"> 1547 </span> : : {</a>
+<a name="1548"><span class="lineNum"> 1548 </span> : : .type = scenario_cmd,</a>
+<a name="1549"><span class="lineNum"> 1549 </span> : : .c = {</a>
+<a name="1550"><span class="lineNum"> 1550 </span> : : .req = {</a>
+<a name="1551"><span class="lineNum"> 1551 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1552"><span class="lineNum"> 1552 </span> : : .seq = 8,</a>
+<a name="1553"><span class="lineNum"> 1553 </span> : : },</a>
+<a name="1554"><span class="lineNum"> 1554 </span> : : .resp = {</a>
+<a name="1555"><span class="lineNum"> 1555 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1556"><span class="lineNum"> 1556 </span> : : .seq = 8,</a>
+<a name="1557"><span class="lineNum"> 1557 </span> : : },</a>
+<a name="1558"><span class="lineNum"> 1558 </span> : : },</a>
+<a name="1559"><span class="lineNum"> 1559 </span> : : },</a>
+<a name="1560"><span class="lineNum"> 1560 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_9, },</a>
+<a name="1561"><span class="lineNum"> 1561 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1562"><span class="lineNum"> 1562 </span> : : };</a>
+<a name="1563"><span class="lineNum"> 1563 </span> : : </a>
+<a name="1564"><span class="lineNum"> 1564 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_erase_one_block_twice(void)</span></a>
+<a name="1565"><span class="lineNum"> 1565 </span> : : {</a>
+<a name="1566"><span class="lineNum"> 1566 </span> : : struct blocklevel_device *bl;</a>
+<a name="1567"><span class="lineNum"> 1567 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1568"><span class="lineNum"> 1568 </span> : : size_t len;</a>
+<a name="1569"><span class="lineNum"> 1569 </span> : : </a>
+<a name="1570"><span class="lineNum"> 1570 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_erase_one_block_twice);</span></a>
+<a name="1571"><span class="lineNum"> 1571 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1572"><span class="lineNum"> 1572 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1573"><span class="lineNum"> 1573 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1574"><span class="lineNum"> 1574 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="1575"><span class="lineNum"> 1575 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="1576"><span class="lineNum"> 1576 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1577"><span class="lineNum"> 1577 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1578"><span class="lineNum"> 1578 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1579"><span class="lineNum"> 1579 </span> : : </a>
+<a name="1580"><span class="lineNum"> 1580 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_erase_one_block(void)</span></a>
+<a name="1581"><span class="lineNum"> 1581 </span> : : {</a>
+<a name="1582"><span class="lineNum"> 1582 </span> : : struct blocklevel_device *bl;</a>
+<a name="1583"><span class="lineNum"> 1583 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1584"><span class="lineNum"> 1584 </span> : : size_t len;</a>
+<a name="1585"><span class="lineNum"> 1585 </span> : : </a>
+<a name="1586"><span class="lineNum"> 1586 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_erase_one_block);</span></a>
+<a name="1587"><span class="lineNum"> 1587 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1588"><span class="lineNum"> 1588 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1589"><span class="lineNum"> 1589 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1590"><span class="lineNum"> 1590 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="1591"><span class="lineNum"> 1591 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1592"><span class="lineNum"> 1592 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1593"><span class="lineNum"> 1593 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1594"><span class="lineNum"> 1594 </span> : : </a>
+<a name="1595"><span class="lineNum"> 1595 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_event_before_erase(void)</span></a>
+<a name="1596"><span class="lineNum"> 1596 </span> : : {</a>
+<a name="1597"><span class="lineNum"> 1597 </span> : : struct blocklevel_device *bl;</a>
+<a name="1598"><span class="lineNum"> 1598 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1599"><span class="lineNum"> 1599 </span> : : size_t len;</a>
+<a name="1600"><span class="lineNum"> 1600 </span> : : int rc;</a>
+<a name="1601"><span class="lineNum"> 1601 </span> : : </a>
+<a name="1602"><span class="lineNum"> 1602 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_event_before_action);</span></a>
+<a name="1603"><span class="lineNum"> 1603 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1604"><span class="lineNum"> 1604 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1605"><span class="lineNum"> 1605 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1606"><span class="lineNum"> 1606 </span> :<span class="lineCov"> 1 : rc = bl-&gt;erase(bl, 0, len);</span></a>
+<a name="1607"><span class="lineNum"> 1607 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_AGAIN);</span></a>
+<a name="1608"><span class="lineNum"> 1608 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1609"><span class="lineNum"> 1609 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1610"><span class="lineNum"> 1610 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1611"><span class="lineNum"> 1611 </span> : : </a>
+<a name="1612"><span class="lineNum"> 1612 </span> : : static const struct scenario_event</a>
+<a name="1613"><span class="lineNum"> 1613 </span> : : scenario_hiomap_protocol_event_during_erase[] = {</a>
+<a name="1614"><span class="lineNum"> 1614 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1615"><span class="lineNum"> 1615 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1616"><span class="lineNum"> 1616 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1617"><span class="lineNum"> 1617 </span> : : {</a>
+<a name="1618"><span class="lineNum"> 1618 </span> : : .type = scenario_event_p,</a>
+<a name="1619"><span class="lineNum"> 1619 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1620"><span class="lineNum"> 1620 </span> : : },</a>
+<a name="1621"><span class="lineNum"> 1621 </span> : : {</a>
+<a name="1622"><span class="lineNum"> 1622 </span> : : .type = scenario_sel,</a>
+<a name="1623"><span class="lineNum"> 1623 </span> : : .s = {</a>
+<a name="1624"><span class="lineNum"> 1624 </span> : : .bmc_state = HIOMAP_E_DAEMON_READY |</a>
+<a name="1625"><span class="lineNum"> 1625 </span> : : HIOMAP_E_FLASH_LOST,</a>
+<a name="1626"><span class="lineNum"> 1626 </span> : : }</a>
+<a name="1627"><span class="lineNum"> 1627 </span> : : },</a>
+<a name="1628"><span class="lineNum"> 1628 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="1629"><span class="lineNum"> 1629 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1630"><span class="lineNum"> 1630 </span> : : };</a>
+<a name="1631"><span class="lineNum"> 1631 </span> : : </a>
+<a name="1632"><span class="lineNum"> 1632 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_event_during_erase(void)</span></a>
+<a name="1633"><span class="lineNum"> 1633 </span> : : {</a>
+<a name="1634"><span class="lineNum"> 1634 </span> : : struct blocklevel_device *bl;</a>
+<a name="1635"><span class="lineNum"> 1635 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1636"><span class="lineNum"> 1636 </span> : : size_t len;</a>
+<a name="1637"><span class="lineNum"> 1637 </span> : : int rc;</a>
+<a name="1638"><span class="lineNum"> 1638 </span> : : </a>
+<a name="1639"><span class="lineNum"> 1639 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_event_during_erase);</span></a>
+<a name="1640"><span class="lineNum"> 1640 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1641"><span class="lineNum"> 1641 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1642"><span class="lineNum"> 1642 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1643"><span class="lineNum"> 1643 </span> :<span class="lineCov"> 1 : rc = bl-&gt;erase(bl, 0, len);</span></a>
+<a name="1644"><span class="lineNum"> 1644 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_AGAIN);</span></a>
+<a name="1645"><span class="lineNum"> 1645 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1646"><span class="lineNum"> 1646 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1647"><span class="lineNum"> 1647 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1648"><span class="lineNum"> 1648 </span> : : </a>
+<a name="1649"><span class="lineNum"> 1649 </span> : : static const struct scenario_event scenario_hiomap_protocol_bad_sequence[] = {</a>
+<a name="1650"><span class="lineNum"> 1650 </span> : : {</a>
+<a name="1651"><span class="lineNum"> 1651 </span> : : .type = scenario_cmd,</a>
+<a name="1652"><span class="lineNum"> 1652 </span> : : .c = {</a>
+<a name="1653"><span class="lineNum"> 1653 </span> : : .req = {</a>
+<a name="1654"><span class="lineNum"> 1654 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="1655"><span class="lineNum"> 1655 </span> : : .seq = 1,</a>
+<a name="1656"><span class="lineNum"> 1656 </span> : : .args = {</a>
+<a name="1657"><span class="lineNum"> 1657 </span> : : [0] = HIOMAP_E_ACK_MASK,</a>
+<a name="1658"><span class="lineNum"> 1658 </span> : : },</a>
+<a name="1659"><span class="lineNum"> 1659 </span> : : },</a>
+<a name="1660"><span class="lineNum"> 1660 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="1661"><span class="lineNum"> 1661 </span> : : .resp = {</a>
+<a name="1662"><span class="lineNum"> 1662 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="1663"><span class="lineNum"> 1663 </span> : : .seq = 0,</a>
+<a name="1664"><span class="lineNum"> 1664 </span> : : },</a>
+<a name="1665"><span class="lineNum"> 1665 </span> : : },</a>
+<a name="1666"><span class="lineNum"> 1666 </span> : : },</a>
+<a name="1667"><span class="lineNum"> 1667 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1668"><span class="lineNum"> 1668 </span> : : };</a>
+<a name="1669"><span class="lineNum"> 1669 </span> : : </a>
+<a name="1670"><span class="lineNum"> 1670 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_bad_sequence(void)</span></a>
+<a name="1671"><span class="lineNum"> 1671 </span> : : {</a>
+<a name="1672"><span class="lineNum"> 1672 </span> : : struct blocklevel_device *bl;</a>
+<a name="1673"><span class="lineNum"> 1673 </span> : : </a>
+<a name="1674"><span class="lineNum"> 1674 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_bad_sequence);</span></a>
+<a name="1675"><span class="lineNum"> 1675 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="1676"><span class="lineNum"> 1676 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1677"><span class="lineNum"> 1677 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1678"><span class="lineNum"> 1678 </span> : : </a>
+<a name="1679"><span class="lineNum"> 1679 </span> : : static const struct scenario_event scenario_hiomap_protocol_action_error[] = {</a>
+<a name="1680"><span class="lineNum"> 1680 </span> : : {</a>
+<a name="1681"><span class="lineNum"> 1681 </span> : : .type = scenario_cmd,</a>
+<a name="1682"><span class="lineNum"> 1682 </span> : : .c = {</a>
+<a name="1683"><span class="lineNum"> 1683 </span> : : /* Ack is legitimate, but we'll pretend it's invalid */</a>
+<a name="1684"><span class="lineNum"> 1684 </span> : : .req = {</a>
+<a name="1685"><span class="lineNum"> 1685 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="1686"><span class="lineNum"> 1686 </span> : : .seq = 1,</a>
+<a name="1687"><span class="lineNum"> 1687 </span> : : .args = { [0] = 0x3 },</a>
+<a name="1688"><span class="lineNum"> 1688 </span> : : },</a>
+<a name="1689"><span class="lineNum"> 1689 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="1690"><span class="lineNum"> 1690 </span> : : .resp = {</a>
+<a name="1691"><span class="lineNum"> 1691 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="1692"><span class="lineNum"> 1692 </span> : : .seq = 1,</a>
+<a name="1693"><span class="lineNum"> 1693 </span> : : },</a>
+<a name="1694"><span class="lineNum"> 1694 </span> : : },</a>
+<a name="1695"><span class="lineNum"> 1695 </span> : : },</a>
+<a name="1696"><span class="lineNum"> 1696 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1697"><span class="lineNum"> 1697 </span> : : };</a>
+<a name="1698"><span class="lineNum"> 1698 </span> : : </a>
+<a name="1699"><span class="lineNum"> 1699 </span> :<span class="lineCov"> 2 : static void test_hiomap_protocol_action_error(void)</span></a>
+<a name="1700"><span class="lineNum"> 1700 </span> : : {</a>
+<a name="1701"><span class="lineNum"> 1701 </span> : : struct blocklevel_device *bl;</a>
+<a name="1702"><span class="lineNum"> 1702 </span> : : </a>
+<a name="1703"><span class="lineNum"> 1703 </span> :<span class="lineCov"> 2 : scenario_enter(scenario_hiomap_protocol_action_error);</span></a>
+<a name="1704"><span class="lineNum"> 1704 </span> :<span class="lineCov"> 2 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="1705"><span class="lineNum"> 1705 </span> :<span class="lineCov"> 2 : scenario_exit();</span></a>
+<a name="1706"><span class="lineNum"> 1706 </span> :<span class="lineCov"> 2 : }</span></a>
+<a name="1707"><span class="lineNum"> 1707 </span> : : </a>
+<a name="1708"><span class="lineNum"> 1708 </span> : : static const struct scenario_event</a>
+<a name="1709"><span class="lineNum"> 1709 </span> : : scenario_hiomap_protocol_get_flash_info[] = {</a>
+<a name="1710"><span class="lineNum"> 1710 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1711"><span class="lineNum"> 1711 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1712"><span class="lineNum"> 1712 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1713"><span class="lineNum"> 1713 </span> : : {</a>
+<a name="1714"><span class="lineNum"> 1714 </span> : : .type = scenario_cmd,</a>
+<a name="1715"><span class="lineNum"> 1715 </span> : : .c = {</a>
+<a name="1716"><span class="lineNum"> 1716 </span> : : .req = {</a>
+<a name="1717"><span class="lineNum"> 1717 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="1718"><span class="lineNum"> 1718 </span> : : .seq = 4,</a>
+<a name="1719"><span class="lineNum"> 1719 </span> : : .args = {</a>
+<a name="1720"><span class="lineNum"> 1720 </span> : : },</a>
+<a name="1721"><span class="lineNum"> 1721 </span> : : },</a>
+<a name="1722"><span class="lineNum"> 1722 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="1723"><span class="lineNum"> 1723 </span> : : .resp = {</a>
+<a name="1724"><span class="lineNum"> 1724 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="1725"><span class="lineNum"> 1725 </span> : : .seq = 4,</a>
+<a name="1726"><span class="lineNum"> 1726 </span> : : .args = {</a>
+<a name="1727"><span class="lineNum"> 1727 </span> : : [0] = 0x00, [1] = 0x20,</a>
+<a name="1728"><span class="lineNum"> 1728 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1729"><span class="lineNum"> 1729 </span> : : },</a>
+<a name="1730"><span class="lineNum"> 1730 </span> : : },</a>
+<a name="1731"><span class="lineNum"> 1731 </span> : : },</a>
+<a name="1732"><span class="lineNum"> 1732 </span> : : },</a>
+<a name="1733"><span class="lineNum"> 1733 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="1734"><span class="lineNum"> 1734 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1735"><span class="lineNum"> 1735 </span> : : };</a>
+<a name="1736"><span class="lineNum"> 1736 </span> : : </a>
+<a name="1737"><span class="lineNum"> 1737 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_get_flash_info(void)</span></a>
+<a name="1738"><span class="lineNum"> 1738 </span> : : {</a>
+<a name="1739"><span class="lineNum"> 1739 </span> : : struct blocklevel_device *bl;</a>
+<a name="1740"><span class="lineNum"> 1740 </span> : : const char *name;</a>
+<a name="1741"><span class="lineNum"> 1741 </span> : : uint32_t granule;</a>
+<a name="1742"><span class="lineNum"> 1742 </span> : : uint64_t size;</a>
+<a name="1743"><span class="lineNum"> 1743 </span> : : </a>
+<a name="1744"><span class="lineNum"> 1744 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_get_flash_info);</span></a>
+<a name="1745"><span class="lineNum"> 1745 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1746"><span class="lineNum"> 1746 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;get_info(bl, &amp;name, &amp;size, &amp;granule));</span></a>
+<a name="1747"><span class="lineNum"> 1747 </span> :<span class="lineCov"> 1 : assert(!name);</span></a>
+<a name="1748"><span class="lineNum"> 1748 </span> :<span class="lineCov"> 1 : assert(size == (32 * 1024 * 1024));</span></a>
+<a name="1749"><span class="lineNum"> 1749 </span> :<span class="lineCov"> 1 : assert(granule == (4 * 1024));</span></a>
+<a name="1750"><span class="lineNum"> 1750 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1751"><span class="lineNum"> 1751 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1752"><span class="lineNum"> 1752 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1753"><span class="lineNum"> 1753 </span> : : </a>
+<a name="1754"><span class="lineNum"> 1754 </span> : : static const struct scenario_event</a>
+<a name="1755"><span class="lineNum"> 1755 </span> : : scenario_hiomap_protocol_persistent_error[] = {</a>
+<a name="1756"><span class="lineNum"> 1756 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1757"><span class="lineNum"> 1757 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1758"><span class="lineNum"> 1758 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1759"><span class="lineNum"> 1759 </span> : : { .type = scenario_sel, .s = { .bmc_state = HIOMAP_E_PROTOCOL_RESET } },</a>
+<a name="1760"><span class="lineNum"> 1760 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="1761"><span class="lineNum"> 1761 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1762"><span class="lineNum"> 1762 </span> : : };</a>
+<a name="1763"><span class="lineNum"> 1763 </span> : : </a>
+<a name="1764"><span class="lineNum"> 1764 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_persistent_error(void)</span></a>
+<a name="1765"><span class="lineNum"> 1765 </span> : : {</a>
+<a name="1766"><span class="lineNum"> 1766 </span> : : struct blocklevel_device *bl;</a>
+<a name="1767"><span class="lineNum"> 1767 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1768"><span class="lineNum"> 1768 </span> : : char buf;</a>
+<a name="1769"><span class="lineNum"> 1769 </span> : : int rc;</a>
+<a name="1770"><span class="lineNum"> 1770 </span> : : </a>
+<a name="1771"><span class="lineNum"> 1771 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_persistent_error);</span></a>
+<a name="1772"><span class="lineNum"> 1772 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1773"><span class="lineNum"> 1773 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1774"><span class="lineNum"> 1774 </span> :<span class="lineCov"> 1 : assert(ctx-&gt;bmc_state == HIOMAP_E_PROTOCOL_RESET);</span></a>
+<a name="1775"><span class="lineNum"> 1775 </span> :<span class="lineCov"> 1 : rc = bl-&gt;read(bl, 0, &amp;buf, sizeof(buf));</span></a>
+<a name="1776"><span class="lineNum"> 1776 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_DEVICE_GONE);</span></a>
+<a name="1777"><span class="lineNum"> 1777 </span> :<span class="lineCov"> 1 : rc = bl-&gt;read(bl, 0, &amp;buf, sizeof(buf));</span></a>
+<a name="1778"><span class="lineNum"> 1778 </span> :<span class="lineCov"> 1 : assert(rc == FLASH_ERR_DEVICE_GONE);</span></a>
+<a name="1779"><span class="lineNum"> 1779 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1780"><span class="lineNum"> 1780 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1781"><span class="lineNum"> 1781 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1782"><span class="lineNum"> 1782 </span> : : </a>
+<a name="1783"><span class="lineNum"> 1783 </span> : : static const struct scenario_event</a>
+<a name="1784"><span class="lineNum"> 1784 </span> : : scenario_hiomap_get_info_error[] = {</a>
+<a name="1785"><span class="lineNum"> 1785 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1786"><span class="lineNum"> 1786 </span> : : {</a>
+<a name="1787"><span class="lineNum"> 1787 </span> : : .type = scenario_cmd,</a>
+<a name="1788"><span class="lineNum"> 1788 </span> : : .c = {</a>
+<a name="1789"><span class="lineNum"> 1789 </span> : : .req = {</a>
+<a name="1790"><span class="lineNum"> 1790 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="1791"><span class="lineNum"> 1791 </span> : : .seq = 2,</a>
+<a name="1792"><span class="lineNum"> 1792 </span> : : .args = {</a>
+<a name="1793"><span class="lineNum"> 1793 </span> : : [0] = HIOMAP_V2,</a>
+<a name="1794"><span class="lineNum"> 1794 </span> : : },</a>
+<a name="1795"><span class="lineNum"> 1795 </span> : : },</a>
+<a name="1796"><span class="lineNum"> 1796 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="1797"><span class="lineNum"> 1797 </span> : : },</a>
+<a name="1798"><span class="lineNum"> 1798 </span> : : },</a>
+<a name="1799"><span class="lineNum"> 1799 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1800"><span class="lineNum"> 1800 </span> : : };</a>
+<a name="1801"><span class="lineNum"> 1801 </span> : : </a>
+<a name="1802"><span class="lineNum"> 1802 </span> :<span class="lineCov"> 1 : static void test_hiomap_get_info_error(void)</span></a>
+<a name="1803"><span class="lineNum"> 1803 </span> : : {</a>
+<a name="1804"><span class="lineNum"> 1804 </span> : : struct blocklevel_device *bl;</a>
+<a name="1805"><span class="lineNum"> 1805 </span> : : </a>
+<a name="1806"><span class="lineNum"> 1806 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_get_info_error);</span></a>
+<a name="1807"><span class="lineNum"> 1807 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="1808"><span class="lineNum"> 1808 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1809"><span class="lineNum"> 1809 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1810"><span class="lineNum"> 1810 </span> : : </a>
+<a name="1811"><span class="lineNum"> 1811 </span> : : static const struct scenario_event</a>
+<a name="1812"><span class="lineNum"> 1812 </span> : : scenario_hiomap_get_flash_info_error[] = {</a>
+<a name="1813"><span class="lineNum"> 1813 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1814"><span class="lineNum"> 1814 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1815"><span class="lineNum"> 1815 </span> : : {</a>
+<a name="1816"><span class="lineNum"> 1816 </span> : : .type = scenario_cmd,</a>
+<a name="1817"><span class="lineNum"> 1817 </span> : : .c = {</a>
+<a name="1818"><span class="lineNum"> 1818 </span> : : .req = {</a>
+<a name="1819"><span class="lineNum"> 1819 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="1820"><span class="lineNum"> 1820 </span> : : .seq = 3,</a>
+<a name="1821"><span class="lineNum"> 1821 </span> : : .args = {</a>
+<a name="1822"><span class="lineNum"> 1822 </span> : : [0] = HIOMAP_V2,</a>
+<a name="1823"><span class="lineNum"> 1823 </span> : : },</a>
+<a name="1824"><span class="lineNum"> 1824 </span> : : },</a>
+<a name="1825"><span class="lineNum"> 1825 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="1826"><span class="lineNum"> 1826 </span> : : },</a>
+<a name="1827"><span class="lineNum"> 1827 </span> : : },</a>
+<a name="1828"><span class="lineNum"> 1828 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1829"><span class="lineNum"> 1829 </span> : : };</a>
+<a name="1830"><span class="lineNum"> 1830 </span> : : </a>
+<a name="1831"><span class="lineNum"> 1831 </span> :<span class="lineCov"> 1 : static void test_hiomap_get_flash_info_error(void)</span></a>
+<a name="1832"><span class="lineNum"> 1832 </span> : : {</a>
+<a name="1833"><span class="lineNum"> 1833 </span> : : struct blocklevel_device *bl;</a>
+<a name="1834"><span class="lineNum"> 1834 </span> : : </a>
+<a name="1835"><span class="lineNum"> 1835 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_get_flash_info_error);</span></a>
+<a name="1836"><span class="lineNum"> 1836 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="1837"><span class="lineNum"> 1837 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1838"><span class="lineNum"> 1838 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1839"><span class="lineNum"> 1839 </span> : : </a>
+<a name="1840"><span class="lineNum"> 1840 </span> : : static const struct scenario_event</a>
+<a name="1841"><span class="lineNum"> 1841 </span> : : scenario_hiomap_create_read_window_error[] = {</a>
+<a name="1842"><span class="lineNum"> 1842 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1843"><span class="lineNum"> 1843 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1844"><span class="lineNum"> 1844 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1845"><span class="lineNum"> 1845 </span> : : {</a>
+<a name="1846"><span class="lineNum"> 1846 </span> : : .type = scenario_cmd,</a>
+<a name="1847"><span class="lineNum"> 1847 </span> : : .c = {</a>
+<a name="1848"><span class="lineNum"> 1848 </span> : : .req = {</a>
+<a name="1849"><span class="lineNum"> 1849 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="1850"><span class="lineNum"> 1850 </span> : : .seq = 4,</a>
+<a name="1851"><span class="lineNum"> 1851 </span> : : .args = {</a>
+<a name="1852"><span class="lineNum"> 1852 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="1853"><span class="lineNum"> 1853 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1854"><span class="lineNum"> 1854 </span> : : },</a>
+<a name="1855"><span class="lineNum"> 1855 </span> : : },</a>
+<a name="1856"><span class="lineNum"> 1856 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="1857"><span class="lineNum"> 1857 </span> : : },</a>
+<a name="1858"><span class="lineNum"> 1858 </span> : : },</a>
+<a name="1859"><span class="lineNum"> 1859 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="1860"><span class="lineNum"> 1860 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1861"><span class="lineNum"> 1861 </span> : : };</a>
+<a name="1862"><span class="lineNum"> 1862 </span> : : </a>
+<a name="1863"><span class="lineNum"> 1863 </span> :<span class="lineCov"> 1 : static void test_hiomap_create_read_window_error(void)</span></a>
+<a name="1864"><span class="lineNum"> 1864 </span> : : {</a>
+<a name="1865"><span class="lineNum"> 1865 </span> : : struct blocklevel_device *bl;</a>
+<a name="1866"><span class="lineNum"> 1866 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1867"><span class="lineNum"> 1867 </span> : : size_t len;</a>
+<a name="1868"><span class="lineNum"> 1868 </span> : : void *buf;</a>
+<a name="1869"><span class="lineNum"> 1869 </span> : : </a>
+<a name="1870"><span class="lineNum"> 1870 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_create_read_window_error);</span></a>
+<a name="1871"><span class="lineNum"> 1871 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1872"><span class="lineNum"> 1872 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1873"><span class="lineNum"> 1873 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1874"><span class="lineNum"> 1874 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1875"><span class="lineNum"> 1875 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1876"><span class="lineNum"> 1876 </span> :<span class="lineCov"> 1 : assert(bl-&gt;read(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="1877"><span class="lineNum"> 1877 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1878"><span class="lineNum"> 1878 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1879"><span class="lineNum"> 1879 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1880"><span class="lineNum"> 1880 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1881"><span class="lineNum"> 1881 </span> : : </a>
+<a name="1882"><span class="lineNum"> 1882 </span> : : static const struct scenario_event</a>
+<a name="1883"><span class="lineNum"> 1883 </span> : : scenario_hiomap_create_write_window_error[] = {</a>
+<a name="1884"><span class="lineNum"> 1884 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1885"><span class="lineNum"> 1885 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1886"><span class="lineNum"> 1886 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1887"><span class="lineNum"> 1887 </span> : : {</a>
+<a name="1888"><span class="lineNum"> 1888 </span> : : .type = scenario_cmd,</a>
+<a name="1889"><span class="lineNum"> 1889 </span> : : .c = {</a>
+<a name="1890"><span class="lineNum"> 1890 </span> : : .req = {</a>
+<a name="1891"><span class="lineNum"> 1891 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="1892"><span class="lineNum"> 1892 </span> : : .seq = 4,</a>
+<a name="1893"><span class="lineNum"> 1893 </span> : : .args = {</a>
+<a name="1894"><span class="lineNum"> 1894 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="1895"><span class="lineNum"> 1895 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1896"><span class="lineNum"> 1896 </span> : : },</a>
+<a name="1897"><span class="lineNum"> 1897 </span> : : },</a>
+<a name="1898"><span class="lineNum"> 1898 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="1899"><span class="lineNum"> 1899 </span> : : },</a>
+<a name="1900"><span class="lineNum"> 1900 </span> : : },</a>
+<a name="1901"><span class="lineNum"> 1901 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="1902"><span class="lineNum"> 1902 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1903"><span class="lineNum"> 1903 </span> : : };</a>
+<a name="1904"><span class="lineNum"> 1904 </span> : : </a>
+<a name="1905"><span class="lineNum"> 1905 </span> :<span class="lineCov"> 1 : static void test_hiomap_create_write_window_error(void)</span></a>
+<a name="1906"><span class="lineNum"> 1906 </span> : : {</a>
+<a name="1907"><span class="lineNum"> 1907 </span> : : struct blocklevel_device *bl;</a>
+<a name="1908"><span class="lineNum"> 1908 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1909"><span class="lineNum"> 1909 </span> : : size_t len;</a>
+<a name="1910"><span class="lineNum"> 1910 </span> : : void *buf;</a>
+<a name="1911"><span class="lineNum"> 1911 </span> : : </a>
+<a name="1912"><span class="lineNum"> 1912 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_create_write_window_error);</span></a>
+<a name="1913"><span class="lineNum"> 1913 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1914"><span class="lineNum"> 1914 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1915"><span class="lineNum"> 1915 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1916"><span class="lineNum"> 1916 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1917"><span class="lineNum"> 1917 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1918"><span class="lineNum"> 1918 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="1919"><span class="lineNum"> 1919 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1920"><span class="lineNum"> 1920 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1921"><span class="lineNum"> 1921 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1922"><span class="lineNum"> 1922 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1923"><span class="lineNum"> 1923 </span> : : </a>
+<a name="1924"><span class="lineNum"> 1924 </span> : : static const struct scenario_event scenario_hiomap_mark_dirty_error[] = {</a>
+<a name="1925"><span class="lineNum"> 1925 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1926"><span class="lineNum"> 1926 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1927"><span class="lineNum"> 1927 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1928"><span class="lineNum"> 1928 </span> : : {</a>
+<a name="1929"><span class="lineNum"> 1929 </span> : : .type = scenario_event_p,</a>
+<a name="1930"><span class="lineNum"> 1930 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1931"><span class="lineNum"> 1931 </span> : : },</a>
+<a name="1932"><span class="lineNum"> 1932 </span> : : {</a>
+<a name="1933"><span class="lineNum"> 1933 </span> : : .type = scenario_cmd,</a>
+<a name="1934"><span class="lineNum"> 1934 </span> : : .c = {</a>
+<a name="1935"><span class="lineNum"> 1935 </span> : : .req = {</a>
+<a name="1936"><span class="lineNum"> 1936 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="1937"><span class="lineNum"> 1937 </span> : : .seq = 5,</a>
+<a name="1938"><span class="lineNum"> 1938 </span> : : .args = {</a>
+<a name="1939"><span class="lineNum"> 1939 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="1940"><span class="lineNum"> 1940 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="1941"><span class="lineNum"> 1941 </span> : : },</a>
+<a name="1942"><span class="lineNum"> 1942 </span> : : },</a>
+<a name="1943"><span class="lineNum"> 1943 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="1944"><span class="lineNum"> 1944 </span> : : },</a>
+<a name="1945"><span class="lineNum"> 1945 </span> : : },</a>
+<a name="1946"><span class="lineNum"> 1946 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="1947"><span class="lineNum"> 1947 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1948"><span class="lineNum"> 1948 </span> : : };</a>
+<a name="1949"><span class="lineNum"> 1949 </span> : : </a>
+<a name="1950"><span class="lineNum"> 1950 </span> :<span class="lineCov"> 1 : static void test_hiomap_mark_dirty_error(void)</span></a>
+<a name="1951"><span class="lineNum"> 1951 </span> : : {</a>
+<a name="1952"><span class="lineNum"> 1952 </span> : : struct blocklevel_device *bl;</a>
+<a name="1953"><span class="lineNum"> 1953 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1954"><span class="lineNum"> 1954 </span> : : size_t len;</a>
+<a name="1955"><span class="lineNum"> 1955 </span> : : void *buf;</a>
+<a name="1956"><span class="lineNum"> 1956 </span> : : </a>
+<a name="1957"><span class="lineNum"> 1957 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_mark_dirty_error);</span></a>
+<a name="1958"><span class="lineNum"> 1958 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="1959"><span class="lineNum"> 1959 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="1960"><span class="lineNum"> 1960 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="1961"><span class="lineNum"> 1961 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="1962"><span class="lineNum"> 1962 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="1963"><span class="lineNum"> 1963 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="1964"><span class="lineNum"> 1964 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="1965"><span class="lineNum"> 1965 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="1966"><span class="lineNum"> 1966 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="1967"><span class="lineNum"> 1967 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="1968"><span class="lineNum"> 1968 </span> : : </a>
+<a name="1969"><span class="lineNum"> 1969 </span> : : static const struct scenario_event scenario_hiomap_flush_error[] = {</a>
+<a name="1970"><span class="lineNum"> 1970 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="1971"><span class="lineNum"> 1971 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="1972"><span class="lineNum"> 1972 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="1973"><span class="lineNum"> 1973 </span> : : {</a>
+<a name="1974"><span class="lineNum"> 1974 </span> : : .type = scenario_event_p,</a>
+<a name="1975"><span class="lineNum"> 1975 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="1976"><span class="lineNum"> 1976 </span> : : },</a>
+<a name="1977"><span class="lineNum"> 1977 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_mark_dirty_qs0l1_call, },</a>
+<a name="1978"><span class="lineNum"> 1978 </span> : : {</a>
+<a name="1979"><span class="lineNum"> 1979 </span> : : .type = scenario_cmd,</a>
+<a name="1980"><span class="lineNum"> 1980 </span> : : .c = {</a>
+<a name="1981"><span class="lineNum"> 1981 </span> : : .req = {</a>
+<a name="1982"><span class="lineNum"> 1982 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="1983"><span class="lineNum"> 1983 </span> : : .seq = 6,</a>
+<a name="1984"><span class="lineNum"> 1984 </span> : : },</a>
+<a name="1985"><span class="lineNum"> 1985 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="1986"><span class="lineNum"> 1986 </span> : : },</a>
+<a name="1987"><span class="lineNum"> 1987 </span> : : },</a>
+<a name="1988"><span class="lineNum"> 1988 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_7, },</a>
+<a name="1989"><span class="lineNum"> 1989 </span> : : SCENARIO_SENTINEL,</a>
+<a name="1990"><span class="lineNum"> 1990 </span> : : };</a>
+<a name="1991"><span class="lineNum"> 1991 </span> : : </a>
+<a name="1992"><span class="lineNum"> 1992 </span> :<span class="lineCov"> 1 : static void test_hiomap_flush_error(void)</span></a>
+<a name="1993"><span class="lineNum"> 1993 </span> : : {</a>
+<a name="1994"><span class="lineNum"> 1994 </span> : : struct blocklevel_device *bl;</a>
+<a name="1995"><span class="lineNum"> 1995 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="1996"><span class="lineNum"> 1996 </span> : : size_t len;</a>
+<a name="1997"><span class="lineNum"> 1997 </span> : : void *buf;</a>
+<a name="1998"><span class="lineNum"> 1998 </span> : : </a>
+<a name="1999"><span class="lineNum"> 1999 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_flush_error);</span></a>
+<a name="2000"><span class="lineNum"> 2000 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2001"><span class="lineNum"> 2001 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2002"><span class="lineNum"> 2002 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2003"><span class="lineNum"> 2003 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2004"><span class="lineNum"> 2004 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2005"><span class="lineNum"> 2005 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2006"><span class="lineNum"> 2006 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2007"><span class="lineNum"> 2007 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2008"><span class="lineNum"> 2008 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2009"><span class="lineNum"> 2009 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2010"><span class="lineNum"> 2010 </span> : : </a>
+<a name="2011"><span class="lineNum"> 2011 </span> :<span class="lineCov"> 1 : static void test_hiomap_ack_error(void)</span></a>
+<a name="2012"><span class="lineNum"> 2012 </span> : : {</a>
+<a name="2013"><span class="lineNum"> 2013 </span> : : /* Same thing at the moment */</a>
+<a name="2014"><span class="lineNum"> 2014 </span> :<span class="lineCov"> 1 : test_hiomap_protocol_action_error();</span></a>
+<a name="2015"><span class="lineNum"> 2015 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2016"><span class="lineNum"> 2016 </span> : : </a>
+<a name="2017"><span class="lineNum"> 2017 </span> : : static const struct scenario_event scenario_hiomap_erase_error[] = {</a>
+<a name="2018"><span class="lineNum"> 2018 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2019"><span class="lineNum"> 2019 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2020"><span class="lineNum"> 2020 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2021"><span class="lineNum"> 2021 </span> : : {</a>
+<a name="2022"><span class="lineNum"> 2022 </span> : : .type = scenario_event_p,</a>
+<a name="2023"><span class="lineNum"> 2023 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2024"><span class="lineNum"> 2024 </span> : : },</a>
+<a name="2025"><span class="lineNum"> 2025 </span> : : {</a>
+<a name="2026"><span class="lineNum"> 2026 </span> : : .type = scenario_cmd,</a>
+<a name="2027"><span class="lineNum"> 2027 </span> : : .c = {</a>
+<a name="2028"><span class="lineNum"> 2028 </span> : : .req = {</a>
+<a name="2029"><span class="lineNum"> 2029 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="2030"><span class="lineNum"> 2030 </span> : : .seq = 5,</a>
+<a name="2031"><span class="lineNum"> 2031 </span> : : .args = {</a>
+<a name="2032"><span class="lineNum"> 2032 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2033"><span class="lineNum"> 2033 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2034"><span class="lineNum"> 2034 </span> : : },</a>
+<a name="2035"><span class="lineNum"> 2035 </span> : : },</a>
+<a name="2036"><span class="lineNum"> 2036 </span> : : .cc = IPMI_INVALID_COMMAND_ERR,</a>
+<a name="2037"><span class="lineNum"> 2037 </span> : : },</a>
+<a name="2038"><span class="lineNum"> 2038 </span> : : },</a>
+<a name="2039"><span class="lineNum"> 2039 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="2040"><span class="lineNum"> 2040 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2041"><span class="lineNum"> 2041 </span> : : };</a>
+<a name="2042"><span class="lineNum"> 2042 </span> : : </a>
+<a name="2043"><span class="lineNum"> 2043 </span> :<span class="lineCov"> 1 : static void test_hiomap_erase_error(void)</span></a>
+<a name="2044"><span class="lineNum"> 2044 </span> : : {</a>
+<a name="2045"><span class="lineNum"> 2045 </span> : : struct blocklevel_device *bl;</a>
+<a name="2046"><span class="lineNum"> 2046 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2047"><span class="lineNum"> 2047 </span> : : size_t len;</a>
+<a name="2048"><span class="lineNum"> 2048 </span> : : </a>
+<a name="2049"><span class="lineNum"> 2049 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_erase_error);</span></a>
+<a name="2050"><span class="lineNum"> 2050 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2051"><span class="lineNum"> 2051 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2052"><span class="lineNum"> 2052 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2053"><span class="lineNum"> 2053 </span> :<span class="lineCov"> 1 : assert(bl-&gt;erase(bl, 0, len) &gt; 0);</span></a>
+<a name="2054"><span class="lineNum"> 2054 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2055"><span class="lineNum"> 2055 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2056"><span class="lineNum"> 2056 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2057"><span class="lineNum"> 2057 </span> : : </a>
+<a name="2058"><span class="lineNum"> 2058 </span> : : static const struct scenario_event scenario_hiomap_ack_malformed_small[] = {</a>
+<a name="2059"><span class="lineNum"> 2059 </span> : : {</a>
+<a name="2060"><span class="lineNum"> 2060 </span> : : .type = scenario_cmd,</a>
+<a name="2061"><span class="lineNum"> 2061 </span> : : .c = {</a>
+<a name="2062"><span class="lineNum"> 2062 </span> : : .req = {</a>
+<a name="2063"><span class="lineNum"> 2063 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2064"><span class="lineNum"> 2064 </span> : : .seq = 1,</a>
+<a name="2065"><span class="lineNum"> 2065 </span> : : .args = { [0] = 0x3 },</a>
+<a name="2066"><span class="lineNum"> 2066 </span> : : },</a>
+<a name="2067"><span class="lineNum"> 2067 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2068"><span class="lineNum"> 2068 </span> : : .resp_size = 1</a>
+<a name="2069"><span class="lineNum"> 2069 </span> : : },</a>
+<a name="2070"><span class="lineNum"> 2070 </span> : : },</a>
+<a name="2071"><span class="lineNum"> 2071 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2072"><span class="lineNum"> 2072 </span> : : };</a>
+<a name="2073"><span class="lineNum"> 2073 </span> : : </a>
+<a name="2074"><span class="lineNum"> 2074 </span> :<span class="lineCov"> 1 : static void test_hiomap_ack_malformed_small(void)</span></a>
+<a name="2075"><span class="lineNum"> 2075 </span> : : {</a>
+<a name="2076"><span class="lineNum"> 2076 </span> : : struct blocklevel_device *bl;</a>
+<a name="2077"><span class="lineNum"> 2077 </span> : : </a>
+<a name="2078"><span class="lineNum"> 2078 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_ack_malformed_small);</span></a>
+<a name="2079"><span class="lineNum"> 2079 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="2080"><span class="lineNum"> 2080 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2081"><span class="lineNum"> 2081 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2082"><span class="lineNum"> 2082 </span> : : </a>
+<a name="2083"><span class="lineNum"> 2083 </span> : : static const struct scenario_event scenario_hiomap_ack_malformed_large[] = {</a>
+<a name="2084"><span class="lineNum"> 2084 </span> : : {</a>
+<a name="2085"><span class="lineNum"> 2085 </span> : : .type = scenario_cmd,</a>
+<a name="2086"><span class="lineNum"> 2086 </span> : : .c = {</a>
+<a name="2087"><span class="lineNum"> 2087 </span> : : .req = {</a>
+<a name="2088"><span class="lineNum"> 2088 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2089"><span class="lineNum"> 2089 </span> : : .seq = 1,</a>
+<a name="2090"><span class="lineNum"> 2090 </span> : : .args = { [0] = 0x3 },</a>
+<a name="2091"><span class="lineNum"> 2091 </span> : : },</a>
+<a name="2092"><span class="lineNum"> 2092 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2093"><span class="lineNum"> 2093 </span> : : .resp_size = 3,</a>
+<a name="2094"><span class="lineNum"> 2094 </span> : : .resp = {</a>
+<a name="2095"><span class="lineNum"> 2095 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2096"><span class="lineNum"> 2096 </span> : : .seq = 1,</a>
+<a name="2097"><span class="lineNum"> 2097 </span> : : },</a>
+<a name="2098"><span class="lineNum"> 2098 </span> : : },</a>
+<a name="2099"><span class="lineNum"> 2099 </span> : : },</a>
+<a name="2100"><span class="lineNum"> 2100 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2101"><span class="lineNum"> 2101 </span> : : };</a>
+<a name="2102"><span class="lineNum"> 2102 </span> : : </a>
+<a name="2103"><span class="lineNum"> 2103 </span> :<span class="lineCov"> 1 : static void test_hiomap_ack_malformed_large(void)</span></a>
+<a name="2104"><span class="lineNum"> 2104 </span> : : {</a>
+<a name="2105"><span class="lineNum"> 2105 </span> : : struct blocklevel_device *bl;</a>
+<a name="2106"><span class="lineNum"> 2106 </span> : : </a>
+<a name="2107"><span class="lineNum"> 2107 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_ack_malformed_large);</span></a>
+<a name="2108"><span class="lineNum"> 2108 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="2109"><span class="lineNum"> 2109 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2110"><span class="lineNum"> 2110 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2111"><span class="lineNum"> 2111 </span> : : </a>
+<a name="2112"><span class="lineNum"> 2112 </span> : : static const struct scenario_event</a>
+<a name="2113"><span class="lineNum"> 2113 </span> : : scenario_hiomap_get_info_malformed_small[] = {</a>
+<a name="2114"><span class="lineNum"> 2114 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2115"><span class="lineNum"> 2115 </span> : : {</a>
+<a name="2116"><span class="lineNum"> 2116 </span> : : .type = scenario_cmd,</a>
+<a name="2117"><span class="lineNum"> 2117 </span> : : .c = {</a>
+<a name="2118"><span class="lineNum"> 2118 </span> : : .req = {</a>
+<a name="2119"><span class="lineNum"> 2119 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2120"><span class="lineNum"> 2120 </span> : : .seq = 2,</a>
+<a name="2121"><span class="lineNum"> 2121 </span> : : .args = { [0] = 0x2 },</a>
+<a name="2122"><span class="lineNum"> 2122 </span> : : },</a>
+<a name="2123"><span class="lineNum"> 2123 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2124"><span class="lineNum"> 2124 </span> : : .resp_size = 7,</a>
+<a name="2125"><span class="lineNum"> 2125 </span> : : .resp = {</a>
+<a name="2126"><span class="lineNum"> 2126 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2127"><span class="lineNum"> 2127 </span> : : .seq = 2,</a>
+<a name="2128"><span class="lineNum"> 2128 </span> : : },</a>
+<a name="2129"><span class="lineNum"> 2129 </span> : : },</a>
+<a name="2130"><span class="lineNum"> 2130 </span> : : },</a>
+<a name="2131"><span class="lineNum"> 2131 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2132"><span class="lineNum"> 2132 </span> : : };</a>
+<a name="2133"><span class="lineNum"> 2133 </span> : : </a>
+<a name="2134"><span class="lineNum"> 2134 </span> :<span class="lineCov"> 1 : static void test_hiomap_get_info_malformed_small(void)</span></a>
+<a name="2135"><span class="lineNum"> 2135 </span> : : {</a>
+<a name="2136"><span class="lineNum"> 2136 </span> : : struct blocklevel_device *bl;</a>
+<a name="2137"><span class="lineNum"> 2137 </span> : : </a>
+<a name="2138"><span class="lineNum"> 2138 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_get_info_malformed_small);</span></a>
+<a name="2139"><span class="lineNum"> 2139 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="2140"><span class="lineNum"> 2140 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2141"><span class="lineNum"> 2141 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2142"><span class="lineNum"> 2142 </span> : : </a>
+<a name="2143"><span class="lineNum"> 2143 </span> : : static const struct scenario_event</a>
+<a name="2144"><span class="lineNum"> 2144 </span> : : scenario_hiomap_get_info_malformed_large[] = {</a>
+<a name="2145"><span class="lineNum"> 2145 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2146"><span class="lineNum"> 2146 </span> : : {</a>
+<a name="2147"><span class="lineNum"> 2147 </span> : : .type = scenario_cmd,</a>
+<a name="2148"><span class="lineNum"> 2148 </span> : : .c = {</a>
+<a name="2149"><span class="lineNum"> 2149 </span> : : .req = {</a>
+<a name="2150"><span class="lineNum"> 2150 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2151"><span class="lineNum"> 2151 </span> : : .seq = 2,</a>
+<a name="2152"><span class="lineNum"> 2152 </span> : : .args = { [0] = 0x2 },</a>
+<a name="2153"><span class="lineNum"> 2153 </span> : : },</a>
+<a name="2154"><span class="lineNum"> 2154 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2155"><span class="lineNum"> 2155 </span> : : .resp_size = 9,</a>
+<a name="2156"><span class="lineNum"> 2156 </span> : : .resp = {</a>
+<a name="2157"><span class="lineNum"> 2157 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2158"><span class="lineNum"> 2158 </span> : : .seq = 2,</a>
+<a name="2159"><span class="lineNum"> 2159 </span> : : },</a>
+<a name="2160"><span class="lineNum"> 2160 </span> : : },</a>
+<a name="2161"><span class="lineNum"> 2161 </span> : : },</a>
+<a name="2162"><span class="lineNum"> 2162 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2163"><span class="lineNum"> 2163 </span> : : };</a>
+<a name="2164"><span class="lineNum"> 2164 </span> : : </a>
+<a name="2165"><span class="lineNum"> 2165 </span> :<span class="lineCov"> 1 : static void test_hiomap_get_info_malformed_large(void)</span></a>
+<a name="2166"><span class="lineNum"> 2166 </span> : : {</a>
+<a name="2167"><span class="lineNum"> 2167 </span> : : struct blocklevel_device *bl;</a>
+<a name="2168"><span class="lineNum"> 2168 </span> : : </a>
+<a name="2169"><span class="lineNum"> 2169 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_get_info_malformed_large);</span></a>
+<a name="2170"><span class="lineNum"> 2170 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="2171"><span class="lineNum"> 2171 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2172"><span class="lineNum"> 2172 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2173"><span class="lineNum"> 2173 </span> : : </a>
+<a name="2174"><span class="lineNum"> 2174 </span> : : static const struct scenario_event</a>
+<a name="2175"><span class="lineNum"> 2175 </span> : : scenario_hiomap_get_flash_info_malformed_small[] = {</a>
+<a name="2176"><span class="lineNum"> 2176 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2177"><span class="lineNum"> 2177 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2178"><span class="lineNum"> 2178 </span> : : {</a>
+<a name="2179"><span class="lineNum"> 2179 </span> : : .type = scenario_cmd,</a>
+<a name="2180"><span class="lineNum"> 2180 </span> : : .c = {</a>
+<a name="2181"><span class="lineNum"> 2181 </span> : : .req = {</a>
+<a name="2182"><span class="lineNum"> 2182 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="2183"><span class="lineNum"> 2183 </span> : : .seq = 3,</a>
+<a name="2184"><span class="lineNum"> 2184 </span> : : },</a>
+<a name="2185"><span class="lineNum"> 2185 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2186"><span class="lineNum"> 2186 </span> : : .resp_size = 5,</a>
+<a name="2187"><span class="lineNum"> 2187 </span> : : .resp = {</a>
+<a name="2188"><span class="lineNum"> 2188 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="2189"><span class="lineNum"> 2189 </span> : : .seq = 3,</a>
+<a name="2190"><span class="lineNum"> 2190 </span> : : },</a>
+<a name="2191"><span class="lineNum"> 2191 </span> : : },</a>
+<a name="2192"><span class="lineNum"> 2192 </span> : : },</a>
+<a name="2193"><span class="lineNum"> 2193 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2194"><span class="lineNum"> 2194 </span> : : };</a>
+<a name="2195"><span class="lineNum"> 2195 </span> : : </a>
+<a name="2196"><span class="lineNum"> 2196 </span> :<span class="lineCov"> 1 : static void test_hiomap_get_flash_info_malformed_small(void)</span></a>
+<a name="2197"><span class="lineNum"> 2197 </span> : : {</a>
+<a name="2198"><span class="lineNum"> 2198 </span> : : struct blocklevel_device *bl;</a>
+<a name="2199"><span class="lineNum"> 2199 </span> : : </a>
+<a name="2200"><span class="lineNum"> 2200 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_get_flash_info_malformed_small);</span></a>
+<a name="2201"><span class="lineNum"> 2201 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="2202"><span class="lineNum"> 2202 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2203"><span class="lineNum"> 2203 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2204"><span class="lineNum"> 2204 </span> : : </a>
+<a name="2205"><span class="lineNum"> 2205 </span> : : static const struct scenario_event</a>
+<a name="2206"><span class="lineNum"> 2206 </span> : : scenario_hiomap_get_flash_info_malformed_large[] = {</a>
+<a name="2207"><span class="lineNum"> 2207 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2208"><span class="lineNum"> 2208 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2209"><span class="lineNum"> 2209 </span> : : {</a>
+<a name="2210"><span class="lineNum"> 2210 </span> : : .type = scenario_cmd,</a>
+<a name="2211"><span class="lineNum"> 2211 </span> : : .c = {</a>
+<a name="2212"><span class="lineNum"> 2212 </span> : : .req = {</a>
+<a name="2213"><span class="lineNum"> 2213 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="2214"><span class="lineNum"> 2214 </span> : : .seq = 3,</a>
+<a name="2215"><span class="lineNum"> 2215 </span> : : },</a>
+<a name="2216"><span class="lineNum"> 2216 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2217"><span class="lineNum"> 2217 </span> : : .resp_size = 7,</a>
+<a name="2218"><span class="lineNum"> 2218 </span> : : .resp = {</a>
+<a name="2219"><span class="lineNum"> 2219 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="2220"><span class="lineNum"> 2220 </span> : : .seq = 3,</a>
+<a name="2221"><span class="lineNum"> 2221 </span> : : },</a>
+<a name="2222"><span class="lineNum"> 2222 </span> : : },</a>
+<a name="2223"><span class="lineNum"> 2223 </span> : : },</a>
+<a name="2224"><span class="lineNum"> 2224 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2225"><span class="lineNum"> 2225 </span> : : };</a>
+<a name="2226"><span class="lineNum"> 2226 </span> : : </a>
+<a name="2227"><span class="lineNum"> 2227 </span> :<span class="lineCov"> 1 : static void test_hiomap_get_flash_info_malformed_large(void)</span></a>
+<a name="2228"><span class="lineNum"> 2228 </span> : : {</a>
+<a name="2229"><span class="lineNum"> 2229 </span> : : struct blocklevel_device *bl;</a>
+<a name="2230"><span class="lineNum"> 2230 </span> : : </a>
+<a name="2231"><span class="lineNum"> 2231 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_get_flash_info_malformed_large);</span></a>
+<a name="2232"><span class="lineNum"> 2232 </span> :<span class="lineCov"> 1 : assert(ipmi_hiomap_init(&amp;bl) &gt; 0);</span></a>
+<a name="2233"><span class="lineNum"> 2233 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2234"><span class="lineNum"> 2234 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2235"><span class="lineNum"> 2235 </span> : : </a>
+<a name="2236"><span class="lineNum"> 2236 </span> : : static const struct scenario_event</a>
+<a name="2237"><span class="lineNum"> 2237 </span> : : scenario_hiomap_create_read_window_malformed_small[] = {</a>
+<a name="2238"><span class="lineNum"> 2238 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2239"><span class="lineNum"> 2239 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2240"><span class="lineNum"> 2240 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2241"><span class="lineNum"> 2241 </span> : : {</a>
+<a name="2242"><span class="lineNum"> 2242 </span> : : .type = scenario_cmd,</a>
+<a name="2243"><span class="lineNum"> 2243 </span> : : .c = {</a>
+<a name="2244"><span class="lineNum"> 2244 </span> : : .req = {</a>
+<a name="2245"><span class="lineNum"> 2245 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="2246"><span class="lineNum"> 2246 </span> : : .seq = 4,</a>
+<a name="2247"><span class="lineNum"> 2247 </span> : : .args = {</a>
+<a name="2248"><span class="lineNum"> 2248 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2249"><span class="lineNum"> 2249 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2250"><span class="lineNum"> 2250 </span> : : },</a>
+<a name="2251"><span class="lineNum"> 2251 </span> : : },</a>
+<a name="2252"><span class="lineNum"> 2252 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2253"><span class="lineNum"> 2253 </span> : : .resp_size = 7,</a>
+<a name="2254"><span class="lineNum"> 2254 </span> : : .resp = {</a>
+<a name="2255"><span class="lineNum"> 2255 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="2256"><span class="lineNum"> 2256 </span> : : .seq = 4,</a>
+<a name="2257"><span class="lineNum"> 2257 </span> : : },</a>
+<a name="2258"><span class="lineNum"> 2258 </span> : : },</a>
+<a name="2259"><span class="lineNum"> 2259 </span> : : },</a>
+<a name="2260"><span class="lineNum"> 2260 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="2261"><span class="lineNum"> 2261 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2262"><span class="lineNum"> 2262 </span> : : };</a>
+<a name="2263"><span class="lineNum"> 2263 </span> : : </a>
+<a name="2264"><span class="lineNum"> 2264 </span> :<span class="lineCov"> 1 : static void test_hiomap_create_read_window_malformed_small(void)</span></a>
+<a name="2265"><span class="lineNum"> 2265 </span> : : {</a>
+<a name="2266"><span class="lineNum"> 2266 </span> : : struct blocklevel_device *bl;</a>
+<a name="2267"><span class="lineNum"> 2267 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2268"><span class="lineNum"> 2268 </span> : : size_t len;</a>
+<a name="2269"><span class="lineNum"> 2269 </span> : : void *buf;</a>
+<a name="2270"><span class="lineNum"> 2270 </span> : : </a>
+<a name="2271"><span class="lineNum"> 2271 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_create_read_window_malformed_small);</span></a>
+<a name="2272"><span class="lineNum"> 2272 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2273"><span class="lineNum"> 2273 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2274"><span class="lineNum"> 2274 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2275"><span class="lineNum"> 2275 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2276"><span class="lineNum"> 2276 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2277"><span class="lineNum"> 2277 </span> :<span class="lineCov"> 1 : assert(bl-&gt;read(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2278"><span class="lineNum"> 2278 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2279"><span class="lineNum"> 2279 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2280"><span class="lineNum"> 2280 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2281"><span class="lineNum"> 2281 </span> : : </a>
+<a name="2282"><span class="lineNum"> 2282 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2283"><span class="lineNum"> 2283 </span> : : </a>
+<a name="2284"><span class="lineNum"> 2284 </span> : : static const struct scenario_event</a>
+<a name="2285"><span class="lineNum"> 2285 </span> : : scenario_hiomap_create_read_window_malformed_large[] = {</a>
+<a name="2286"><span class="lineNum"> 2286 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2287"><span class="lineNum"> 2287 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2288"><span class="lineNum"> 2288 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2289"><span class="lineNum"> 2289 </span> : : {</a>
+<a name="2290"><span class="lineNum"> 2290 </span> : : .type = scenario_cmd,</a>
+<a name="2291"><span class="lineNum"> 2291 </span> : : .c = {</a>
+<a name="2292"><span class="lineNum"> 2292 </span> : : .req = {</a>
+<a name="2293"><span class="lineNum"> 2293 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="2294"><span class="lineNum"> 2294 </span> : : .seq = 4,</a>
+<a name="2295"><span class="lineNum"> 2295 </span> : : .args = {</a>
+<a name="2296"><span class="lineNum"> 2296 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2297"><span class="lineNum"> 2297 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2298"><span class="lineNum"> 2298 </span> : : },</a>
+<a name="2299"><span class="lineNum"> 2299 </span> : : },</a>
+<a name="2300"><span class="lineNum"> 2300 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2301"><span class="lineNum"> 2301 </span> : : .resp_size = 9,</a>
+<a name="2302"><span class="lineNum"> 2302 </span> : : .resp = {</a>
+<a name="2303"><span class="lineNum"> 2303 </span> : : .cmd = HIOMAP_C_CREATE_READ_WINDOW,</a>
+<a name="2304"><span class="lineNum"> 2304 </span> : : .seq = 4,</a>
+<a name="2305"><span class="lineNum"> 2305 </span> : : },</a>
+<a name="2306"><span class="lineNum"> 2306 </span> : : },</a>
+<a name="2307"><span class="lineNum"> 2307 </span> : : },</a>
+<a name="2308"><span class="lineNum"> 2308 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="2309"><span class="lineNum"> 2309 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2310"><span class="lineNum"> 2310 </span> : : };</a>
+<a name="2311"><span class="lineNum"> 2311 </span> : : </a>
+<a name="2312"><span class="lineNum"> 2312 </span> :<span class="lineCov"> 1 : static void test_hiomap_create_read_window_malformed_large(void)</span></a>
+<a name="2313"><span class="lineNum"> 2313 </span> : : {</a>
+<a name="2314"><span class="lineNum"> 2314 </span> : : struct blocklevel_device *bl;</a>
+<a name="2315"><span class="lineNum"> 2315 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2316"><span class="lineNum"> 2316 </span> : : size_t len;</a>
+<a name="2317"><span class="lineNum"> 2317 </span> : : void *buf;</a>
+<a name="2318"><span class="lineNum"> 2318 </span> : : </a>
+<a name="2319"><span class="lineNum"> 2319 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_create_read_window_malformed_large);</span></a>
+<a name="2320"><span class="lineNum"> 2320 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2321"><span class="lineNum"> 2321 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2322"><span class="lineNum"> 2322 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2323"><span class="lineNum"> 2323 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2324"><span class="lineNum"> 2324 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2325"><span class="lineNum"> 2325 </span> :<span class="lineCov"> 1 : assert(bl-&gt;read(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2326"><span class="lineNum"> 2326 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2327"><span class="lineNum"> 2327 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2328"><span class="lineNum"> 2328 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2329"><span class="lineNum"> 2329 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2330"><span class="lineNum"> 2330 </span> : : </a>
+<a name="2331"><span class="lineNum"> 2331 </span> : : static const struct scenario_event</a>
+<a name="2332"><span class="lineNum"> 2332 </span> : : scenario_hiomap_create_write_window_malformed_small[] = {</a>
+<a name="2333"><span class="lineNum"> 2333 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2334"><span class="lineNum"> 2334 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2335"><span class="lineNum"> 2335 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2336"><span class="lineNum"> 2336 </span> : : {</a>
+<a name="2337"><span class="lineNum"> 2337 </span> : : .type = scenario_cmd,</a>
+<a name="2338"><span class="lineNum"> 2338 </span> : : .c = {</a>
+<a name="2339"><span class="lineNum"> 2339 </span> : : .req = {</a>
+<a name="2340"><span class="lineNum"> 2340 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="2341"><span class="lineNum"> 2341 </span> : : .seq = 4,</a>
+<a name="2342"><span class="lineNum"> 2342 </span> : : .args = {</a>
+<a name="2343"><span class="lineNum"> 2343 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2344"><span class="lineNum"> 2344 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2345"><span class="lineNum"> 2345 </span> : : },</a>
+<a name="2346"><span class="lineNum"> 2346 </span> : : },</a>
+<a name="2347"><span class="lineNum"> 2347 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2348"><span class="lineNum"> 2348 </span> : : .resp_size = 7,</a>
+<a name="2349"><span class="lineNum"> 2349 </span> : : .resp = {</a>
+<a name="2350"><span class="lineNum"> 2350 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="2351"><span class="lineNum"> 2351 </span> : : .seq = 4,</a>
+<a name="2352"><span class="lineNum"> 2352 </span> : : },</a>
+<a name="2353"><span class="lineNum"> 2353 </span> : : },</a>
+<a name="2354"><span class="lineNum"> 2354 </span> : : },</a>
+<a name="2355"><span class="lineNum"> 2355 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="2356"><span class="lineNum"> 2356 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2357"><span class="lineNum"> 2357 </span> : : };</a>
+<a name="2358"><span class="lineNum"> 2358 </span> : : </a>
+<a name="2359"><span class="lineNum"> 2359 </span> :<span class="lineCov"> 1 : static void test_hiomap_create_write_window_malformed_small(void)</span></a>
+<a name="2360"><span class="lineNum"> 2360 </span> : : {</a>
+<a name="2361"><span class="lineNum"> 2361 </span> : : struct blocklevel_device *bl;</a>
+<a name="2362"><span class="lineNum"> 2362 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2363"><span class="lineNum"> 2363 </span> : : size_t len;</a>
+<a name="2364"><span class="lineNum"> 2364 </span> : : void *buf;</a>
+<a name="2365"><span class="lineNum"> 2365 </span> : : </a>
+<a name="2366"><span class="lineNum"> 2366 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_create_write_window_malformed_small);</span></a>
+<a name="2367"><span class="lineNum"> 2367 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2368"><span class="lineNum"> 2368 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2369"><span class="lineNum"> 2369 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2370"><span class="lineNum"> 2370 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2371"><span class="lineNum"> 2371 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2372"><span class="lineNum"> 2372 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2373"><span class="lineNum"> 2373 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2374"><span class="lineNum"> 2374 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2375"><span class="lineNum"> 2375 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2376"><span class="lineNum"> 2376 </span> : : </a>
+<a name="2377"><span class="lineNum"> 2377 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2378"><span class="lineNum"> 2378 </span> : : </a>
+<a name="2379"><span class="lineNum"> 2379 </span> : : static const struct scenario_event</a>
+<a name="2380"><span class="lineNum"> 2380 </span> : : scenario_hiomap_create_write_window_malformed_large[] = {</a>
+<a name="2381"><span class="lineNum"> 2381 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2382"><span class="lineNum"> 2382 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2383"><span class="lineNum"> 2383 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2384"><span class="lineNum"> 2384 </span> : : {</a>
+<a name="2385"><span class="lineNum"> 2385 </span> : : .type = scenario_cmd,</a>
+<a name="2386"><span class="lineNum"> 2386 </span> : : .c = {</a>
+<a name="2387"><span class="lineNum"> 2387 </span> : : .req = {</a>
+<a name="2388"><span class="lineNum"> 2388 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="2389"><span class="lineNum"> 2389 </span> : : .seq = 4,</a>
+<a name="2390"><span class="lineNum"> 2390 </span> : : .args = {</a>
+<a name="2391"><span class="lineNum"> 2391 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2392"><span class="lineNum"> 2392 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2393"><span class="lineNum"> 2393 </span> : : },</a>
+<a name="2394"><span class="lineNum"> 2394 </span> : : },</a>
+<a name="2395"><span class="lineNum"> 2395 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2396"><span class="lineNum"> 2396 </span> : : .resp_size = 9,</a>
+<a name="2397"><span class="lineNum"> 2397 </span> : : .resp = {</a>
+<a name="2398"><span class="lineNum"> 2398 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="2399"><span class="lineNum"> 2399 </span> : : .seq = 4,</a>
+<a name="2400"><span class="lineNum"> 2400 </span> : : },</a>
+<a name="2401"><span class="lineNum"> 2401 </span> : : },</a>
+<a name="2402"><span class="lineNum"> 2402 </span> : : },</a>
+<a name="2403"><span class="lineNum"> 2403 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_5, },</a>
+<a name="2404"><span class="lineNum"> 2404 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2405"><span class="lineNum"> 2405 </span> : : };</a>
+<a name="2406"><span class="lineNum"> 2406 </span> : : </a>
+<a name="2407"><span class="lineNum"> 2407 </span> :<span class="lineCov"> 1 : static void test_hiomap_create_write_window_malformed_large(void)</span></a>
+<a name="2408"><span class="lineNum"> 2408 </span> : : {</a>
+<a name="2409"><span class="lineNum"> 2409 </span> : : struct blocklevel_device *bl;</a>
+<a name="2410"><span class="lineNum"> 2410 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2411"><span class="lineNum"> 2411 </span> : : size_t len;</a>
+<a name="2412"><span class="lineNum"> 2412 </span> : : void *buf;</a>
+<a name="2413"><span class="lineNum"> 2413 </span> : : </a>
+<a name="2414"><span class="lineNum"> 2414 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_create_write_window_malformed_large);</span></a>
+<a name="2415"><span class="lineNum"> 2415 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2416"><span class="lineNum"> 2416 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2417"><span class="lineNum"> 2417 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2418"><span class="lineNum"> 2418 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2419"><span class="lineNum"> 2419 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2420"><span class="lineNum"> 2420 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2421"><span class="lineNum"> 2421 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2422"><span class="lineNum"> 2422 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2423"><span class="lineNum"> 2423 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2424"><span class="lineNum"> 2424 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2425"><span class="lineNum"> 2425 </span> : : </a>
+<a name="2426"><span class="lineNum"> 2426 </span> : : static const struct scenario_event</a>
+<a name="2427"><span class="lineNum"> 2427 </span> : : scenario_hiomap_mark_dirty_malformed_small[] = {</a>
+<a name="2428"><span class="lineNum"> 2428 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2429"><span class="lineNum"> 2429 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2430"><span class="lineNum"> 2430 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2431"><span class="lineNum"> 2431 </span> : : {</a>
+<a name="2432"><span class="lineNum"> 2432 </span> : : .type = scenario_event_p,</a>
+<a name="2433"><span class="lineNum"> 2433 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2434"><span class="lineNum"> 2434 </span> : : },</a>
+<a name="2435"><span class="lineNum"> 2435 </span> : : {</a>
+<a name="2436"><span class="lineNum"> 2436 </span> : : .type = scenario_cmd,</a>
+<a name="2437"><span class="lineNum"> 2437 </span> : : .c = {</a>
+<a name="2438"><span class="lineNum"> 2438 </span> : : .req = {</a>
+<a name="2439"><span class="lineNum"> 2439 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="2440"><span class="lineNum"> 2440 </span> : : .seq = 5,</a>
+<a name="2441"><span class="lineNum"> 2441 </span> : : .args = {</a>
+<a name="2442"><span class="lineNum"> 2442 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2443"><span class="lineNum"> 2443 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2444"><span class="lineNum"> 2444 </span> : : },</a>
+<a name="2445"><span class="lineNum"> 2445 </span> : : },</a>
+<a name="2446"><span class="lineNum"> 2446 </span> : : .resp_size = 1,</a>
+<a name="2447"><span class="lineNum"> 2447 </span> : : .resp = {</a>
+<a name="2448"><span class="lineNum"> 2448 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="2449"><span class="lineNum"> 2449 </span> : : .seq = 5,</a>
+<a name="2450"><span class="lineNum"> 2450 </span> : : },</a>
+<a name="2451"><span class="lineNum"> 2451 </span> : : },</a>
+<a name="2452"><span class="lineNum"> 2452 </span> : : },</a>
+<a name="2453"><span class="lineNum"> 2453 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="2454"><span class="lineNum"> 2454 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2455"><span class="lineNum"> 2455 </span> : : };</a>
+<a name="2456"><span class="lineNum"> 2456 </span> : : </a>
+<a name="2457"><span class="lineNum"> 2457 </span> :<span class="lineCov"> 1 : static void test_hiomap_mark_dirty_malformed_small(void)</span></a>
+<a name="2458"><span class="lineNum"> 2458 </span> : : {</a>
+<a name="2459"><span class="lineNum"> 2459 </span> : : struct blocklevel_device *bl;</a>
+<a name="2460"><span class="lineNum"> 2460 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2461"><span class="lineNum"> 2461 </span> : : size_t len;</a>
+<a name="2462"><span class="lineNum"> 2462 </span> : : void *buf;</a>
+<a name="2463"><span class="lineNum"> 2463 </span> : : </a>
+<a name="2464"><span class="lineNum"> 2464 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_mark_dirty_malformed_small);</span></a>
+<a name="2465"><span class="lineNum"> 2465 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2466"><span class="lineNum"> 2466 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2467"><span class="lineNum"> 2467 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2468"><span class="lineNum"> 2468 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2469"><span class="lineNum"> 2469 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2470"><span class="lineNum"> 2470 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2471"><span class="lineNum"> 2471 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2472"><span class="lineNum"> 2472 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2473"><span class="lineNum"> 2473 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2474"><span class="lineNum"> 2474 </span> : : </a>
+<a name="2475"><span class="lineNum"> 2475 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2476"><span class="lineNum"> 2476 </span> : : </a>
+<a name="2477"><span class="lineNum"> 2477 </span> : : static const struct scenario_event</a>
+<a name="2478"><span class="lineNum"> 2478 </span> : : scenario_hiomap_mark_dirty_malformed_large[] = {</a>
+<a name="2479"><span class="lineNum"> 2479 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2480"><span class="lineNum"> 2480 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2481"><span class="lineNum"> 2481 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2482"><span class="lineNum"> 2482 </span> : : {</a>
+<a name="2483"><span class="lineNum"> 2483 </span> : : .type = scenario_event_p,</a>
+<a name="2484"><span class="lineNum"> 2484 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2485"><span class="lineNum"> 2485 </span> : : },</a>
+<a name="2486"><span class="lineNum"> 2486 </span> : : {</a>
+<a name="2487"><span class="lineNum"> 2487 </span> : : .type = scenario_cmd,</a>
+<a name="2488"><span class="lineNum"> 2488 </span> : : .c = {</a>
+<a name="2489"><span class="lineNum"> 2489 </span> : : .req = {</a>
+<a name="2490"><span class="lineNum"> 2490 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="2491"><span class="lineNum"> 2491 </span> : : .seq = 5,</a>
+<a name="2492"><span class="lineNum"> 2492 </span> : : .args = {</a>
+<a name="2493"><span class="lineNum"> 2493 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2494"><span class="lineNum"> 2494 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2495"><span class="lineNum"> 2495 </span> : : },</a>
+<a name="2496"><span class="lineNum"> 2496 </span> : : },</a>
+<a name="2497"><span class="lineNum"> 2497 </span> : : .resp_size = 3,</a>
+<a name="2498"><span class="lineNum"> 2498 </span> : : .resp = {</a>
+<a name="2499"><span class="lineNum"> 2499 </span> : : .cmd = HIOMAP_C_MARK_DIRTY,</a>
+<a name="2500"><span class="lineNum"> 2500 </span> : : .seq = 5,</a>
+<a name="2501"><span class="lineNum"> 2501 </span> : : },</a>
+<a name="2502"><span class="lineNum"> 2502 </span> : : },</a>
+<a name="2503"><span class="lineNum"> 2503 </span> : : },</a>
+<a name="2504"><span class="lineNum"> 2504 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="2505"><span class="lineNum"> 2505 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2506"><span class="lineNum"> 2506 </span> : : };</a>
+<a name="2507"><span class="lineNum"> 2507 </span> : : </a>
+<a name="2508"><span class="lineNum"> 2508 </span> :<span class="lineCov"> 1 : static void test_hiomap_mark_dirty_malformed_large(void)</span></a>
+<a name="2509"><span class="lineNum"> 2509 </span> : : {</a>
+<a name="2510"><span class="lineNum"> 2510 </span> : : struct blocklevel_device *bl;</a>
+<a name="2511"><span class="lineNum"> 2511 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2512"><span class="lineNum"> 2512 </span> : : size_t len;</a>
+<a name="2513"><span class="lineNum"> 2513 </span> : : void *buf;</a>
+<a name="2514"><span class="lineNum"> 2514 </span> : : </a>
+<a name="2515"><span class="lineNum"> 2515 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_mark_dirty_malformed_large);</span></a>
+<a name="2516"><span class="lineNum"> 2516 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2517"><span class="lineNum"> 2517 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2518"><span class="lineNum"> 2518 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2519"><span class="lineNum"> 2519 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2520"><span class="lineNum"> 2520 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2521"><span class="lineNum"> 2521 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2522"><span class="lineNum"> 2522 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2523"><span class="lineNum"> 2523 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2524"><span class="lineNum"> 2524 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2525"><span class="lineNum"> 2525 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2526"><span class="lineNum"> 2526 </span> : : </a>
+<a name="2527"><span class="lineNum"> 2527 </span> : : static const struct scenario_event</a>
+<a name="2528"><span class="lineNum"> 2528 </span> : : scenario_hiomap_flush_malformed_small[] = {</a>
+<a name="2529"><span class="lineNum"> 2529 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2530"><span class="lineNum"> 2530 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2531"><span class="lineNum"> 2531 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2532"><span class="lineNum"> 2532 </span> : : {</a>
+<a name="2533"><span class="lineNum"> 2533 </span> : : .type = scenario_event_p,</a>
+<a name="2534"><span class="lineNum"> 2534 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2535"><span class="lineNum"> 2535 </span> : : },</a>
+<a name="2536"><span class="lineNum"> 2536 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_mark_dirty_qs0l1_call, },</a>
+<a name="2537"><span class="lineNum"> 2537 </span> : : {</a>
+<a name="2538"><span class="lineNum"> 2538 </span> : : .type = scenario_cmd,</a>
+<a name="2539"><span class="lineNum"> 2539 </span> : : .c = {</a>
+<a name="2540"><span class="lineNum"> 2540 </span> : : .req = {</a>
+<a name="2541"><span class="lineNum"> 2541 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="2542"><span class="lineNum"> 2542 </span> : : .seq = 6,</a>
+<a name="2543"><span class="lineNum"> 2543 </span> : : },</a>
+<a name="2544"><span class="lineNum"> 2544 </span> : : .resp_size = 1,</a>
+<a name="2545"><span class="lineNum"> 2545 </span> : : .resp = {</a>
+<a name="2546"><span class="lineNum"> 2546 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="2547"><span class="lineNum"> 2547 </span> : : .seq = 6,</a>
+<a name="2548"><span class="lineNum"> 2548 </span> : : },</a>
+<a name="2549"><span class="lineNum"> 2549 </span> : : },</a>
+<a name="2550"><span class="lineNum"> 2550 </span> : : },</a>
+<a name="2551"><span class="lineNum"> 2551 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_7, },</a>
+<a name="2552"><span class="lineNum"> 2552 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2553"><span class="lineNum"> 2553 </span> : : };</a>
+<a name="2554"><span class="lineNum"> 2554 </span> : : </a>
+<a name="2555"><span class="lineNum"> 2555 </span> :<span class="lineCov"> 1 : static void test_hiomap_flush_malformed_small(void)</span></a>
+<a name="2556"><span class="lineNum"> 2556 </span> : : {</a>
+<a name="2557"><span class="lineNum"> 2557 </span> : : struct blocklevel_device *bl;</a>
+<a name="2558"><span class="lineNum"> 2558 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2559"><span class="lineNum"> 2559 </span> : : size_t len;</a>
+<a name="2560"><span class="lineNum"> 2560 </span> : : void *buf;</a>
+<a name="2561"><span class="lineNum"> 2561 </span> : : </a>
+<a name="2562"><span class="lineNum"> 2562 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_flush_malformed_small);</span></a>
+<a name="2563"><span class="lineNum"> 2563 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2564"><span class="lineNum"> 2564 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2565"><span class="lineNum"> 2565 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2566"><span class="lineNum"> 2566 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2567"><span class="lineNum"> 2567 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2568"><span class="lineNum"> 2568 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2569"><span class="lineNum"> 2569 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2570"><span class="lineNum"> 2570 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2571"><span class="lineNum"> 2571 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2572"><span class="lineNum"> 2572 </span> : : </a>
+<a name="2573"><span class="lineNum"> 2573 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2574"><span class="lineNum"> 2574 </span> : : </a>
+<a name="2575"><span class="lineNum"> 2575 </span> : : static const struct scenario_event</a>
+<a name="2576"><span class="lineNum"> 2576 </span> : : scenario_hiomap_flush_malformed_large[] = {</a>
+<a name="2577"><span class="lineNum"> 2577 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2578"><span class="lineNum"> 2578 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2579"><span class="lineNum"> 2579 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2580"><span class="lineNum"> 2580 </span> : : {</a>
+<a name="2581"><span class="lineNum"> 2581 </span> : : .type = scenario_event_p,</a>
+<a name="2582"><span class="lineNum"> 2582 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2583"><span class="lineNum"> 2583 </span> : : },</a>
+<a name="2584"><span class="lineNum"> 2584 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_mark_dirty_qs0l1_call, },</a>
+<a name="2585"><span class="lineNum"> 2585 </span> : : {</a>
+<a name="2586"><span class="lineNum"> 2586 </span> : : .type = scenario_cmd,</a>
+<a name="2587"><span class="lineNum"> 2587 </span> : : .c = {</a>
+<a name="2588"><span class="lineNum"> 2588 </span> : : .req = {</a>
+<a name="2589"><span class="lineNum"> 2589 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="2590"><span class="lineNum"> 2590 </span> : : .seq = 6,</a>
+<a name="2591"><span class="lineNum"> 2591 </span> : : },</a>
+<a name="2592"><span class="lineNum"> 2592 </span> : : .resp_size = 3,</a>
+<a name="2593"><span class="lineNum"> 2593 </span> : : .resp = {</a>
+<a name="2594"><span class="lineNum"> 2594 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="2595"><span class="lineNum"> 2595 </span> : : .seq = 6,</a>
+<a name="2596"><span class="lineNum"> 2596 </span> : : },</a>
+<a name="2597"><span class="lineNum"> 2597 </span> : : },</a>
+<a name="2598"><span class="lineNum"> 2598 </span> : : },</a>
+<a name="2599"><span class="lineNum"> 2599 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_7, },</a>
+<a name="2600"><span class="lineNum"> 2600 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2601"><span class="lineNum"> 2601 </span> : : };</a>
+<a name="2602"><span class="lineNum"> 2602 </span> : : </a>
+<a name="2603"><span class="lineNum"> 2603 </span> :<span class="lineCov"> 1 : static void test_hiomap_flush_malformed_large(void)</span></a>
+<a name="2604"><span class="lineNum"> 2604 </span> : : {</a>
+<a name="2605"><span class="lineNum"> 2605 </span> : : struct blocklevel_device *bl;</a>
+<a name="2606"><span class="lineNum"> 2606 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2607"><span class="lineNum"> 2607 </span> : : size_t len;</a>
+<a name="2608"><span class="lineNum"> 2608 </span> : : void *buf;</a>
+<a name="2609"><span class="lineNum"> 2609 </span> : : </a>
+<a name="2610"><span class="lineNum"> 2610 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_flush_malformed_large);</span></a>
+<a name="2611"><span class="lineNum"> 2611 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2612"><span class="lineNum"> 2612 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2613"><span class="lineNum"> 2613 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2614"><span class="lineNum"> 2614 </span> :<span class="lineCov"> 1 : buf = calloc(1, len);</span></a>
+<a name="2615"><span class="lineNum"> 2615 </span> :<span class="lineCov"> 1 : assert(buf);</span></a>
+<a name="2616"><span class="lineNum"> 2616 </span> :<span class="lineCov"> 1 : assert(bl-&gt;write(bl, 0, buf, len) &gt; 0);</span></a>
+<a name="2617"><span class="lineNum"> 2617 </span> :<span class="lineCov"> 1 : free(buf);</span></a>
+<a name="2618"><span class="lineNum"> 2618 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2619"><span class="lineNum"> 2619 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2620"><span class="lineNum"> 2620 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2621"><span class="lineNum"> 2621 </span> : : </a>
+<a name="2622"><span class="lineNum"> 2622 </span> : : static const struct scenario_event</a>
+<a name="2623"><span class="lineNum"> 2623 </span> : : scenario_hiomap_erase_malformed_small[] = {</a>
+<a name="2624"><span class="lineNum"> 2624 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2625"><span class="lineNum"> 2625 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2626"><span class="lineNum"> 2626 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2627"><span class="lineNum"> 2627 </span> : : {</a>
+<a name="2628"><span class="lineNum"> 2628 </span> : : .type = scenario_event_p,</a>
+<a name="2629"><span class="lineNum"> 2629 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2630"><span class="lineNum"> 2630 </span> : : },</a>
+<a name="2631"><span class="lineNum"> 2631 </span> : : {</a>
+<a name="2632"><span class="lineNum"> 2632 </span> : : .type = scenario_cmd,</a>
+<a name="2633"><span class="lineNum"> 2633 </span> : : .c = {</a>
+<a name="2634"><span class="lineNum"> 2634 </span> : : .req = {</a>
+<a name="2635"><span class="lineNum"> 2635 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="2636"><span class="lineNum"> 2636 </span> : : .seq = 5,</a>
+<a name="2637"><span class="lineNum"> 2637 </span> : : .args = {</a>
+<a name="2638"><span class="lineNum"> 2638 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2639"><span class="lineNum"> 2639 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2640"><span class="lineNum"> 2640 </span> : : },</a>
+<a name="2641"><span class="lineNum"> 2641 </span> : : },</a>
+<a name="2642"><span class="lineNum"> 2642 </span> : : .resp_size = 1,</a>
+<a name="2643"><span class="lineNum"> 2643 </span> : : .resp = {</a>
+<a name="2644"><span class="lineNum"> 2644 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="2645"><span class="lineNum"> 2645 </span> : : .seq = 5,</a>
+<a name="2646"><span class="lineNum"> 2646 </span> : : },</a>
+<a name="2647"><span class="lineNum"> 2647 </span> : : },</a>
+<a name="2648"><span class="lineNum"> 2648 </span> : : },</a>
+<a name="2649"><span class="lineNum"> 2649 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="2650"><span class="lineNum"> 2650 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2651"><span class="lineNum"> 2651 </span> : : };</a>
+<a name="2652"><span class="lineNum"> 2652 </span> : : </a>
+<a name="2653"><span class="lineNum"> 2653 </span> :<span class="lineCov"> 1 : static void test_hiomap_erase_malformed_small(void)</span></a>
+<a name="2654"><span class="lineNum"> 2654 </span> : : {</a>
+<a name="2655"><span class="lineNum"> 2655 </span> : : struct blocklevel_device *bl;</a>
+<a name="2656"><span class="lineNum"> 2656 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2657"><span class="lineNum"> 2657 </span> : : size_t len;</a>
+<a name="2658"><span class="lineNum"> 2658 </span> : : </a>
+<a name="2659"><span class="lineNum"> 2659 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_erase_malformed_small);</span></a>
+<a name="2660"><span class="lineNum"> 2660 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2661"><span class="lineNum"> 2661 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2662"><span class="lineNum"> 2662 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2663"><span class="lineNum"> 2663 </span> :<span class="lineCov"> 1 : assert(bl-&gt;erase(bl, 0, len) &gt; 0);</span></a>
+<a name="2664"><span class="lineNum"> 2664 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2665"><span class="lineNum"> 2665 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2666"><span class="lineNum"> 2666 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2667"><span class="lineNum"> 2667 </span> : : </a>
+<a name="2668"><span class="lineNum"> 2668 </span> : : static const struct scenario_event</a>
+<a name="2669"><span class="lineNum"> 2669 </span> : : scenario_hiomap_erase_malformed_large[] = {</a>
+<a name="2670"><span class="lineNum"> 2670 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2671"><span class="lineNum"> 2671 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2672"><span class="lineNum"> 2672 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2673"><span class="lineNum"> 2673 </span> : : {</a>
+<a name="2674"><span class="lineNum"> 2674 </span> : : .type = scenario_event_p,</a>
+<a name="2675"><span class="lineNum"> 2675 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2676"><span class="lineNum"> 2676 </span> : : },</a>
+<a name="2677"><span class="lineNum"> 2677 </span> : : {</a>
+<a name="2678"><span class="lineNum"> 2678 </span> : : .type = scenario_cmd,</a>
+<a name="2679"><span class="lineNum"> 2679 </span> : : .c = {</a>
+<a name="2680"><span class="lineNum"> 2680 </span> : : .req = {</a>
+<a name="2681"><span class="lineNum"> 2681 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="2682"><span class="lineNum"> 2682 </span> : : .seq = 5,</a>
+<a name="2683"><span class="lineNum"> 2683 </span> : : .args = {</a>
+<a name="2684"><span class="lineNum"> 2684 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2685"><span class="lineNum"> 2685 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2686"><span class="lineNum"> 2686 </span> : : },</a>
+<a name="2687"><span class="lineNum"> 2687 </span> : : },</a>
+<a name="2688"><span class="lineNum"> 2688 </span> : : .resp_size = 3,</a>
+<a name="2689"><span class="lineNum"> 2689 </span> : : .resp = {</a>
+<a name="2690"><span class="lineNum"> 2690 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="2691"><span class="lineNum"> 2691 </span> : : .seq = 5,</a>
+<a name="2692"><span class="lineNum"> 2692 </span> : : },</a>
+<a name="2693"><span class="lineNum"> 2693 </span> : : },</a>
+<a name="2694"><span class="lineNum"> 2694 </span> : : },</a>
+<a name="2695"><span class="lineNum"> 2695 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_reset_call_seq_6, },</a>
+<a name="2696"><span class="lineNum"> 2696 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2697"><span class="lineNum"> 2697 </span> : : };</a>
+<a name="2698"><span class="lineNum"> 2698 </span> : : </a>
+<a name="2699"><span class="lineNum"> 2699 </span> :<span class="lineCov"> 1 : static void test_hiomap_erase_malformed_large(void)</span></a>
+<a name="2700"><span class="lineNum"> 2700 </span> : : {</a>
+<a name="2701"><span class="lineNum"> 2701 </span> : : struct blocklevel_device *bl;</a>
+<a name="2702"><span class="lineNum"> 2702 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2703"><span class="lineNum"> 2703 </span> : : size_t len;</a>
+<a name="2704"><span class="lineNum"> 2704 </span> : : </a>
+<a name="2705"><span class="lineNum"> 2705 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_erase_malformed_large);</span></a>
+<a name="2706"><span class="lineNum"> 2706 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2707"><span class="lineNum"> 2707 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2708"><span class="lineNum"> 2708 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2709"><span class="lineNum"> 2709 </span> :<span class="lineCov"> 1 : assert(bl-&gt;erase(bl, 0, len) &gt; 0);</span></a>
+<a name="2710"><span class="lineNum"> 2710 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2711"><span class="lineNum"> 2711 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2712"><span class="lineNum"> 2712 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2713"><span class="lineNum"> 2713 </span> : : </a>
+<a name="2714"><span class="lineNum"> 2714 </span> : : /* Common recovery calls */</a>
+<a name="2715"><span class="lineNum"> 2715 </span> : : </a>
+<a name="2716"><span class="lineNum"> 2716 </span> : : static const struct scenario_event hiomap_recovery_ack_call = {</a>
+<a name="2717"><span class="lineNum"> 2717 </span> : : .type = scenario_cmd,</a>
+<a name="2718"><span class="lineNum"> 2718 </span> : : .c = {</a>
+<a name="2719"><span class="lineNum"> 2719 </span> : : .req = {</a>
+<a name="2720"><span class="lineNum"> 2720 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2721"><span class="lineNum"> 2721 </span> : : .seq = 7,</a>
+<a name="2722"><span class="lineNum"> 2722 </span> : : .args = {</a>
+<a name="2723"><span class="lineNum"> 2723 </span> : : [0] = HIOMAP_E_PROTOCOL_RESET,</a>
+<a name="2724"><span class="lineNum"> 2724 </span> : : },</a>
+<a name="2725"><span class="lineNum"> 2725 </span> : : },</a>
+<a name="2726"><span class="lineNum"> 2726 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2727"><span class="lineNum"> 2727 </span> : : .resp = {</a>
+<a name="2728"><span class="lineNum"> 2728 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2729"><span class="lineNum"> 2729 </span> : : .seq = 7,</a>
+<a name="2730"><span class="lineNum"> 2730 </span> : : },</a>
+<a name="2731"><span class="lineNum"> 2731 </span> : : },</a>
+<a name="2732"><span class="lineNum"> 2732 </span> : : };</a>
+<a name="2733"><span class="lineNum"> 2733 </span> : : </a>
+<a name="2734"><span class="lineNum"> 2734 </span> : : static const struct scenario_event hiomap_recovery_get_info_call = {</a>
+<a name="2735"><span class="lineNum"> 2735 </span> : : .type = scenario_cmd,</a>
+<a name="2736"><span class="lineNum"> 2736 </span> : : .c = {</a>
+<a name="2737"><span class="lineNum"> 2737 </span> : : .req = {</a>
+<a name="2738"><span class="lineNum"> 2738 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2739"><span class="lineNum"> 2739 </span> : : .seq = 8,</a>
+<a name="2740"><span class="lineNum"> 2740 </span> : : .args = {</a>
+<a name="2741"><span class="lineNum"> 2741 </span> : : [0] = HIOMAP_V2,</a>
+<a name="2742"><span class="lineNum"> 2742 </span> : : },</a>
+<a name="2743"><span class="lineNum"> 2743 </span> : : },</a>
+<a name="2744"><span class="lineNum"> 2744 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2745"><span class="lineNum"> 2745 </span> : : .resp = {</a>
+<a name="2746"><span class="lineNum"> 2746 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2747"><span class="lineNum"> 2747 </span> : : .seq = 8,</a>
+<a name="2748"><span class="lineNum"> 2748 </span> : : .args = {</a>
+<a name="2749"><span class="lineNum"> 2749 </span> : : [0] = HIOMAP_V2,</a>
+<a name="2750"><span class="lineNum"> 2750 </span> : : [1] = 12,</a>
+<a name="2751"><span class="lineNum"> 2751 </span> : : [2] = 8, [3] = 0,</a>
+<a name="2752"><span class="lineNum"> 2752 </span> : : },</a>
+<a name="2753"><span class="lineNum"> 2753 </span> : : },</a>
+<a name="2754"><span class="lineNum"> 2754 </span> : : },</a>
+<a name="2755"><span class="lineNum"> 2755 </span> : : };</a>
+<a name="2756"><span class="lineNum"> 2756 </span> : : </a>
+<a name="2757"><span class="lineNum"> 2757 </span> : : static const struct scenario_event</a>
+<a name="2758"><span class="lineNum"> 2758 </span> : : scenario_hiomap_protocol_recovery_failure_ack[] = {</a>
+<a name="2759"><span class="lineNum"> 2759 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2760"><span class="lineNum"> 2760 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2761"><span class="lineNum"> 2761 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2762"><span class="lineNum"> 2762 </span> : : {</a>
+<a name="2763"><span class="lineNum"> 2763 </span> : : .type = scenario_event_p,</a>
+<a name="2764"><span class="lineNum"> 2764 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2765"><span class="lineNum"> 2765 </span> : : },</a>
+<a name="2766"><span class="lineNum"> 2766 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_erase_qs0l1_call, },</a>
+<a name="2767"><span class="lineNum"> 2767 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="2768"><span class="lineNum"> 2768 </span> : : { .type = scenario_delay },</a>
+<a name="2769"><span class="lineNum"> 2769 </span> : : {</a>
+<a name="2770"><span class="lineNum"> 2770 </span> : : .type = scenario_sel,</a>
+<a name="2771"><span class="lineNum"> 2771 </span> : : .s = {</a>
+<a name="2772"><span class="lineNum"> 2772 </span> : : .bmc_state = HIOMAP_E_DAEMON_READY |</a>
+<a name="2773"><span class="lineNum"> 2773 </span> : : HIOMAP_E_PROTOCOL_RESET</a>
+<a name="2774"><span class="lineNum"> 2774 </span> : : }</a>
+<a name="2775"><span class="lineNum"> 2775 </span> : : },</a>
+<a name="2776"><span class="lineNum"> 2776 </span> : : {</a>
+<a name="2777"><span class="lineNum"> 2777 </span> : : .type = scenario_cmd,</a>
+<a name="2778"><span class="lineNum"> 2778 </span> : : .c = {</a>
+<a name="2779"><span class="lineNum"> 2779 </span> : : .req = {</a>
+<a name="2780"><span class="lineNum"> 2780 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2781"><span class="lineNum"> 2781 </span> : : .seq = 7,</a>
+<a name="2782"><span class="lineNum"> 2782 </span> : : .args = {</a>
+<a name="2783"><span class="lineNum"> 2783 </span> : : [0] = HIOMAP_E_PROTOCOL_RESET,</a>
+<a name="2784"><span class="lineNum"> 2784 </span> : : },</a>
+<a name="2785"><span class="lineNum"> 2785 </span> : : },</a>
+<a name="2786"><span class="lineNum"> 2786 </span> : : .cc = IPMI_ERR_UNSPECIFIED,</a>
+<a name="2787"><span class="lineNum"> 2787 </span> : : },</a>
+<a name="2788"><span class="lineNum"> 2788 </span> : : },</a>
+<a name="2789"><span class="lineNum"> 2789 </span> : : {</a>
+<a name="2790"><span class="lineNum"> 2790 </span> : : .type = scenario_cmd,</a>
+<a name="2791"><span class="lineNum"> 2791 </span> : : .c = {</a>
+<a name="2792"><span class="lineNum"> 2792 </span> : : .req = {</a>
+<a name="2793"><span class="lineNum"> 2793 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2794"><span class="lineNum"> 2794 </span> : : .seq = 8,</a>
+<a name="2795"><span class="lineNum"> 2795 </span> : : .args = {</a>
+<a name="2796"><span class="lineNum"> 2796 </span> : : [0] = HIOMAP_E_PROTOCOL_RESET,</a>
+<a name="2797"><span class="lineNum"> 2797 </span> : : },</a>
+<a name="2798"><span class="lineNum"> 2798 </span> : : },</a>
+<a name="2799"><span class="lineNum"> 2799 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2800"><span class="lineNum"> 2800 </span> : : .resp = {</a>
+<a name="2801"><span class="lineNum"> 2801 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2802"><span class="lineNum"> 2802 </span> : : .seq = 8,</a>
+<a name="2803"><span class="lineNum"> 2803 </span> : : },</a>
+<a name="2804"><span class="lineNum"> 2804 </span> : : },</a>
+<a name="2805"><span class="lineNum"> 2805 </span> : : },</a>
+<a name="2806"><span class="lineNum"> 2806 </span> : : {</a>
+<a name="2807"><span class="lineNum"> 2807 </span> : : .type = scenario_cmd,</a>
+<a name="2808"><span class="lineNum"> 2808 </span> : : .c = {</a>
+<a name="2809"><span class="lineNum"> 2809 </span> : : .req = {</a>
+<a name="2810"><span class="lineNum"> 2810 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2811"><span class="lineNum"> 2811 </span> : : .seq = 9,</a>
+<a name="2812"><span class="lineNum"> 2812 </span> : : .args = {</a>
+<a name="2813"><span class="lineNum"> 2813 </span> : : [0] = HIOMAP_V2,</a>
+<a name="2814"><span class="lineNum"> 2814 </span> : : },</a>
+<a name="2815"><span class="lineNum"> 2815 </span> : : },</a>
+<a name="2816"><span class="lineNum"> 2816 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2817"><span class="lineNum"> 2817 </span> : : .resp = {</a>
+<a name="2818"><span class="lineNum"> 2818 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2819"><span class="lineNum"> 2819 </span> : : .seq = 9,</a>
+<a name="2820"><span class="lineNum"> 2820 </span> : : .args = {</a>
+<a name="2821"><span class="lineNum"> 2821 </span> : : [0] = HIOMAP_V2,</a>
+<a name="2822"><span class="lineNum"> 2822 </span> : : [1] = 12,</a>
+<a name="2823"><span class="lineNum"> 2823 </span> : : [2] = 8, [3] = 0,</a>
+<a name="2824"><span class="lineNum"> 2824 </span> : : },</a>
+<a name="2825"><span class="lineNum"> 2825 </span> : : },</a>
+<a name="2826"><span class="lineNum"> 2826 </span> : : },</a>
+<a name="2827"><span class="lineNum"> 2827 </span> : : },</a>
+<a name="2828"><span class="lineNum"> 2828 </span> : : {</a>
+<a name="2829"><span class="lineNum"> 2829 </span> : : .type = scenario_cmd,</a>
+<a name="2830"><span class="lineNum"> 2830 </span> : : .c = {</a>
+<a name="2831"><span class="lineNum"> 2831 </span> : : .req = {</a>
+<a name="2832"><span class="lineNum"> 2832 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="2833"><span class="lineNum"> 2833 </span> : : .seq = 10,</a>
+<a name="2834"><span class="lineNum"> 2834 </span> : : .args = {</a>
+<a name="2835"><span class="lineNum"> 2835 </span> : : },</a>
+<a name="2836"><span class="lineNum"> 2836 </span> : : },</a>
+<a name="2837"><span class="lineNum"> 2837 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2838"><span class="lineNum"> 2838 </span> : : .resp = {</a>
+<a name="2839"><span class="lineNum"> 2839 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="2840"><span class="lineNum"> 2840 </span> : : .seq = 10,</a>
+<a name="2841"><span class="lineNum"> 2841 </span> : : .args = {</a>
+<a name="2842"><span class="lineNum"> 2842 </span> : : [0] = 0x00, [1] = 0x20,</a>
+<a name="2843"><span class="lineNum"> 2843 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2844"><span class="lineNum"> 2844 </span> : : },</a>
+<a name="2845"><span class="lineNum"> 2845 </span> : : },</a>
+<a name="2846"><span class="lineNum"> 2846 </span> : : },</a>
+<a name="2847"><span class="lineNum"> 2847 </span> : : },</a>
+<a name="2848"><span class="lineNum"> 2848 </span> : : {</a>
+<a name="2849"><span class="lineNum"> 2849 </span> : : .type = scenario_cmd,</a>
+<a name="2850"><span class="lineNum"> 2850 </span> : : .c = {</a>
+<a name="2851"><span class="lineNum"> 2851 </span> : : .req = {</a>
+<a name="2852"><span class="lineNum"> 2852 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="2853"><span class="lineNum"> 2853 </span> : : .seq = 11,</a>
+<a name="2854"><span class="lineNum"> 2854 </span> : : .args = {</a>
+<a name="2855"><span class="lineNum"> 2855 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2856"><span class="lineNum"> 2856 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2857"><span class="lineNum"> 2857 </span> : : },</a>
+<a name="2858"><span class="lineNum"> 2858 </span> : : },</a>
+<a name="2859"><span class="lineNum"> 2859 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2860"><span class="lineNum"> 2860 </span> : : .resp = {</a>
+<a name="2861"><span class="lineNum"> 2861 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="2862"><span class="lineNum"> 2862 </span> : : .seq = 11,</a>
+<a name="2863"><span class="lineNum"> 2863 </span> : : .args = {</a>
+<a name="2864"><span class="lineNum"> 2864 </span> : : [0] = 0xff, [1] = 0x0f,</a>
+<a name="2865"><span class="lineNum"> 2865 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2866"><span class="lineNum"> 2866 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="2867"><span class="lineNum"> 2867 </span> : : },</a>
+<a name="2868"><span class="lineNum"> 2868 </span> : : },</a>
+<a name="2869"><span class="lineNum"> 2869 </span> : : },</a>
+<a name="2870"><span class="lineNum"> 2870 </span> : : },</a>
+<a name="2871"><span class="lineNum"> 2871 </span> : : {</a>
+<a name="2872"><span class="lineNum"> 2872 </span> : : .type = scenario_cmd,</a>
+<a name="2873"><span class="lineNum"> 2873 </span> : : .c = {</a>
+<a name="2874"><span class="lineNum"> 2874 </span> : : .req = {</a>
+<a name="2875"><span class="lineNum"> 2875 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="2876"><span class="lineNum"> 2876 </span> : : .seq = 12,</a>
+<a name="2877"><span class="lineNum"> 2877 </span> : : .args = {</a>
+<a name="2878"><span class="lineNum"> 2878 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="2879"><span class="lineNum"> 2879 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="2880"><span class="lineNum"> 2880 </span> : : },</a>
+<a name="2881"><span class="lineNum"> 2881 </span> : : },</a>
+<a name="2882"><span class="lineNum"> 2882 </span> : : .resp = {</a>
+<a name="2883"><span class="lineNum"> 2883 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="2884"><span class="lineNum"> 2884 </span> : : .seq = 12,</a>
+<a name="2885"><span class="lineNum"> 2885 </span> : : },</a>
+<a name="2886"><span class="lineNum"> 2886 </span> : : },</a>
+<a name="2887"><span class="lineNum"> 2887 </span> : : },</a>
+<a name="2888"><span class="lineNum"> 2888 </span> : : {</a>
+<a name="2889"><span class="lineNum"> 2889 </span> : : .type = scenario_cmd,</a>
+<a name="2890"><span class="lineNum"> 2890 </span> : : .c = {</a>
+<a name="2891"><span class="lineNum"> 2891 </span> : : .req = {</a>
+<a name="2892"><span class="lineNum"> 2892 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="2893"><span class="lineNum"> 2893 </span> : : .seq = 13,</a>
+<a name="2894"><span class="lineNum"> 2894 </span> : : },</a>
+<a name="2895"><span class="lineNum"> 2895 </span> : : .resp = {</a>
+<a name="2896"><span class="lineNum"> 2896 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="2897"><span class="lineNum"> 2897 </span> : : .seq = 13,</a>
+<a name="2898"><span class="lineNum"> 2898 </span> : : },</a>
+<a name="2899"><span class="lineNum"> 2899 </span> : : },</a>
+<a name="2900"><span class="lineNum"> 2900 </span> : : },</a>
+<a name="2901"><span class="lineNum"> 2901 </span> : : {</a>
+<a name="2902"><span class="lineNum"> 2902 </span> : : .type = scenario_cmd,</a>
+<a name="2903"><span class="lineNum"> 2903 </span> : : .c = {</a>
+<a name="2904"><span class="lineNum"> 2904 </span> : : .req = {</a>
+<a name="2905"><span class="lineNum"> 2905 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="2906"><span class="lineNum"> 2906 </span> : : .seq = 14,</a>
+<a name="2907"><span class="lineNum"> 2907 </span> : : },</a>
+<a name="2908"><span class="lineNum"> 2908 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2909"><span class="lineNum"> 2909 </span> : : .resp = {</a>
+<a name="2910"><span class="lineNum"> 2910 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="2911"><span class="lineNum"> 2911 </span> : : .seq = 14,</a>
+<a name="2912"><span class="lineNum"> 2912 </span> : : },</a>
+<a name="2913"><span class="lineNum"> 2913 </span> : : },</a>
+<a name="2914"><span class="lineNum"> 2914 </span> : : },</a>
+<a name="2915"><span class="lineNum"> 2915 </span> : : SCENARIO_SENTINEL,</a>
+<a name="2916"><span class="lineNum"> 2916 </span> : : };</a>
+<a name="2917"><span class="lineNum"> 2917 </span> : : </a>
+<a name="2918"><span class="lineNum"> 2918 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_recovery_failure_ack(void)</span></a>
+<a name="2919"><span class="lineNum"> 2919 </span> : : {</a>
+<a name="2920"><span class="lineNum"> 2920 </span> : : struct blocklevel_device *bl;</a>
+<a name="2921"><span class="lineNum"> 2921 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="2922"><span class="lineNum"> 2922 </span> : : size_t len;</a>
+<a name="2923"><span class="lineNum"> 2923 </span> : : </a>
+<a name="2924"><span class="lineNum"> 2924 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_recovery_failure_ack);</span></a>
+<a name="2925"><span class="lineNum"> 2925 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="2926"><span class="lineNum"> 2926 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="2927"><span class="lineNum"> 2927 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="2928"><span class="lineNum"> 2928 </span> : : /*</a>
+<a name="2929"><span class="lineNum"> 2929 </span> : : * We're erasing the same block 3 times - it's irrelevant, we're just</a>
+<a name="2930"><span class="lineNum"> 2930 </span> : : * trying to manipulate window state</a>
+<a name="2931"><span class="lineNum"> 2931 </span> : : */</a>
+<a name="2932"><span class="lineNum"> 2932 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="2933"><span class="lineNum"> 2933 </span> :<span class="lineCov"> 1 : scenario_advance();</span></a>
+<a name="2934"><span class="lineNum"> 2934 </span> :<span class="lineCov"> 1 : assert(bl-&gt;erase(bl, 0, len) &gt; 0);</span></a>
+<a name="2935"><span class="lineNum"> 2935 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="2936"><span class="lineNum"> 2936 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="2937"><span class="lineNum"> 2937 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="2938"><span class="lineNum"> 2938 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="2939"><span class="lineNum"> 2939 </span> : : </a>
+<a name="2940"><span class="lineNum"> 2940 </span> : : static const struct scenario_event</a>
+<a name="2941"><span class="lineNum"> 2941 </span> : : scenario_hiomap_protocol_recovery_failure_get_info[] = {</a>
+<a name="2942"><span class="lineNum"> 2942 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="2943"><span class="lineNum"> 2943 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="2944"><span class="lineNum"> 2944 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="2945"><span class="lineNum"> 2945 </span> : : {</a>
+<a name="2946"><span class="lineNum"> 2946 </span> : : .type = scenario_event_p,</a>
+<a name="2947"><span class="lineNum"> 2947 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="2948"><span class="lineNum"> 2948 </span> : : },</a>
+<a name="2949"><span class="lineNum"> 2949 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_erase_qs0l1_call, },</a>
+<a name="2950"><span class="lineNum"> 2950 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="2951"><span class="lineNum"> 2951 </span> : : { .type = scenario_delay },</a>
+<a name="2952"><span class="lineNum"> 2952 </span> : : {</a>
+<a name="2953"><span class="lineNum"> 2953 </span> : : .type = scenario_sel,</a>
+<a name="2954"><span class="lineNum"> 2954 </span> : : .s = {</a>
+<a name="2955"><span class="lineNum"> 2955 </span> : : .bmc_state = HIOMAP_E_DAEMON_READY |</a>
+<a name="2956"><span class="lineNum"> 2956 </span> : : HIOMAP_E_PROTOCOL_RESET</a>
+<a name="2957"><span class="lineNum"> 2957 </span> : : }</a>
+<a name="2958"><span class="lineNum"> 2958 </span> : : },</a>
+<a name="2959"><span class="lineNum"> 2959 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_recovery_ack_call, },</a>
+<a name="2960"><span class="lineNum"> 2960 </span> : : {</a>
+<a name="2961"><span class="lineNum"> 2961 </span> : : .type = scenario_cmd,</a>
+<a name="2962"><span class="lineNum"> 2962 </span> : : .c = {</a>
+<a name="2963"><span class="lineNum"> 2963 </span> : : .req = {</a>
+<a name="2964"><span class="lineNum"> 2964 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2965"><span class="lineNum"> 2965 </span> : : .seq = 8,</a>
+<a name="2966"><span class="lineNum"> 2966 </span> : : .args = {</a>
+<a name="2967"><span class="lineNum"> 2967 </span> : : [0] = HIOMAP_V2,</a>
+<a name="2968"><span class="lineNum"> 2968 </span> : : },</a>
+<a name="2969"><span class="lineNum"> 2969 </span> : : },</a>
+<a name="2970"><span class="lineNum"> 2970 </span> : : .cc = IPMI_ERR_UNSPECIFIED,</a>
+<a name="2971"><span class="lineNum"> 2971 </span> : : },</a>
+<a name="2972"><span class="lineNum"> 2972 </span> : : },</a>
+<a name="2973"><span class="lineNum"> 2973 </span> : : {</a>
+<a name="2974"><span class="lineNum"> 2974 </span> : : .type = scenario_cmd,</a>
+<a name="2975"><span class="lineNum"> 2975 </span> : : .c = {</a>
+<a name="2976"><span class="lineNum"> 2976 </span> : : .req = {</a>
+<a name="2977"><span class="lineNum"> 2977 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2978"><span class="lineNum"> 2978 </span> : : .seq = 9,</a>
+<a name="2979"><span class="lineNum"> 2979 </span> : : .args = {</a>
+<a name="2980"><span class="lineNum"> 2980 </span> : : [0] = HIOMAP_E_PROTOCOL_RESET,</a>
+<a name="2981"><span class="lineNum"> 2981 </span> : : },</a>
+<a name="2982"><span class="lineNum"> 2982 </span> : : },</a>
+<a name="2983"><span class="lineNum"> 2983 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="2984"><span class="lineNum"> 2984 </span> : : .resp = {</a>
+<a name="2985"><span class="lineNum"> 2985 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="2986"><span class="lineNum"> 2986 </span> : : .seq = 9,</a>
+<a name="2987"><span class="lineNum"> 2987 </span> : : },</a>
+<a name="2988"><span class="lineNum"> 2988 </span> : : },</a>
+<a name="2989"><span class="lineNum"> 2989 </span> : : },</a>
+<a name="2990"><span class="lineNum"> 2990 </span> : : {</a>
+<a name="2991"><span class="lineNum"> 2991 </span> : : .type = scenario_cmd,</a>
+<a name="2992"><span class="lineNum"> 2992 </span> : : .c = {</a>
+<a name="2993"><span class="lineNum"> 2993 </span> : : .req = {</a>
+<a name="2994"><span class="lineNum"> 2994 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="2995"><span class="lineNum"> 2995 </span> : : .seq = 10,</a>
+<a name="2996"><span class="lineNum"> 2996 </span> : : .args = {</a>
+<a name="2997"><span class="lineNum"> 2997 </span> : : [0] = HIOMAP_V2,</a>
+<a name="2998"><span class="lineNum"> 2998 </span> : : },</a>
+<a name="2999"><span class="lineNum"> 2999 </span> : : },</a>
+<a name="3000"><span class="lineNum"> 3000 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3001"><span class="lineNum"> 3001 </span> : : .resp = {</a>
+<a name="3002"><span class="lineNum"> 3002 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="3003"><span class="lineNum"> 3003 </span> : : .seq = 10,</a>
+<a name="3004"><span class="lineNum"> 3004 </span> : : .args = {</a>
+<a name="3005"><span class="lineNum"> 3005 </span> : : [0] = HIOMAP_V2,</a>
+<a name="3006"><span class="lineNum"> 3006 </span> : : [1] = 12,</a>
+<a name="3007"><span class="lineNum"> 3007 </span> : : [2] = 8, [3] = 0,</a>
+<a name="3008"><span class="lineNum"> 3008 </span> : : },</a>
+<a name="3009"><span class="lineNum"> 3009 </span> : : },</a>
+<a name="3010"><span class="lineNum"> 3010 </span> : : },</a>
+<a name="3011"><span class="lineNum"> 3011 </span> : : },</a>
+<a name="3012"><span class="lineNum"> 3012 </span> : : {</a>
+<a name="3013"><span class="lineNum"> 3013 </span> : : .type = scenario_cmd,</a>
+<a name="3014"><span class="lineNum"> 3014 </span> : : .c = {</a>
+<a name="3015"><span class="lineNum"> 3015 </span> : : .req = {</a>
+<a name="3016"><span class="lineNum"> 3016 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="3017"><span class="lineNum"> 3017 </span> : : .seq = 11,</a>
+<a name="3018"><span class="lineNum"> 3018 </span> : : .args = {</a>
+<a name="3019"><span class="lineNum"> 3019 </span> : : },</a>
+<a name="3020"><span class="lineNum"> 3020 </span> : : },</a>
+<a name="3021"><span class="lineNum"> 3021 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3022"><span class="lineNum"> 3022 </span> : : .resp = {</a>
+<a name="3023"><span class="lineNum"> 3023 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="3024"><span class="lineNum"> 3024 </span> : : .seq = 11,</a>
+<a name="3025"><span class="lineNum"> 3025 </span> : : .args = {</a>
+<a name="3026"><span class="lineNum"> 3026 </span> : : [0] = 0x00, [1] = 0x20,</a>
+<a name="3027"><span class="lineNum"> 3027 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3028"><span class="lineNum"> 3028 </span> : : },</a>
+<a name="3029"><span class="lineNum"> 3029 </span> : : },</a>
+<a name="3030"><span class="lineNum"> 3030 </span> : : },</a>
+<a name="3031"><span class="lineNum"> 3031 </span> : : },</a>
+<a name="3032"><span class="lineNum"> 3032 </span> : : {</a>
+<a name="3033"><span class="lineNum"> 3033 </span> : : .type = scenario_cmd,</a>
+<a name="3034"><span class="lineNum"> 3034 </span> : : .c = {</a>
+<a name="3035"><span class="lineNum"> 3035 </span> : : .req = {</a>
+<a name="3036"><span class="lineNum"> 3036 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="3037"><span class="lineNum"> 3037 </span> : : .seq = 12,</a>
+<a name="3038"><span class="lineNum"> 3038 </span> : : .args = {</a>
+<a name="3039"><span class="lineNum"> 3039 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="3040"><span class="lineNum"> 3040 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3041"><span class="lineNum"> 3041 </span> : : },</a>
+<a name="3042"><span class="lineNum"> 3042 </span> : : },</a>
+<a name="3043"><span class="lineNum"> 3043 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3044"><span class="lineNum"> 3044 </span> : : .resp = {</a>
+<a name="3045"><span class="lineNum"> 3045 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="3046"><span class="lineNum"> 3046 </span> : : .seq = 12,</a>
+<a name="3047"><span class="lineNum"> 3047 </span> : : .args = {</a>
+<a name="3048"><span class="lineNum"> 3048 </span> : : [0] = 0xff, [1] = 0x0f,</a>
+<a name="3049"><span class="lineNum"> 3049 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3050"><span class="lineNum"> 3050 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="3051"><span class="lineNum"> 3051 </span> : : },</a>
+<a name="3052"><span class="lineNum"> 3052 </span> : : },</a>
+<a name="3053"><span class="lineNum"> 3053 </span> : : },</a>
+<a name="3054"><span class="lineNum"> 3054 </span> : : },</a>
+<a name="3055"><span class="lineNum"> 3055 </span> : : {</a>
+<a name="3056"><span class="lineNum"> 3056 </span> : : .type = scenario_cmd,</a>
+<a name="3057"><span class="lineNum"> 3057 </span> : : .c = {</a>
+<a name="3058"><span class="lineNum"> 3058 </span> : : .req = {</a>
+<a name="3059"><span class="lineNum"> 3059 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="3060"><span class="lineNum"> 3060 </span> : : .seq = 13,</a>
+<a name="3061"><span class="lineNum"> 3061 </span> : : .args = {</a>
+<a name="3062"><span class="lineNum"> 3062 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="3063"><span class="lineNum"> 3063 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3064"><span class="lineNum"> 3064 </span> : : },</a>
+<a name="3065"><span class="lineNum"> 3065 </span> : : },</a>
+<a name="3066"><span class="lineNum"> 3066 </span> : : .resp = {</a>
+<a name="3067"><span class="lineNum"> 3067 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="3068"><span class="lineNum"> 3068 </span> : : .seq = 13,</a>
+<a name="3069"><span class="lineNum"> 3069 </span> : : },</a>
+<a name="3070"><span class="lineNum"> 3070 </span> : : },</a>
+<a name="3071"><span class="lineNum"> 3071 </span> : : },</a>
+<a name="3072"><span class="lineNum"> 3072 </span> : : {</a>
+<a name="3073"><span class="lineNum"> 3073 </span> : : .type = scenario_cmd,</a>
+<a name="3074"><span class="lineNum"> 3074 </span> : : .c = {</a>
+<a name="3075"><span class="lineNum"> 3075 </span> : : .req = {</a>
+<a name="3076"><span class="lineNum"> 3076 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="3077"><span class="lineNum"> 3077 </span> : : .seq = 14,</a>
+<a name="3078"><span class="lineNum"> 3078 </span> : : },</a>
+<a name="3079"><span class="lineNum"> 3079 </span> : : .resp = {</a>
+<a name="3080"><span class="lineNum"> 3080 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="3081"><span class="lineNum"> 3081 </span> : : .seq = 14,</a>
+<a name="3082"><span class="lineNum"> 3082 </span> : : },</a>
+<a name="3083"><span class="lineNum"> 3083 </span> : : },</a>
+<a name="3084"><span class="lineNum"> 3084 </span> : : },</a>
+<a name="3085"><span class="lineNum"> 3085 </span> : : {</a>
+<a name="3086"><span class="lineNum"> 3086 </span> : : .type = scenario_cmd,</a>
+<a name="3087"><span class="lineNum"> 3087 </span> : : .c = {</a>
+<a name="3088"><span class="lineNum"> 3088 </span> : : .req = {</a>
+<a name="3089"><span class="lineNum"> 3089 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="3090"><span class="lineNum"> 3090 </span> : : .seq = 15,</a>
+<a name="3091"><span class="lineNum"> 3091 </span> : : },</a>
+<a name="3092"><span class="lineNum"> 3092 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3093"><span class="lineNum"> 3093 </span> : : .resp = {</a>
+<a name="3094"><span class="lineNum"> 3094 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="3095"><span class="lineNum"> 3095 </span> : : .seq = 15,</a>
+<a name="3096"><span class="lineNum"> 3096 </span> : : },</a>
+<a name="3097"><span class="lineNum"> 3097 </span> : : },</a>
+<a name="3098"><span class="lineNum"> 3098 </span> : : },</a>
+<a name="3099"><span class="lineNum"> 3099 </span> : : SCENARIO_SENTINEL,</a>
+<a name="3100"><span class="lineNum"> 3100 </span> : : };</a>
+<a name="3101"><span class="lineNum"> 3101 </span> : : </a>
+<a name="3102"><span class="lineNum"> 3102 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_recovery_failure_get_info(void)</span></a>
+<a name="3103"><span class="lineNum"> 3103 </span> : : {</a>
+<a name="3104"><span class="lineNum"> 3104 </span> : : struct blocklevel_device *bl;</a>
+<a name="3105"><span class="lineNum"> 3105 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="3106"><span class="lineNum"> 3106 </span> : : size_t len;</a>
+<a name="3107"><span class="lineNum"> 3107 </span> : : </a>
+<a name="3108"><span class="lineNum"> 3108 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_recovery_failure_get_info);</span></a>
+<a name="3109"><span class="lineNum"> 3109 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="3110"><span class="lineNum"> 3110 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="3111"><span class="lineNum"> 3111 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="3112"><span class="lineNum"> 3112 </span> : : /*</a>
+<a name="3113"><span class="lineNum"> 3113 </span> : : * We're erasing the same block 3 times - it's irrelevant, we're just</a>
+<a name="3114"><span class="lineNum"> 3114 </span> : : * trying to manipulate window state</a>
+<a name="3115"><span class="lineNum"> 3115 </span> : : */</a>
+<a name="3116"><span class="lineNum"> 3116 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="3117"><span class="lineNum"> 3117 </span> :<span class="lineCov"> 1 : scenario_advance();</span></a>
+<a name="3118"><span class="lineNum"> 3118 </span> :<span class="lineCov"> 1 : assert(bl-&gt;erase(bl, 0, len) &gt; 0);</span></a>
+<a name="3119"><span class="lineNum"> 3119 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="3120"><span class="lineNum"> 3120 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="3121"><span class="lineNum"> 3121 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="3122"><span class="lineNum"> 3122 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="3123"><span class="lineNum"> 3123 </span> : : </a>
+<a name="3124"><span class="lineNum"> 3124 </span> : : static const struct scenario_event</a>
+<a name="3125"><span class="lineNum"> 3125 </span> : : scenario_hiomap_protocol_recovery_failure_get_flash_info[] = {</a>
+<a name="3126"><span class="lineNum"> 3126 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_ack_call, },</a>
+<a name="3127"><span class="lineNum"> 3127 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_info_call, },</a>
+<a name="3128"><span class="lineNum"> 3128 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_get_flash_info_call, },</a>
+<a name="3129"><span class="lineNum"> 3129 </span> : : {</a>
+<a name="3130"><span class="lineNum"> 3130 </span> : : .type = scenario_event_p,</a>
+<a name="3131"><span class="lineNum"> 3131 </span> : : .p = &amp;hiomap_create_write_window_qs0l1_rs0l1_call,</a>
+<a name="3132"><span class="lineNum"> 3132 </span> : : },</a>
+<a name="3133"><span class="lineNum"> 3133 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_erase_qs0l1_call, },</a>
+<a name="3134"><span class="lineNum"> 3134 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_flush_call, },</a>
+<a name="3135"><span class="lineNum"> 3135 </span> : : { .type = scenario_delay },</a>
+<a name="3136"><span class="lineNum"> 3136 </span> : : {</a>
+<a name="3137"><span class="lineNum"> 3137 </span> : : .type = scenario_sel,</a>
+<a name="3138"><span class="lineNum"> 3138 </span> : : .s = {</a>
+<a name="3139"><span class="lineNum"> 3139 </span> : : .bmc_state = HIOMAP_E_DAEMON_READY |</a>
+<a name="3140"><span class="lineNum"> 3140 </span> : : HIOMAP_E_PROTOCOL_RESET</a>
+<a name="3141"><span class="lineNum"> 3141 </span> : : }</a>
+<a name="3142"><span class="lineNum"> 3142 </span> : : },</a>
+<a name="3143"><span class="lineNum"> 3143 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_recovery_ack_call, },</a>
+<a name="3144"><span class="lineNum"> 3144 </span> : : { .type = scenario_event_p, .p = &amp;hiomap_recovery_get_info_call},</a>
+<a name="3145"><span class="lineNum"> 3145 </span> : : {</a>
+<a name="3146"><span class="lineNum"> 3146 </span> : : .type = scenario_cmd,</a>
+<a name="3147"><span class="lineNum"> 3147 </span> : : .c = {</a>
+<a name="3148"><span class="lineNum"> 3148 </span> : : .req = {</a>
+<a name="3149"><span class="lineNum"> 3149 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="3150"><span class="lineNum"> 3150 </span> : : .seq = 9,</a>
+<a name="3151"><span class="lineNum"> 3151 </span> : : },</a>
+<a name="3152"><span class="lineNum"> 3152 </span> : : .cc = IPMI_ERR_UNSPECIFIED,</a>
+<a name="3153"><span class="lineNum"> 3153 </span> : : },</a>
+<a name="3154"><span class="lineNum"> 3154 </span> : : </a>
+<a name="3155"><span class="lineNum"> 3155 </span> : : },</a>
+<a name="3156"><span class="lineNum"> 3156 </span> : : {</a>
+<a name="3157"><span class="lineNum"> 3157 </span> : : .type = scenario_cmd,</a>
+<a name="3158"><span class="lineNum"> 3158 </span> : : .c = {</a>
+<a name="3159"><span class="lineNum"> 3159 </span> : : .req = {</a>
+<a name="3160"><span class="lineNum"> 3160 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="3161"><span class="lineNum"> 3161 </span> : : .seq = 10,</a>
+<a name="3162"><span class="lineNum"> 3162 </span> : : .args = {</a>
+<a name="3163"><span class="lineNum"> 3163 </span> : : [0] = HIOMAP_E_PROTOCOL_RESET,</a>
+<a name="3164"><span class="lineNum"> 3164 </span> : : },</a>
+<a name="3165"><span class="lineNum"> 3165 </span> : : },</a>
+<a name="3166"><span class="lineNum"> 3166 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3167"><span class="lineNum"> 3167 </span> : : .resp = {</a>
+<a name="3168"><span class="lineNum"> 3168 </span> : : .cmd = HIOMAP_C_ACK,</a>
+<a name="3169"><span class="lineNum"> 3169 </span> : : .seq = 10,</a>
+<a name="3170"><span class="lineNum"> 3170 </span> : : },</a>
+<a name="3171"><span class="lineNum"> 3171 </span> : : },</a>
+<a name="3172"><span class="lineNum"> 3172 </span> : : },</a>
+<a name="3173"><span class="lineNum"> 3173 </span> : : {</a>
+<a name="3174"><span class="lineNum"> 3174 </span> : : .type = scenario_cmd,</a>
+<a name="3175"><span class="lineNum"> 3175 </span> : : .c = {</a>
+<a name="3176"><span class="lineNum"> 3176 </span> : : .req = {</a>
+<a name="3177"><span class="lineNum"> 3177 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="3178"><span class="lineNum"> 3178 </span> : : .seq = 11,</a>
+<a name="3179"><span class="lineNum"> 3179 </span> : : .args = {</a>
+<a name="3180"><span class="lineNum"> 3180 </span> : : [0] = HIOMAP_V2,</a>
+<a name="3181"><span class="lineNum"> 3181 </span> : : },</a>
+<a name="3182"><span class="lineNum"> 3182 </span> : : },</a>
+<a name="3183"><span class="lineNum"> 3183 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3184"><span class="lineNum"> 3184 </span> : : .resp = {</a>
+<a name="3185"><span class="lineNum"> 3185 </span> : : .cmd = HIOMAP_C_GET_INFO,</a>
+<a name="3186"><span class="lineNum"> 3186 </span> : : .seq = 11,</a>
+<a name="3187"><span class="lineNum"> 3187 </span> : : .args = {</a>
+<a name="3188"><span class="lineNum"> 3188 </span> : : [0] = HIOMAP_V2,</a>
+<a name="3189"><span class="lineNum"> 3189 </span> : : [1] = 12,</a>
+<a name="3190"><span class="lineNum"> 3190 </span> : : [2] = 8, [3] = 0,</a>
+<a name="3191"><span class="lineNum"> 3191 </span> : : },</a>
+<a name="3192"><span class="lineNum"> 3192 </span> : : },</a>
+<a name="3193"><span class="lineNum"> 3193 </span> : : },</a>
+<a name="3194"><span class="lineNum"> 3194 </span> : : },</a>
+<a name="3195"><span class="lineNum"> 3195 </span> : : {</a>
+<a name="3196"><span class="lineNum"> 3196 </span> : : .type = scenario_cmd,</a>
+<a name="3197"><span class="lineNum"> 3197 </span> : : .c = {</a>
+<a name="3198"><span class="lineNum"> 3198 </span> : : .req = {</a>
+<a name="3199"><span class="lineNum"> 3199 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="3200"><span class="lineNum"> 3200 </span> : : .seq = 12,</a>
+<a name="3201"><span class="lineNum"> 3201 </span> : : .args = {</a>
+<a name="3202"><span class="lineNum"> 3202 </span> : : },</a>
+<a name="3203"><span class="lineNum"> 3203 </span> : : },</a>
+<a name="3204"><span class="lineNum"> 3204 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3205"><span class="lineNum"> 3205 </span> : : .resp = {</a>
+<a name="3206"><span class="lineNum"> 3206 </span> : : .cmd = HIOMAP_C_GET_FLASH_INFO,</a>
+<a name="3207"><span class="lineNum"> 3207 </span> : : .seq = 12,</a>
+<a name="3208"><span class="lineNum"> 3208 </span> : : .args = {</a>
+<a name="3209"><span class="lineNum"> 3209 </span> : : [0] = 0x00, [1] = 0x20,</a>
+<a name="3210"><span class="lineNum"> 3210 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3211"><span class="lineNum"> 3211 </span> : : },</a>
+<a name="3212"><span class="lineNum"> 3212 </span> : : },</a>
+<a name="3213"><span class="lineNum"> 3213 </span> : : },</a>
+<a name="3214"><span class="lineNum"> 3214 </span> : : },</a>
+<a name="3215"><span class="lineNum"> 3215 </span> : : {</a>
+<a name="3216"><span class="lineNum"> 3216 </span> : : .type = scenario_cmd,</a>
+<a name="3217"><span class="lineNum"> 3217 </span> : : .c = {</a>
+<a name="3218"><span class="lineNum"> 3218 </span> : : .req = {</a>
+<a name="3219"><span class="lineNum"> 3219 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="3220"><span class="lineNum"> 3220 </span> : : .seq = 13,</a>
+<a name="3221"><span class="lineNum"> 3221 </span> : : .args = {</a>
+<a name="3222"><span class="lineNum"> 3222 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="3223"><span class="lineNum"> 3223 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3224"><span class="lineNum"> 3224 </span> : : },</a>
+<a name="3225"><span class="lineNum"> 3225 </span> : : },</a>
+<a name="3226"><span class="lineNum"> 3226 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3227"><span class="lineNum"> 3227 </span> : : .resp = {</a>
+<a name="3228"><span class="lineNum"> 3228 </span> : : .cmd = HIOMAP_C_CREATE_WRITE_WINDOW,</a>
+<a name="3229"><span class="lineNum"> 3229 </span> : : .seq = 13,</a>
+<a name="3230"><span class="lineNum"> 3230 </span> : : .args = {</a>
+<a name="3231"><span class="lineNum"> 3231 </span> : : [0] = 0xff, [1] = 0x0f,</a>
+<a name="3232"><span class="lineNum"> 3232 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3233"><span class="lineNum"> 3233 </span> : : [4] = 0x00, [5] = 0x00,</a>
+<a name="3234"><span class="lineNum"> 3234 </span> : : },</a>
+<a name="3235"><span class="lineNum"> 3235 </span> : : },</a>
+<a name="3236"><span class="lineNum"> 3236 </span> : : },</a>
+<a name="3237"><span class="lineNum"> 3237 </span> : : },</a>
+<a name="3238"><span class="lineNum"> 3238 </span> : : {</a>
+<a name="3239"><span class="lineNum"> 3239 </span> : : .type = scenario_cmd,</a>
+<a name="3240"><span class="lineNum"> 3240 </span> : : .c = {</a>
+<a name="3241"><span class="lineNum"> 3241 </span> : : .req = {</a>
+<a name="3242"><span class="lineNum"> 3242 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="3243"><span class="lineNum"> 3243 </span> : : .seq = 14,</a>
+<a name="3244"><span class="lineNum"> 3244 </span> : : .args = {</a>
+<a name="3245"><span class="lineNum"> 3245 </span> : : [0] = 0x00, [1] = 0x00,</a>
+<a name="3246"><span class="lineNum"> 3246 </span> : : [2] = 0x01, [3] = 0x00,</a>
+<a name="3247"><span class="lineNum"> 3247 </span> : : },</a>
+<a name="3248"><span class="lineNum"> 3248 </span> : : },</a>
+<a name="3249"><span class="lineNum"> 3249 </span> : : .resp = {</a>
+<a name="3250"><span class="lineNum"> 3250 </span> : : .cmd = HIOMAP_C_ERASE,</a>
+<a name="3251"><span class="lineNum"> 3251 </span> : : .seq = 14,</a>
+<a name="3252"><span class="lineNum"> 3252 </span> : : },</a>
+<a name="3253"><span class="lineNum"> 3253 </span> : : },</a>
+<a name="3254"><span class="lineNum"> 3254 </span> : : },</a>
+<a name="3255"><span class="lineNum"> 3255 </span> : : {</a>
+<a name="3256"><span class="lineNum"> 3256 </span> : : .type = scenario_cmd,</a>
+<a name="3257"><span class="lineNum"> 3257 </span> : : .c = {</a>
+<a name="3258"><span class="lineNum"> 3258 </span> : : .req = {</a>
+<a name="3259"><span class="lineNum"> 3259 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="3260"><span class="lineNum"> 3260 </span> : : .seq = 15,</a>
+<a name="3261"><span class="lineNum"> 3261 </span> : : },</a>
+<a name="3262"><span class="lineNum"> 3262 </span> : : .resp = {</a>
+<a name="3263"><span class="lineNum"> 3263 </span> : : .cmd = HIOMAP_C_FLUSH,</a>
+<a name="3264"><span class="lineNum"> 3264 </span> : : .seq = 15,</a>
+<a name="3265"><span class="lineNum"> 3265 </span> : : },</a>
+<a name="3266"><span class="lineNum"> 3266 </span> : : },</a>
+<a name="3267"><span class="lineNum"> 3267 </span> : : },</a>
+<a name="3268"><span class="lineNum"> 3268 </span> : : {</a>
+<a name="3269"><span class="lineNum"> 3269 </span> : : .type = scenario_cmd,</a>
+<a name="3270"><span class="lineNum"> 3270 </span> : : .c = {</a>
+<a name="3271"><span class="lineNum"> 3271 </span> : : .req = {</a>
+<a name="3272"><span class="lineNum"> 3272 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="3273"><span class="lineNum"> 3273 </span> : : .seq = 16,</a>
+<a name="3274"><span class="lineNum"> 3274 </span> : : },</a>
+<a name="3275"><span class="lineNum"> 3275 </span> : : .cc = IPMI_CC_NO_ERROR,</a>
+<a name="3276"><span class="lineNum"> 3276 </span> : : .resp = {</a>
+<a name="3277"><span class="lineNum"> 3277 </span> : : .cmd = HIOMAP_C_RESET,</a>
+<a name="3278"><span class="lineNum"> 3278 </span> : : .seq = 16,</a>
+<a name="3279"><span class="lineNum"> 3279 </span> : : },</a>
+<a name="3280"><span class="lineNum"> 3280 </span> : : },</a>
+<a name="3281"><span class="lineNum"> 3281 </span> : : },</a>
+<a name="3282"><span class="lineNum"> 3282 </span> : : SCENARIO_SENTINEL,</a>
+<a name="3283"><span class="lineNum"> 3283 </span> : : };</a>
+<a name="3284"><span class="lineNum"> 3284 </span> : : </a>
+<a name="3285"><span class="lineNum"> 3285 </span> :<span class="lineCov"> 1 : static void test_hiomap_protocol_recovery_failure_get_flash_info(void)</span></a>
+<a name="3286"><span class="lineNum"> 3286 </span> : : {</a>
+<a name="3287"><span class="lineNum"> 3287 </span> : : struct blocklevel_device *bl;</a>
+<a name="3288"><span class="lineNum"> 3288 </span> : : struct ipmi_hiomap *ctx;</a>
+<a name="3289"><span class="lineNum"> 3289 </span> : : size_t len;</a>
+<a name="3290"><span class="lineNum"> 3290 </span> : : </a>
+<a name="3291"><span class="lineNum"> 3291 </span> :<span class="lineCov"> 1 : scenario_enter(scenario_hiomap_protocol_recovery_failure_get_flash_info);</span></a>
+<a name="3292"><span class="lineNum"> 3292 </span> :<span class="lineCov"> 1 : assert(!ipmi_hiomap_init(&amp;bl));</span></a>
+<a name="3293"><span class="lineNum"> 3293 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="3294"><span class="lineNum"> 3294 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="3295"><span class="lineNum"> 3295 </span> : : /*</a>
+<a name="3296"><span class="lineNum"> 3296 </span> : : * We're erasing the same block 3 times - it's irrelevant, we're just</a>
+<a name="3297"><span class="lineNum"> 3297 </span> : : * trying to manipulate window state</a>
+<a name="3298"><span class="lineNum"> 3298 </span> : : */</a>
+<a name="3299"><span class="lineNum"> 3299 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="3300"><span class="lineNum"> 3300 </span> :<span class="lineCov"> 1 : scenario_advance();</span></a>
+<a name="3301"><span class="lineNum"> 3301 </span> :<span class="lineCov"> 1 : ctx = container_of(bl, struct ipmi_hiomap, bl);</span></a>
+<a name="3302"><span class="lineNum"> 3302 </span> :<span class="lineCov"> 1 : len = 1 &lt;&lt; ctx-&gt;block_size_shift;</span></a>
+<a name="3303"><span class="lineNum"> 3303 </span> :<span class="lineCov"> 1 : assert(bl-&gt;erase(bl, 0, len) &gt; 0);</span></a>
+<a name="3304"><span class="lineNum"> 3304 </span> :<span class="lineCov"> 1 : assert(!bl-&gt;erase(bl, 0, len));</span></a>
+<a name="3305"><span class="lineNum"> 3305 </span> :<span class="lineCov"> 1 : ipmi_hiomap_exit(bl);</span></a>
+<a name="3306"><span class="lineNum"> 3306 </span> :<span class="lineCov"> 1 : scenario_exit();</span></a>
+<a name="3307"><span class="lineNum"> 3307 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="3308"><span class="lineNum"> 3308 </span> : : </a>
+<a name="3309"><span class="lineNum"> 3309 </span> : : struct test_case {</a>
+<a name="3310"><span class="lineNum"> 3310 </span> : : const char *name;</a>
+<a name="3311"><span class="lineNum"> 3311 </span> : : void (*fn)(void);</a>
+<a name="3312"><span class="lineNum"> 3312 </span> : : };</a>
+<a name="3313"><span class="lineNum"> 3313 </span> : : </a>
+<a name="3314"><span class="lineNum"> 3314 </span> : : #define TEST_CASE(x) { #x, x }</a>
+<a name="3315"><span class="lineNum"> 3315 </span> : : </a>
+<a name="3316"><span class="lineNum"> 3316 </span> : : struct test_case test_cases[] = {</a>
+<a name="3317"><span class="lineNum"> 3317 </span> : : TEST_CASE(test_hiomap_init),</a>
+<a name="3318"><span class="lineNum"> 3318 </span> : : TEST_CASE(test_hiomap_event_daemon_ready),</a>
+<a name="3319"><span class="lineNum"> 3319 </span> : : TEST_CASE(test_hiomap_event_daemon_stopped),</a>
+<a name="3320"><span class="lineNum"> 3320 </span> : : TEST_CASE(test_hiomap_event_daemon_restarted),</a>
+<a name="3321"><span class="lineNum"> 3321 </span> : : TEST_CASE(test_hiomap_event_daemon_lost_flash_control),</a>
+<a name="3322"><span class="lineNum"> 3322 </span> : : TEST_CASE(test_hiomap_event_daemon_regained_flash_control_dirty),</a>
+<a name="3323"><span class="lineNum"> 3323 </span> : : TEST_CASE(test_hiomap_protocol_reset_recovery),</a>
+<a name="3324"><span class="lineNum"> 3324 </span> : : TEST_CASE(test_hiomap_protocol_read_one_block),</a>
+<a name="3325"><span class="lineNum"> 3325 </span> : : TEST_CASE(test_hiomap_protocol_read_one_byte),</a>
+<a name="3326"><span class="lineNum"> 3326 </span> : : TEST_CASE(test_hiomap_protocol_read_two_blocks),</a>
+<a name="3327"><span class="lineNum"> 3327 </span> : : TEST_CASE(test_hiomap_protocol_read_1block_1byte),</a>
+<a name="3328"><span class="lineNum"> 3328 </span> : : TEST_CASE(test_hiomap_protocol_read_one_block_twice),</a>
+<a name="3329"><span class="lineNum"> 3329 </span> : : TEST_CASE(test_hiomap_protocol_event_before_read),</a>
+<a name="3330"><span class="lineNum"> 3330 </span> : : TEST_CASE(test_hiomap_protocol_event_during_read),</a>
+<a name="3331"><span class="lineNum"> 3331 </span> : : TEST_CASE(test_hiomap_protocol_write_one_block),</a>
+<a name="3332"><span class="lineNum"> 3332 </span> : : TEST_CASE(test_hiomap_protocol_write_one_byte),</a>
+<a name="3333"><span class="lineNum"> 3333 </span> : : TEST_CASE(test_hiomap_protocol_write_two_blocks),</a>
+<a name="3334"><span class="lineNum"> 3334 </span> : : TEST_CASE(test_hiomap_protocol_write_1block_1byte),</a>
+<a name="3335"><span class="lineNum"> 3335 </span> : : TEST_CASE(test_hiomap_protocol_write_one_block_twice),</a>
+<a name="3336"><span class="lineNum"> 3336 </span> : : TEST_CASE(test_hiomap_protocol_event_before_write),</a>
+<a name="3337"><span class="lineNum"> 3337 </span> : : TEST_CASE(test_hiomap_protocol_event_during_write),</a>
+<a name="3338"><span class="lineNum"> 3338 </span> : : TEST_CASE(test_hiomap_protocol_erase_one_block),</a>
+<a name="3339"><span class="lineNum"> 3339 </span> : : TEST_CASE(test_hiomap_protocol_erase_two_blocks),</a>
+<a name="3340"><span class="lineNum"> 3340 </span> : : TEST_CASE(test_hiomap_protocol_erase_one_block_twice),</a>
+<a name="3341"><span class="lineNum"> 3341 </span> : : TEST_CASE(test_hiomap_protocol_event_before_erase),</a>
+<a name="3342"><span class="lineNum"> 3342 </span> : : TEST_CASE(test_hiomap_protocol_event_during_erase),</a>
+<a name="3343"><span class="lineNum"> 3343 </span> : : TEST_CASE(test_hiomap_protocol_bad_sequence),</a>
+<a name="3344"><span class="lineNum"> 3344 </span> : : TEST_CASE(test_hiomap_protocol_action_error),</a>
+<a name="3345"><span class="lineNum"> 3345 </span> : : TEST_CASE(test_hiomap_protocol_persistent_error),</a>
+<a name="3346"><span class="lineNum"> 3346 </span> : : TEST_CASE(test_hiomap_protocol_get_flash_info),</a>
+<a name="3347"><span class="lineNum"> 3347 </span> : : TEST_CASE(test_hiomap_get_info_error),</a>
+<a name="3348"><span class="lineNum"> 3348 </span> : : TEST_CASE(test_hiomap_get_flash_info_error),</a>
+<a name="3349"><span class="lineNum"> 3349 </span> : : TEST_CASE(test_hiomap_create_read_window_error),</a>
+<a name="3350"><span class="lineNum"> 3350 </span> : : TEST_CASE(test_hiomap_create_write_window_error),</a>
+<a name="3351"><span class="lineNum"> 3351 </span> : : TEST_CASE(test_hiomap_mark_dirty_error),</a>
+<a name="3352"><span class="lineNum"> 3352 </span> : : TEST_CASE(test_hiomap_flush_error),</a>
+<a name="3353"><span class="lineNum"> 3353 </span> : : TEST_CASE(test_hiomap_ack_error),</a>
+<a name="3354"><span class="lineNum"> 3354 </span> : : TEST_CASE(test_hiomap_erase_error),</a>
+<a name="3355"><span class="lineNum"> 3355 </span> : : TEST_CASE(test_hiomap_ack_malformed_small),</a>
+<a name="3356"><span class="lineNum"> 3356 </span> : : TEST_CASE(test_hiomap_ack_malformed_large),</a>
+<a name="3357"><span class="lineNum"> 3357 </span> : : TEST_CASE(test_hiomap_get_info_malformed_small),</a>
+<a name="3358"><span class="lineNum"> 3358 </span> : : TEST_CASE(test_hiomap_get_info_malformed_large),</a>
+<a name="3359"><span class="lineNum"> 3359 </span> : : TEST_CASE(test_hiomap_get_flash_info_malformed_small),</a>
+<a name="3360"><span class="lineNum"> 3360 </span> : : TEST_CASE(test_hiomap_get_flash_info_malformed_large),</a>
+<a name="3361"><span class="lineNum"> 3361 </span> : : TEST_CASE(test_hiomap_create_read_window_malformed_small),</a>
+<a name="3362"><span class="lineNum"> 3362 </span> : : TEST_CASE(test_hiomap_create_read_window_malformed_large),</a>
+<a name="3363"><span class="lineNum"> 3363 </span> : : TEST_CASE(test_hiomap_create_write_window_malformed_small),</a>
+<a name="3364"><span class="lineNum"> 3364 </span> : : TEST_CASE(test_hiomap_create_write_window_malformed_large),</a>
+<a name="3365"><span class="lineNum"> 3365 </span> : : TEST_CASE(test_hiomap_mark_dirty_malformed_small),</a>
+<a name="3366"><span class="lineNum"> 3366 </span> : : TEST_CASE(test_hiomap_mark_dirty_malformed_large),</a>
+<a name="3367"><span class="lineNum"> 3367 </span> : : TEST_CASE(test_hiomap_flush_malformed_small),</a>
+<a name="3368"><span class="lineNum"> 3368 </span> : : TEST_CASE(test_hiomap_flush_malformed_large),</a>
+<a name="3369"><span class="lineNum"> 3369 </span> : : TEST_CASE(test_hiomap_erase_malformed_small),</a>
+<a name="3370"><span class="lineNum"> 3370 </span> : : TEST_CASE(test_hiomap_erase_malformed_large),</a>
+<a name="3371"><span class="lineNum"> 3371 </span> : : TEST_CASE(test_hiomap_protocol_recovery_failure_ack),</a>
+<a name="3372"><span class="lineNum"> 3372 </span> : : TEST_CASE(test_hiomap_protocol_recovery_failure_get_info),</a>
+<a name="3373"><span class="lineNum"> 3373 </span> : : TEST_CASE(test_hiomap_protocol_recovery_failure_get_flash_info),</a>
+<a name="3374"><span class="lineNum"> 3374 </span> : : { NULL, NULL },</a>
+<a name="3375"><span class="lineNum"> 3375 </span> : : };</a>
+<a name="3376"><span class="lineNum"> 3376 </span> : : </a>
+<a name="3377"><span class="lineNum"> 3377 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="3378"><span class="lineNum"> 3378 </span> : : {</a>
+<a name="3379"><span class="lineNum"> 3379 </span> :<span class="lineCov"> 1 : struct test_case *tc = &amp;test_cases[0];</span></a>
+<a name="3380"><span class="lineNum"> 3380 </span> : : </a>
+<a name="3381"><span class="lineNum"> 3381 </span> : : do {</a>
+<a name="3382"><span class="lineNum"> 3382 </span> :<span class="lineCov"> 57 : printf(&quot;%s\n&quot;, tc-&gt;name);</span></a>
+<a name="3383"><span class="lineNum"> 3383 </span> :<span class="lineCov"> 57 : tc-&gt;fn();</span></a>
+<a name="3384"><span class="lineNum"> 3384 </span> :<span class="lineCov"> 57 : printf(&quot;\n&quot;);</span></a>
+<a name="3385"><span class="lineNum"> 3385 </span> :<span class="lineCov"> 57 : } while ((++tc)-&gt;fn);</span></a>
+<a name="3386"><span class="lineNum"> 3386 </span> : : </a>
+<a name="3387"><span class="lineNum"> 3387 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="3388"><span class="lineNum"> 3388 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-mbox.c.func-sort-c.html b/coverage-report/libflash/test/test-mbox.c.func-sort-c.html
new file mode 100644
index 0000000..ae5a756
--- /dev/null
+++ b/coverage-report/libflash/test/test-mbox.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-mbox.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-mbox.c<span style="font-size: 80%;"> (<a href="test-mbox.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">94</td>
+ <td class="headerCovTableEntry">152</td>
+ <td class="headerCovTableEntryLo">61.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="test-mbox.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-mbox.c.gcov.html#272">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-mbox.c.gcov.html#19">mbox_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-mbox.c.gcov.html#37">run_flash_test</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-mbox.c.func.html b/coverage-report/libflash/test/test-mbox.c.func.html
new file mode 100644
index 0000000..c137b94
--- /dev/null
+++ b/coverage-report/libflash/test/test-mbox.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-mbox.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-mbox.c<span style="font-size: 80%;"> (<a href="test-mbox.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">94</td>
+ <td class="headerCovTableEntry">152</td>
+ <td class="headerCovTableEntryLo">61.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="test-mbox.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-mbox.c.gcov.html#272">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-mbox.c.gcov.html#19">mbox_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="test-mbox.c.gcov.html#37">run_flash_test</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libflash/test/test-mbox.c.gcov.html b/coverage-report/libflash/test/test-mbox.c.gcov.html
new file mode 100644
index 0000000..b520fa1
--- /dev/null
+++ b/coverage-report/libflash/test/test-mbox.c.gcov.html
@@ -0,0 +1,418 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libflash/test/test-mbox.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libflash/test</a> - test-mbox.c<span style="font-size: 80%;"> (source / <a href="test-mbox.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">94</td>
+ <td class="headerCovTableEntry">152</td>
+ <td class="headerCovTableEntryLo">61.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2017-2018 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;string.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdarg.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;libflash/libflash.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;libflash/libflash-priv.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;stubs.h&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;mbox-server.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : </a>
+<a name="16"><span class="lineNum"> 16 </span> : : #define zalloc(n) calloc(1, n)</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define __unused __attribute__((unused))</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #undef pr_fmt</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : void mbox_init(void)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : }</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &quot;../libflash.c&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &quot;../mbox-flash.c&quot;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &quot;../ecc.c&quot;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &quot;../blocklevel.c&quot;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : </a>
+<a name="30"><span class="lineNum"> 30 </span> : : #undef pr_fmt</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #define pr_fmt(fmt) &quot;MBOX-PROXY: &quot; fmt</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* client interface */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> : : #include &quot;../../include/lpc-mbox.h&quot;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : #define ERR(...) FL_DBG(__VA_ARGS__)</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 4 : static int run_flash_test(struct blocklevel_device *bl)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> : : struct mbox_flash_data *mbox_flash;</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 4 : char hello[] = &quot;Hello World&quot;;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : uint32_t erase_granule;</a>
+<a name="44"><span class="lineNum"> 44 </span> : : uint64_t total_size;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : const char *name;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : uint16_t *test;</a>
+<a name="47"><span class="lineNum"> 47 </span> : : char *tmp;</a>
+<a name="48"><span class="lineNum"> 48 </span> : : int i, rc;</a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 4 : mbox_flash = container_of(bl, struct mbox_flash_data, bl);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> : : /*</a>
+<a name="53"><span class="lineNum"> 53 </span> : : * Do something first so that if it has been reset it does that</a>
+<a name="54"><span class="lineNum"> 54 </span> : : * before we check versions</a>
+<a name="55"><span class="lineNum"> 55 </span> : : */</a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 4 : rc = blocklevel_get_info(bl, &amp;name, &amp;total_size, &amp;erase_granule);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_get_info() failed with err %d\n&quot;, rc);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : }</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 4 : if (total_size != mbox_server_total_size()) {</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Total flash size is incorrect: 0x%08lx vs 0x%08x\n&quot;,</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : total_size, mbox_server_total_size());</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : }</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 4 : if (erase_granule != mbox_server_erase_granule()) {</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Erase granule is incorrect 0x%08x vs 0x%08x\n&quot;,</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : erase_granule, mbox_server_erase_granule());</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : }</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : /* Sanity check that mbox_flash has inited correctly */</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 4 : if (mbox_flash-&gt;version != mbox_server_version()) {</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : ERR(&quot;MBOX Flash didn't agree with the server version\n&quot;);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 4 : if (mbox_flash-&gt;version == 1 &amp;&amp; mbox_flash-&gt;shift != 12) {</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineNoCov"> 0 : ERR(&quot;MBOX Flash version 1 isn't using a 4K shift\n&quot;);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : }</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 4 : mbox_server_memset(0xff);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 4 : test = calloc(erase_granule * 20, 1);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> : : /* Make up a test pattern */</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 11878404 : for (i = 0; i &lt; erase_granule * 10; i++)</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 11878400 : test[i] = i;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : /* Write 64k of stuff at 0 and at 128k */</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 4 : printf(&quot;Writing test patterns...\n&quot;);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 4 : rc = blocklevel_write(bl, 0, test, erase_granule * 10);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_write(0, erase_granule * 10) failed with err %d\n&quot;, rc);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : }</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 4 : rc = blocklevel_write(bl, erase_granule * 20, test, erase_granule * 10);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_write(0x20000, 0x10000) failed with err %d\n&quot;, rc);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : }</a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 4 : if (mbox_server_memcmp(0, test, erase_granule * 10)) {</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Test pattern mismatch !\n&quot;);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : }</a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> : : /* Write &quot;Hello world&quot; straddling the 64k boundary */</a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 4 : printf(&quot;Writing test string...\n&quot;);</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 4 : rc = blocklevel_write(bl, (erase_granule * 10) - 8, hello, sizeof(hello));</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_write(0xfffc, %s, %lu) failed with err %d\n&quot;,</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : hello, sizeof(hello), rc);</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : }</a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> : : /* Check result */</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 4 : if (mbox_server_memcmp((erase_granule * 10) - 8, hello, sizeof(hello))) {</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Test string mismatch!\n&quot;);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /* Erase granule is something but never 0x50, this shouldn't succeed */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 4 : rc = blocklevel_erase(bl, 0, 0x50);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 4 : if (!rc) {</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_erase(0, 0x50) didn't fail!\n&quot;);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : }</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> : : /* Check it didn't silently erase */</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 4 : if (mbox_server_memcmp(0, test, (erase_granule * 10) - 8)) {</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Test pattern mismatch !\n&quot;);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : }</a>
+<a name="136"><span class="lineNum"> 136 </span> : : </a>
+<a name="137"><span class="lineNum"> 137 </span> : : /*</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * For v1 protocol this should NOT call MARK_WRITE_ERASED!</a>
+<a name="139"><span class="lineNum"> 139 </span> : : * The server MARK_WRITE_ERASED will call exit(1) if it gets a</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * MARK_WRITE_ERASED and version == 1</a>
+<a name="141"><span class="lineNum"> 141 </span> : : */</a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 4 : rc = blocklevel_erase(bl, 0, erase_granule);</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_erase(0, erase_granule) failed with err %d\n&quot;, rc);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : }</a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> : : /*</a>
+<a name="149"><span class="lineNum"> 149 </span> : : * Version 1 doesn't specify that the buffer actually becomes 0xff</a>
+<a name="150"><span class="lineNum"> 150 </span> : : * It is up to the daemon to do what it wants really - there are</a>
+<a name="151"><span class="lineNum"> 151 </span> : : * implementations that do nothing but writes to the same region</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * work fine</a>
+<a name="153"><span class="lineNum"> 153 </span> : : */</a>
+<a name="154"><span class="lineNum"> 154 </span> : : </a>
+<a name="155"><span class="lineNum"> 155 </span> : : /* This check is important for v2 */</a>
+<a name="156"><span class="lineNum"> 156 </span> : : /* Check stuff got erased */</a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 4 : tmp = malloc(erase_granule * 2);</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 4 : if (!tmp) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : ERR(&quot;malloc failed\n&quot;);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : return 1;</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 4 : if (mbox_server_version() &gt; 1) {</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 3 : memset(tmp, 0xff, erase_granule);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 3 : if (mbox_server_memcmp(0, tmp, erase_granule)) {</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineNoCov"> 0 : ERR(&quot;Buffer not erased\n&quot;);</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineNoCov"> 0 : rc = 1;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : }</a>
+<a name="169"><span class="lineNum"> 169 </span> : : }</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> : : /* Read beyond the end of flash */</a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 4 : rc = blocklevel_read(bl, total_size, tmp, 0x1000);</span></a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 4 : if (!rc) {</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_read(total_size, 0x1000) (read beyond the end) succeeded\n&quot;);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : }</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> : : /* Test some simple write/read cases, avoid first page */</a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 4 : rc = blocklevel_write(bl, erase_granule * 2, test, erase_granule / 2);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_write(erase_granule, erase_granule / 2) failed with err %d\n&quot;, rc);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="183"><span class="lineNum"> 183 </span> : : }</a>
+<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 4 : rc = blocklevel_write(bl, erase_granule * 2 + erase_granule / 2, test, erase_granule / 2);</span></a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_write(erase_granule * 2 + erase_granule / 2, erase_granule) failed with err %d\n&quot;, rc);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : }</a>
+<a name="189"><span class="lineNum"> 189 </span> : : </a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 4 : rc = mbox_server_memcmp(erase_granule * 2, test, erase_granule / 2);</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineNoCov"> 0 : ERR(&quot;%s:%d mbox_server_memcmp miscompare\n&quot;, __FILE__, __LINE__);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : }</a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 4 : rc = mbox_server_memcmp(erase_granule * 2 + erase_granule / 2, test, erase_granule / 2);</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineNoCov"> 0 : ERR(&quot;%s:%d mbox_server_memcmp miscompare\n&quot;, __FILE__, __LINE__);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="199"><span class="lineNum"> 199 </span> : : }</a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> : : /* Great so the writes made it, can we read them back? Do it in</a>
+<a name="202"><span class="lineNum"> 202 </span> : : * four small reads */</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 20 : for (i = 0; i &lt; 4; i++) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 16 : rc = blocklevel_read(bl, erase_granule * 2 + (i * erase_granule / 4), tmp + (i * erase_granule / 4), erase_granule / 4);</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 16 : if (rc) {</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_read(0x%08x, erase_granule / 4) failed with err %d\n&quot;,</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : 2 * erase_granule + (i * erase_granule / 4), rc);</a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> : : }</a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 4 : rc = memcmp(test, tmp, erase_granule / 2);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="213"><span class="lineNum"> 213 </span> :<span class="lineNoCov"> 0 : ERR(&quot;%s:%d read back miscompare\n&quot;, __FILE__, __LINE__);</span></a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : }</a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 4 : rc = memcmp(test, tmp + erase_granule / 2, erase_granule / 2);</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 4 : if (rc) {</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineNoCov"> 0 : ERR(&quot;%s:%d read back miscompare\n&quot;, __FILE__, __LINE__);</span></a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="220"><span class="lineNum"> 220 </span> : : }</a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> : : /*</a>
+<a name="223"><span class="lineNum"> 223 </span> : : * Make sure we didn't corrupt other stuff, also make sure one</a>
+<a name="224"><span class="lineNum"> 224 </span> : : * blocklevel call will understand how to read from two windows</a>
+<a name="225"><span class="lineNum"> 225 </span> : : */</a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 16 : for (i = 3; i &lt; 9; i = i + 2) {</span></a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 12 : printf(&quot;i:%d erase: 0x%08x\n&quot;, i, erase_granule);</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 12 : rc = blocklevel_read(bl, i * erase_granule, tmp, 2 * erase_granule);</span></a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 12 : if (rc) {</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_read(0x%08x, 2 * erase_granule) failed with err: %d\n&quot;, i * erase_granule, rc);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : }</a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 12 : rc = memcmp(((char *)test) + (i * erase_granule), tmp, 2 * erase_granule);</span></a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 12 : if (rc) {</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : ERR(&quot;%s:%d read back miscompare (pos: 0x%08x)\n&quot;, __FILE__, __LINE__, i * erase_granule);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : }</a>
+<a name="238"><span class="lineNum"> 238 </span> : : }</a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 4 : srand(1);</span></a>
+<a name="241"><span class="lineNum"> 241 </span> : : /*</a>
+<a name="242"><span class="lineNum"> 242 </span> : : * Try to jump around the place doing a tonne of small reads.</a>
+<a name="243"><span class="lineNum"> 243 </span> : : * Worth doing the same with writes TODO</a>
+<a name="244"><span class="lineNum"> 244 </span> : : */</a>
+<a name="245"><span class="lineNum"> 245 </span> : : #ifdef __STRICT_TEST__</a>
+<a name="246"><span class="lineNum"> 246 </span> : : #define TEST_LOOPS 1000</a>
+<a name="247"><span class="lineNum"> 247 </span> : : #else</a>
+<a name="248"><span class="lineNum"> 248 </span> : : #define TEST_LOOPS 100</a>
+<a name="249"><span class="lineNum"> 249 </span> : : #endif</a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 404 : for (i = 0; i &lt; TEST_LOOPS; i++) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 400 : int r = rand();</span></a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 400 : printf(&quot;Loop %d of %d\n&quot;, i, TEST_LOOPS);</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : /* Avoid reading too far, just skip it */</a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 400 : if ((r % erase_granule * 10) + (r % erase_granule * 2) &gt; erase_granule * 10)</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 65 : continue;</span></a>
+<a name="257"><span class="lineNum"> 257 </span> : : </a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 335 : rc = blocklevel_read(bl, erase_granule * 20 + (r % erase_granule * 10), tmp, r % erase_granule * 2);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 335 : if (rc) {</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : ERR(&quot;blocklevel_read(0x%08x, 0x%08x) failed with err %d\n&quot;, 0x20000 + (r % 0x100000), r % 0x2000, rc);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 335 : rc = memcmp(((char *)test) + (r % erase_granule * 10), tmp, r % erase_granule * 2);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 335 : if (rc) {</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineNoCov"> 0 : ERR(&quot;%s:%d read back miscompare (pos: 0x%08x)\n&quot;, __FILE__, __LINE__, 0x20000 + (r % 0x10000));</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="267"><span class="lineNum"> 267 </span> : : }</a>
+<a name="268"><span class="lineNum"> 268 </span> : : }</a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 4 : out:</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 4 : free(tmp);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="275"><span class="lineNum"> 275 </span> : : {</a>
+<a name="276"><span class="lineNum"> 276 </span> : : struct blocklevel_device *bl;</a>
+<a name="277"><span class="lineNum"> 277 </span> : : int rc;</a>
+<a name="278"><span class="lineNum"> 278 </span> : : </a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 1 : libflash_debug = true;</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 1 : mbox_server_init();</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> : : #ifdef __STRICT_TEST__</a>
+<a name="284"><span class="lineNum"> 284 </span> : : printf(&quot;Found __STRICT_TEST__, this may take time time.\n&quot;);</a>
+<a name="285"><span class="lineNum"> 285 </span> : : #else</a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 1 : printf(&quot;__STRICT_TEST__ not found, use make strict-check for a more\n&quot;);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 1 : printf(&quot;thorough test, it will take significantly longer.\n&quot;);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : #endif</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 1 : printf(&quot;Doing mbox-flash V1 tests\n&quot;);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : </a>
+<a name="292"><span class="lineNum"> 292 </span> : : /* run test */</a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 1 : mbox_flash_init(&amp;bl);</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 1 : rc = run_flash_test(bl);</span></a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="297"><span class="lineNum"> 297 </span> : : /*</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * Trick mbox-flash into thinking there was a reboot so we can</a>
+<a name="299"><span class="lineNum"> 299 </span> : : * switch to v2</a>
+<a name="300"><span class="lineNum"> 300 </span> : : */</a>
+<a name="301"><span class="lineNum"> 301 </span> : : </a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 1 : printf(&quot;Doing mbox-flash V2 tests\n&quot;);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 1 : mbox_server_reset(2, 12);</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : </a>
+<a name="306"><span class="lineNum"> 306 </span> : : /* Do all the tests again */</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 1 : rc = run_flash_test(bl);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="310"><span class="lineNum"> 310 </span> : : </a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 1 : mbox_server_reset(2, 17);</span></a>
+<a name="312"><span class="lineNum"> 312 </span> : : </a>
+<a name="313"><span class="lineNum"> 313 </span> : : /* Do all the tests again */</a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 1 : rc = run_flash_test(bl);</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> : : </a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 1 : printf(&quot;Doing mbox-flash V3 tests\n&quot;);</span></a>
+<a name="320"><span class="lineNum"> 320 </span> : : </a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 1 : mbox_server_reset(3, 20);</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : </a>
+<a name="323"><span class="lineNum"> 323 </span> : : /* Do all the tests again */</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 1 : rc = run_flash_test(bl);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> : : </a>
+<a name="326"><span class="lineNum"> 326 </span> : : </a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 1 : out:</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 1 : mbox_flash_exit(bl);</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 1 : mbox_server_destroy();</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/container.c.func-sort-c.html b/coverage-report/libstb/container.c.func-sort-c.html
new file mode 100644
index 0000000..81bd364
--- /dev/null
+++ b/coverage-report/libstb/container.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/container.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libstb</a> - container.c<span style="font-size: 80%;"> (<a href="container.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryLo">14.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="container.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#36">parse_stb_container</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#17">stb_payload_magic</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#64">stb_print_data</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#51">stb_sw_payload_hash</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#26">stb_sw_payload_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#5">stb_is_container</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/container.c.func.html b/coverage-report/libstb/container.c.func.html
new file mode 100644
index 0000000..6addaec
--- /dev/null
+++ b/coverage-report/libstb/container.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/container.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libstb</a> - container.c<span style="font-size: 80%;"> (<a href="container.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryLo">14.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="container.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#36">parse_stb_container</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#5">stb_is_container</a></td>
+ <td class="coverFnHi">17</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#17">stb_payload_magic</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#64">stb_print_data</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#51">stb_sw_payload_hash</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="container.c.gcov.html#26">stb_sw_payload_size</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/container.c.gcov.html b/coverage-report/libstb/container.c.gcov.html
new file mode 100644
index 0000000..f8be28d
--- /dev/null
+++ b/coverage-report/libstb/container.c.gcov.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/container.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">libstb</a> - container.c<span style="font-size: 80%;"> (source / <a href="container.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryLo">14.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2013-2016 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;container.h&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> :<span class="lineCov"> 17 : bool stb_is_container(const void *buf, size_t size)</span></a>
+<a name="8"><span class="lineNum"> 8 </span> : : {</a>
+<a name="9"><span class="lineNum"> 9 </span> : : ROM_container_raw *c;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineCov"> 17 : c = (ROM_container_raw*) buf;</span></a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 17 : if (!buf || size &lt; SECURE_BOOT_HEADERS_SIZE)</span></a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 6 : return false;</span></a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 11 : if (be32_to_cpu(c-&gt;magic_number) != ROM_MAGIC_NUMBER )</span></a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 10 : return false;</span></a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1 : return true;</span></a>
+<a name="17"><span class="lineNum"> 17 </span> : : }</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : uint32_t stb_payload_magic(const void *buf, size_t size)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : {</a>
+<a name="21"><span class="lineNum"> 21 </span> : : uint8_t *p;</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineNoCov"> 0 : if (!stb_is_container(buf, size))</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : p = (uint8_t*) buf;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineNoCov"> 0 : return be32_to_cpu(*(be32*)(p+SECURE_BOOT_HEADERS_SIZE));</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : }</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : uint64_t stb_sw_payload_size(const void *buf, size_t size)</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : struct parsed_stb_container c;</a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : if (!stb_is_container(buf, size))</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineNoCov"> 0 : if (parse_stb_container(buf, size, &amp;c) != 0)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return be64_to_cpu(c.sh-&gt;payload_size);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : }</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineNoCov"> 0 : int parse_stb_container(const void* data, size_t len, struct parsed_stb_container *c)</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : {</a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineNoCov"> 0 : const size_t prefix_data_min_size = 3 * (EC_COORDBYTES * 2);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineNoCov"> 0 : c-&gt;buf = data;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineNoCov"> 0 : c-&gt;bufsz = len;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : c-&gt;c = data;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : c-&gt;ph = data += sizeof(ROM_container_raw);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineNoCov"> 0 : c-&gt;pd = data += sizeof(ROM_prefix_header_raw) + (c-&gt;ph-&gt;ecid_count * ECID_SIZE);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineNoCov"> 0 : c-&gt;sh = data += prefix_data_min_size + c-&gt;ph-&gt;sw_key_count * (EC_COORDBYTES * 2);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineNoCov"> 0 : c-&gt;ssig = data += sizeof(ROM_sw_header_raw) +</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : c-&gt;sh-&gt;ecid_count * ECID_SIZE;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : const uint8_t* stb_sw_payload_hash(const void *buf, size_t size)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : {</a>
+<a name="55"><span class="lineNum"> 55 </span> : : struct parsed_stb_container c;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : if (!stb_is_container(buf, size))</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : if (parse_stb_container(buf, size, &amp;c) != 0)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineNoCov"> 0 : return c.sh-&gt;payload_hash;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : }</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : void stb_print_data(const void* data, size_t len)</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : char hash[1+SHA512_DIGEST_LENGTH*2];</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : char *h = hash;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineNoCov"> 0 : char *d = (char*)data;</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineNoCov"> 0 : assert(len &lt;= SHA512_DIGEST_LENGTH);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : while(len) {</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineNoCov"> 0 : snprintf(h, 3, &quot;%02x&quot;, *d);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : h+=2;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : d++;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : len--;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : }</a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : *h='\0';</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineNoCov"> 0 : prlog(PR_NOTICE, &quot;%s\n&quot;, hash);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineNoCov"> 0 : }</span></a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/crypto/pkcs7/index-sort-b.html b/coverage-report/libstb/crypto/pkcs7/index-sort-b.html
new file mode 100644
index 0000000..f1778ed
--- /dev/null
+++ b/coverage-report/libstb/crypto/pkcs7/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/crypto/pkcs7</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/crypto/pkcs7</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntry">222</td>
+ <td class="headerCovTableEntryLo">73.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pkcs7.c.gcov.html">pkcs7.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=73 height=10 alt="73.4%"><img src="../../../snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/crypto/pkcs7/index-sort-f.html b/coverage-report/libstb/crypto/pkcs7/index-sort-f.html
new file mode 100644
index 0000000..cf9a083
--- /dev/null
+++ b/coverage-report/libstb/crypto/pkcs7/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/crypto/pkcs7</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/crypto/pkcs7</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntry">222</td>
+ <td class="headerCovTableEntryLo">73.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pkcs7.c.gcov.html">pkcs7.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=73 height=10 alt="73.4%"><img src="../../../snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/crypto/pkcs7/index-sort-l.html b/coverage-report/libstb/crypto/pkcs7/index-sort-l.html
new file mode 100644
index 0000000..55dcf16
--- /dev/null
+++ b/coverage-report/libstb/crypto/pkcs7/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/crypto/pkcs7</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/crypto/pkcs7</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntry">222</td>
+ <td class="headerCovTableEntryLo">73.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pkcs7.c.gcov.html">pkcs7.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=73 height=10 alt="73.4%"><img src="../../../snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/crypto/pkcs7/index.html b/coverage-report/libstb/crypto/pkcs7/index.html
new file mode 100644
index 0000000..edb8ed3
--- /dev/null
+++ b/coverage-report/libstb/crypto/pkcs7/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/crypto/pkcs7</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/crypto/pkcs7</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntry">222</td>
+ <td class="headerCovTableEntryLo">73.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="pkcs7.c.gcov.html">pkcs7.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=73 height=10 alt="73.4%"><img src="../../../snow.png" width=27 height=10 alt="73.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">73.4&nbsp;%</td>
+ <td class="coverNumLo">163 / 222</td>
+ <td class="coverPerHi">92.9&nbsp;%</td>
+ <td class="coverNumHi">13 / 14</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/crypto/pkcs7/pkcs7.c.func-sort-c.html b/coverage-report/libstb/crypto/pkcs7/pkcs7.c.func-sort-c.html
new file mode 100644
index 0000000..8eb7b12
--- /dev/null
+++ b/coverage-report/libstb/crypto/pkcs7/pkcs7.c.func-sort-c.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/crypto/pkcs7/pkcs7.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/crypto/pkcs7</a> - pkcs7.c<span style="font-size: 80%;"> (<a href="pkcs7.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntry">222</td>
+ <td class="headerCovTableEntryLo">73.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="pkcs7.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#514">mbedtls_pkcs7_signed_data_verify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#105">pkcs7_get_next_content_len</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#571">mbedtls_pkcs7_free</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#100">mbedtls_pkcs7_init</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#446">mbedtls_pkcs7_parse_der</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#218">pkcs7_get_certificates</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#187">pkcs7_get_digest_algorithm_set</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#269">pkcs7_get_signature</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#383">pkcs7_get_signed_data</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#301">pkcs7_get_signers_info_set</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#123">pkcs7_get_version</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#548">mbedtls_pkcs7_signed_hash_verify</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#143">pkcs7_get_content_info_type</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#173">pkcs7_get_digest_algorithm</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/crypto/pkcs7/pkcs7.c.func.html b/coverage-report/libstb/crypto/pkcs7/pkcs7.c.func.html
new file mode 100644
index 0000000..783e41a
--- /dev/null
+++ b/coverage-report/libstb/crypto/pkcs7/pkcs7.c.func.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/crypto/pkcs7/pkcs7.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/crypto/pkcs7</a> - pkcs7.c<span style="font-size: 80%;"> (<a href="pkcs7.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntry">222</td>
+ <td class="headerCovTableEntryLo">73.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="pkcs7.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#571">mbedtls_pkcs7_free</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#100">mbedtls_pkcs7_init</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#446">mbedtls_pkcs7_parse_der</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#514">mbedtls_pkcs7_signed_data_verify</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#548">mbedtls_pkcs7_signed_hash_verify</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#218">pkcs7_get_certificates</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#143">pkcs7_get_content_info_type</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#173">pkcs7_get_digest_algorithm</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#187">pkcs7_get_digest_algorithm_set</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#105">pkcs7_get_next_content_len</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#269">pkcs7_get_signature</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#383">pkcs7_get_signed_data</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#301">pkcs7_get_signers_info_set</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="pkcs7.c.gcov.html#123">pkcs7_get_version</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/crypto/pkcs7/pkcs7.c.gcov.html b/coverage-report/libstb/crypto/pkcs7/pkcs7.c.gcov.html
new file mode 100644
index 0000000..cfe5f6d
--- /dev/null
+++ b/coverage-report/libstb/crypto/pkcs7/pkcs7.c.gcov.html
@@ -0,0 +1,681 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/crypto/pkcs7/pkcs7.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/crypto/pkcs7</a> - pkcs7.c<span style="font-size: 80%;"> (source / <a href="pkcs7.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">163</td>
+ <td class="headerCovTableEntry">222</td>
+ <td class="headerCovTableEntryLo">73.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">14</td>
+ <td class="headerCovTableEntryHi">92.9 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Copyright 2019 IBM Corp.</a>
+<a name="2"><span class="lineNum"> 2 </span> : : *</a>
+<a name="3"><span class="lineNum"> 3 </span> : : * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</a>
+<a name="4"><span class="lineNum"> 4 </span> : : * you may not use this file except in compliance with the License.</a>
+<a name="5"><span class="lineNum"> 5 </span> : : * You may obtain a copy of the License at</a>
+<a name="6"><span class="lineNum"> 6 </span> : : *</a>
+<a name="7"><span class="lineNum"> 7 </span> : : * http://www.apache.org/licenses/LICENSE-2.0</a>
+<a name="8"><span class="lineNum"> 8 </span> : : *</a>
+<a name="9"><span class="lineNum"> 9 </span> : : * Unless required by applicable law or agreed to in writing, software</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</a>
+<a name="11"><span class="lineNum"> 11 </span> : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or</a>
+<a name="12"><span class="lineNum"> 12 </span> : : * implied.</a>
+<a name="13"><span class="lineNum"> 13 </span> : : * See the License for the specific language governing permissions and</a>
+<a name="14"><span class="lineNum"> 14 </span> : : * limitations under the License.</a>
+<a name="15"><span class="lineNum"> 15 </span> : : */</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #if !defined(MBEDTLS_CONFIG_FILE)</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;mbedtls/config.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #else</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include MBEDTLS_CONFIG_FILE</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #endif</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #if defined(MBEDTLS_PKCS7_C)</a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &quot;mbedtls/x509.h&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &quot;mbedtls/asn1.h&quot;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &quot;pkcs7.h&quot;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &quot;mbedtls/x509_crt.h&quot;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #include &quot;mbedtls/x509_crl.h&quot;</a>
+<a name="29"><span class="lineNum"> 29 </span> : : #include &quot;mbedtls/oid.h&quot;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="32"><span class="lineNum"> 32 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : #include &lt;string.h&gt;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : #if defined(MBEDTLS_FS_IO)</a>
+<a name="35"><span class="lineNum"> 35 </span> : : #include &lt;sys/types.h&gt;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #include &lt;sys/stat.h&gt;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : #endif</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : #if defined(MBEDTLS_PLATFORM_C)</a>
+<a name="41"><span class="lineNum"> 41 </span> : : #include &quot;mbedtls/platform.h&quot;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : #include &quot;mbedtls/platform_util.h&quot;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : #else</a>
+<a name="44"><span class="lineNum"> 44 </span> : : #include &lt;stdio.h&gt;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : #define mbedtls_free free</a>
+<a name="47"><span class="lineNum"> 47 </span> : : #define mbedtls_calloc calloc</a>
+<a name="48"><span class="lineNum"> 48 </span> : : #define mbedtls_printf printf</a>
+<a name="49"><span class="lineNum"> 49 </span> : : #define mbedtls_snprintf snprintf</a>
+<a name="50"><span class="lineNum"> 50 </span> : : #endif</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> : : #if defined(MBEDTLS_HAVE_TIME)</a>
+<a name="53"><span class="lineNum"> 53 </span> : : #include &quot;mbedtls/platform_time.h&quot;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : #endif</a>
+<a name="55"><span class="lineNum"> 55 </span> : : #if defined(MBEDTLS_HAVE_TIME_DATE)</a>
+<a name="56"><span class="lineNum"> 56 </span> : : #include &lt;time.h&gt;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : #endif</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> : : #if defined(MBEDTLS_FS_IO)</a>
+<a name="60"><span class="lineNum"> 60 </span> : : /*</a>
+<a name="61"><span class="lineNum"> 61 </span> : : * Load all data from a file into a given buffer.</a>
+<a name="62"><span class="lineNum"> 62 </span> : : *</a>
+<a name="63"><span class="lineNum"> 63 </span> : : * The file is expected to contain DER encoded data.</a>
+<a name="64"><span class="lineNum"> 64 </span> : : * A terminating null byte is always appended.</a>
+<a name="65"><span class="lineNum"> 65 </span> : : */</a>
+<a name="66"><span class="lineNum"> 66 </span> : : int mbedtls_pkcs7_load_file( const char *path, unsigned char **buf, size_t *n )</a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : FILE *file;</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : if( ( file = fopen( path, &quot;rb&quot; ) ) == NULL )</a>
+<a name="71"><span class="lineNum"> 71 </span> : : return( MBEDTLS_ERR_PKCS7_FILE_IO_ERROR );</a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : fseek( file, 0, SEEK_END );</a>
+<a name="74"><span class="lineNum"> 74 </span> : : *n = (size_t) ftell( file );</a>
+<a name="75"><span class="lineNum"> 75 </span> : : fseek( file, 0, SEEK_SET );</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : *buf = mbedtls_calloc( 1, *n + 1 );</a>
+<a name="78"><span class="lineNum"> 78 </span> : : if( *buf == NULL )</a>
+<a name="79"><span class="lineNum"> 79 </span> : : return( MBEDTLS_ERR_PKCS7_ALLOC_FAILED );</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> : : if( fread( *buf, 1, *n, file ) != *n )</a>
+<a name="82"><span class="lineNum"> 82 </span> : : {</a>
+<a name="83"><span class="lineNum"> 83 </span> : : fclose( file );</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> : : mbedtls_platform_zeroize( *buf, *n + 1 );</a>
+<a name="86"><span class="lineNum"> 86 </span> : : mbedtls_free( *buf );</a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : return( MBEDTLS_ERR_PKCS7_FILE_IO_ERROR );</a>
+<a name="89"><span class="lineNum"> 89 </span> : : }</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : fclose( file );</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> : : (*buf)[*n] = '\0';</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : return( 0 );</a>
+<a name="96"><span class="lineNum"> 96 </span> : : }</a>
+<a name="97"><span class="lineNum"> 97 </span> : : #endif</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : /**</a>
+<a name="100"><span class="lineNum"> 100 </span> : : * Initializes the pkcs7 structure.</a>
+<a name="101"><span class="lineNum"> 101 </span> : : */</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 14 : void mbedtls_pkcs7_init( mbedtls_pkcs7 *pkcs7 )</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : {</a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 14 : memset( pkcs7, 0, sizeof( mbedtls_pkcs7 ) );</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 14 : }</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 12 : static int pkcs7_get_next_content_len( unsigned char **p, unsigned char *end,</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : size_t *len )</a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> : : int ret;</a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 12 : if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ) != 0 )</a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_FORMAT + ret );</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : }</a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 12 : return( 0 );</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : }</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : /**</a>
+<a name="122"><span class="lineNum"> 122 </span> : : * version Version</a>
+<a name="123"><span class="lineNum"> 123 </span> : : * Version ::= INTEGER</a>
+<a name="124"><span class="lineNum"> 124 </span> : : **/</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 14 : static int pkcs7_get_version( unsigned char **p, unsigned char *end, int *ver )</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : {</a>
+<a name="127"><span class="lineNum"> 127 </span> : : int ret;</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 14 : if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 )</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_FORMAT + ret );</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : </a>
+<a name="132"><span class="lineNum"> 132 </span> : : /* If version != 1, return invalid version */</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 14 : if( *ver != MBEDTLS_PKCS7_SUPPORTED_VERSION )</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_VERSION );</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 14 : return( 0 );</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : }</a>
+<a name="138"><span class="lineNum"> 138 </span> : : </a>
+<a name="139"><span class="lineNum"> 139 </span> : : /**</a>
+<a name="140"><span class="lineNum"> 140 </span> : : * ContentInfo ::= SEQUENCE {</a>
+<a name="141"><span class="lineNum"> 141 </span> : : * contentType ContentType,</a>
+<a name="142"><span class="lineNum"> 142 </span> : : * content</a>
+<a name="143"><span class="lineNum"> 143 </span> : : * [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : **/</a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 28 : static int pkcs7_get_content_info_type( unsigned char **p, unsigned char *end,</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : mbedtls_pkcs7_buf *pkcs7 )</a>
+<a name="147"><span class="lineNum"> 147 </span> : : {</a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 28 : size_t len = 0;</span></a>
+<a name="149"><span class="lineNum"> 149 </span> : : int ret;</a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 28 : unsigned char *start = *p;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 28 : ret = mbedtls_asn1_get_tag( p, end, &amp;len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : | MBEDTLS_ASN1_SEQUENCE );</a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 28 : if( ret != 0 )</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO + ret );</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 28 : ret = mbedtls_asn1_get_tag( p, end, &amp;len, MBEDTLS_ASN1_OID );</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 28 : if( ret != 0 ) {</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 2 : *p = start;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 2 : return( MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO + ret );</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : }</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 26 : pkcs7-&gt;tag = MBEDTLS_ASN1_OID;</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 26 : pkcs7-&gt;len = len;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 26 : pkcs7-&gt;p = *p;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> : : </a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 26 : return( ret );</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : }</a>
+<a name="169"><span class="lineNum"> 169 </span> : : </a>
+<a name="170"><span class="lineNum"> 170 </span> : : /**</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * DigestAlgorithmIdentifier ::= AlgorithmIdentifier</a>
+<a name="172"><span class="lineNum"> 172 </span> : : *</a>
+<a name="173"><span class="lineNum"> 173 </span> : : * This is from x509.h</a>
+<a name="174"><span class="lineNum"> 174 </span> : : **/</a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 28 : static int pkcs7_get_digest_algorithm( unsigned char **p, unsigned char *end,</span></a>
+<a name="176"><span class="lineNum"> 176 </span> : : mbedtls_x509_buf *alg )</a>
+<a name="177"><span class="lineNum"> 177 </span> : : {</a>
+<a name="178"><span class="lineNum"> 178 </span> : : int ret;</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 28 : if( ( ret = mbedtls_asn1_get_alg_null( p, end, alg ) ) != 0 )</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_ALG + ret );</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 28 : return( 0 );</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : }</a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> : : /**</a>
+<a name="187"><span class="lineNum"> 187 </span> : : * DigestAlgorithmIdentifiers :: SET of DigestAlgorithmIdentifier</a>
+<a name="188"><span class="lineNum"> 188 </span> : : **/</a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 14 : static int pkcs7_get_digest_algorithm_set( unsigned char **p,</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : unsigned char *end,</a>
+<a name="191"><span class="lineNum"> 191 </span> : : mbedtls_x509_buf *alg )</a>
+<a name="192"><span class="lineNum"> 192 </span> : : {</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 14 : size_t len = 0;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : int ret;</a>
+<a name="195"><span class="lineNum"> 195 </span> : : </a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( p, end, &amp;len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="197"><span class="lineNum"> 197 </span> : : | MBEDTLS_ASN1_SET );</a>
+<a name="198"><span class="lineNum"> 198 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_ALG + ret );</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 14 : end = *p + len;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : /** For now, it assumes there is only one digest algorithm specified **/</a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_alg_null( p, end, alg );</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_ALG + ret );</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 14 : if (*p != end)</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineNoCov"> 0 : return ( MBEDTLS_ERR_PKCS7_INVALID_FORMAT );</span></a>
+<a name="210"><span class="lineNum"> 210 </span> : : </a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 14 : return( 0 );</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : }</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> : : /**</a>
+<a name="215"><span class="lineNum"> 215 </span> : : * certificates :: SET OF ExtendedCertificateOrCertificate,</a>
+<a name="216"><span class="lineNum"> 216 </span> : : * ExtendedCertificateOrCertificate ::= CHOICE {</a>
+<a name="217"><span class="lineNum"> 217 </span> : : * certificate Certificate -- x509,</a>
+<a name="218"><span class="lineNum"> 218 </span> : : * extendedCertificate[0] IMPLICIT ExtendedCertificate }</a>
+<a name="219"><span class="lineNum"> 219 </span> : : **/</a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 14 : static int pkcs7_get_certificates( unsigned char **p, unsigned char *end,</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : mbedtls_x509_crt *certs )</a>
+<a name="222"><span class="lineNum"> 222 </span> : : {</a>
+<a name="223"><span class="lineNum"> 223 </span> : : int ret;</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 14 : size_t len1 = 0;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 14 : size_t len2 = 0;</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : unsigned char *end_set, *end_cert;</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 14 : unsigned char *start = *p;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 14 : if( ( ret = mbedtls_asn1_get_tag( p, end, &amp;len1, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="230"><span class="lineNum"> 230 </span> : : | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ) != 0 )</a>
+<a name="231"><span class="lineNum"> 231 </span> : : {</a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineNoCov"> 0 : if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineNoCov"> 0 : return( 0 );</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_FORMAT + ret );</span></a>
+<a name="236"><span class="lineNum"> 236 </span> : : }</a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 14 : start = *p;</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 14 : end_set = *p + len1;</span></a>
+<a name="239"><span class="lineNum"> 239 </span> : : </a>
+<a name="240"><span class="lineNum"> 240 </span> : : /* This is to verify that there is only signer certificate, it can</a>
+<a name="241"><span class="lineNum"> 241 </span> : : have its chain though. */</a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( p, end_set, &amp;len2, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : | MBEDTLS_ASN1_SEQUENCE );</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_FORMAT + ret );</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 14 : end_cert = *p + len2;</span></a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 14 : if (end_cert != end_set)</span></a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineNoCov"> 0 : return (MBEDTLS_ERR_PKCS7_INVALID_FORMAT);</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : </a>
+<a name="252"><span class="lineNum"> 252 </span> : : /* Since it satisfies the condition of single signer, continue parsing */</a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 14 : *p = start;</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 14 : if( ( ret = mbedtls_x509_crt_parse( certs, *p, len1 ) ) &lt; 0 )</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : </a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 14 : *p = *p + len1;</span></a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> : : /**</a>
+<a name="260"><span class="lineNum"> 260 </span> : : * Currently we do not check for certificate chain, so we are not handling</a>
+<a name="261"><span class="lineNum"> 261 </span> : : * &quot;&gt; 0&quot; case. Return if atleast one certificate in the chain is correctly</a>
+<a name="262"><span class="lineNum"> 262 </span> : : * parsed.</a>
+<a name="263"><span class="lineNum"> 263 </span> : : **/</a>
+<a name="264"><span class="lineNum"> 264 </span> : : </a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 14 : return( 0 );</span></a>
+<a name="266"><span class="lineNum"> 266 </span> : : }</a>
+<a name="267"><span class="lineNum"> 267 </span> : : </a>
+<a name="268"><span class="lineNum"> 268 </span> : : /**</a>
+<a name="269"><span class="lineNum"> 269 </span> : : * EncryptedDigest ::= OCTET STRING</a>
+<a name="270"><span class="lineNum"> 270 </span> : : **/</a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 14 : static int pkcs7_get_signature( unsigned char **p, unsigned char *end,</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : mbedtls_pkcs7_buf *signature )</a>
+<a name="273"><span class="lineNum"> 273 </span> : : {</a>
+<a name="274"><span class="lineNum"> 274 </span> : : int ret;</a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 14 : size_t len = 0;</span></a>
+<a name="276"><span class="lineNum"> 276 </span> : : </a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( p, end, &amp;len, MBEDTLS_ASN1_OCTET_STRING );</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_SIGNATURE + ret );</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 14 : signature-&gt;tag = MBEDTLS_ASN1_OCTET_STRING;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 14 : signature-&gt;len = len;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 14 : signature-&gt;p = *p;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : </a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 14 : *p = *p + len;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 14 : return( 0 );</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : }</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> : : /**</a>
+<a name="291"><span class="lineNum"> 291 </span> : : * SignerInfos ::= SET of SignerInfo</a>
+<a name="292"><span class="lineNum"> 292 </span> : : * SignerInfo ::= SEQUENCE {</a>
+<a name="293"><span class="lineNum"> 293 </span> : : * version Version;</a>
+<a name="294"><span class="lineNum"> 294 </span> : : * issuerAndSerialNumber IssuerAndSerialNumber,</a>
+<a name="295"><span class="lineNum"> 295 </span> : : * digestAlgorithm DigestAlgorithmIdentifier,</a>
+<a name="296"><span class="lineNum"> 296 </span> : : * authenticatedAttributes</a>
+<a name="297"><span class="lineNum"> 297 </span> : : * [0] IMPLICIT Attributes OPTIONAL,</a>
+<a name="298"><span class="lineNum"> 298 </span> : : * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,</a>
+<a name="299"><span class="lineNum"> 299 </span> : : * encryptedDigest EncryptedDigest,</a>
+<a name="300"><span class="lineNum"> 300 </span> : : * unauthenticatedAttributes</a>
+<a name="301"><span class="lineNum"> 301 </span> : : * [1] IMPLICIT Attributes OPTIONAL,</a>
+<a name="302"><span class="lineNum"> 302 </span> : : **/</a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 14 : static int pkcs7_get_signers_info_set( unsigned char **p, unsigned char *end,</span></a>
+<a name="304"><span class="lineNum"> 304 </span> : : mbedtls_pkcs7_signer_info *signers_set )</a>
+<a name="305"><span class="lineNum"> 305 </span> : : {</a>
+<a name="306"><span class="lineNum"> 306 </span> : : unsigned char *end_set;</a>
+<a name="307"><span class="lineNum"> 307 </span> : : int ret;</a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 14 : size_t len = 0;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( p, end, &amp;len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="311"><span class="lineNum"> 311 </span> : : | MBEDTLS_ASN1_SET );</a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO + ret );</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : </a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 14 : end_set = *p + len;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( p, end_set, &amp;len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="318"><span class="lineNum"> 318 </span> : : | MBEDTLS_ASN1_SEQUENCE );</a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO + ret );</span></a>
+<a name="321"><span class="lineNum"> 321 </span> : : </a>
+<a name="322"><span class="lineNum"> 322 </span> :<span class="lineCov"> 14 : end_set = *p + len;</span></a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_int( p, end_set, &amp;signers_set-&gt;version );</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO + ret );</span></a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( p, end_set, &amp;len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : | MBEDTLS_ASN1_SEQUENCE );</a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO + ret );</span></a>
+<a name="332"><span class="lineNum"> 332 </span> : : </a>
+<a name="333"><span class="lineNum"> 333 </span> : : /* Parsing IssuerAndSerialNumber */</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 14 : signers_set-&gt;issuer_raw.p = *p;</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( p, end_set, &amp;len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : | MBEDTLS_ASN1_SEQUENCE );</a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO + ret );</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : </a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 14 : ret = mbedtls_x509_get_name( p, *p + len, &amp;signers_set-&gt;issuer );</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 14 : signers_set-&gt;issuer_raw.len = *p - signers_set-&gt;issuer_raw.p;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> : : </a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 14 : ret = mbedtls_x509_get_serial( p, end_set, &amp;signers_set-&gt;serial );</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="350"><span class="lineNum"> 350 </span> : : </a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_digest_algorithm( p, end_set,</span></a>
+<a name="352"><span class="lineNum"> 352 </span> : : &amp;signers_set-&gt;alg_identifier );</a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="355"><span class="lineNum"> 355 </span> : : </a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_digest_algorithm( p, end_set,</span></a>
+<a name="357"><span class="lineNum"> 357 </span> : : &amp;signers_set-&gt;sig_alg_identifier );</a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_signature( p, end_set, &amp;signers_set-&gt;sig );</span></a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : </a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 14 : signers_set-&gt;next = NULL;</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : </a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 14 : if (*p != end_set)</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineNoCov"> 0 : return ( MBEDTLS_ERR_PKCS7_INVALID_SIGNER_INFO );</span></a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 14 : return( 0 );</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : }</a>
+<a name="372"><span class="lineNum"> 372 </span> : : </a>
+<a name="373"><span class="lineNum"> 373 </span> : : /**</a>
+<a name="374"><span class="lineNum"> 374 </span> : : * SignedData ::= SEQUENCE {</a>
+<a name="375"><span class="lineNum"> 375 </span> : : * version Version,</a>
+<a name="376"><span class="lineNum"> 376 </span> : : * digestAlgorithms DigestAlgorithmIdentifiers,</a>
+<a name="377"><span class="lineNum"> 377 </span> : : * contentInfo ContentInfo,</a>
+<a name="378"><span class="lineNum"> 378 </span> : : * certificates</a>
+<a name="379"><span class="lineNum"> 379 </span> : : * [0] IMPLICIT ExtendedCertificatesAndCertificates</a>
+<a name="380"><span class="lineNum"> 380 </span> : : * OPTIONAL,</a>
+<a name="381"><span class="lineNum"> 381 </span> : : * crls</a>
+<a name="382"><span class="lineNum"> 382 </span> : : * [0] IMPLICIT CertificateRevocationLists OPTIONAL,</a>
+<a name="383"><span class="lineNum"> 383 </span> : : * signerInfos SignerInfos }</a>
+<a name="384"><span class="lineNum"> 384 </span> : : */</a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 14 : static int pkcs7_get_signed_data( unsigned char *buf, size_t buflen,</span></a>
+<a name="386"><span class="lineNum"> 386 </span> : : mbedtls_pkcs7_signed_data *signed_data )</a>
+<a name="387"><span class="lineNum"> 387 </span> : : {</a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineCov"> 14 : unsigned char *p = buf;</span></a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 14 : unsigned char *end = buf + buflen;</span></a>
+<a name="390"><span class="lineNum"> 390 </span> : : unsigned char *end_set;</a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 14 : size_t len = 0;</span></a>
+<a name="392"><span class="lineNum"> 392 </span> : : int ret;</a>
+<a name="393"><span class="lineNum"> 393 </span> : : mbedtls_md_type_t md_alg;</a>
+<a name="394"><span class="lineNum"> 394 </span> : : </a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 14 : ret = mbedtls_asn1_get_tag( &amp;p, end, &amp;len, MBEDTLS_ASN1_CONSTRUCTED</span></a>
+<a name="396"><span class="lineNum"> 396 </span> : : | MBEDTLS_ASN1_SEQUENCE );</a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_FORMAT + ret );</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : </a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 14 : end_set = p + len;</span></a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> : : /* Get version of signed data */</a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_version( &amp;p, end_set, &amp;signed_data-&gt;version );</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* Get digest algorithm */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_digest_algorithm_set( &amp;p, end_set,</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 14 : &amp;signed_data-&gt;digest_alg_identifiers );</span></a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 14 : ret = mbedtls_oid_get_md_alg( &amp;signed_data-&gt;digest_alg_identifiers, &amp;md_alg );</span></a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_ALG + ret );</span></a>
+<a name="416"><span class="lineNum"> 416 </span> : : </a>
+<a name="417"><span class="lineNum"> 417 </span> : : /* Do not expect any content */</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_content_info_type( &amp;p, end_set, &amp;signed_data-&gt;content.oid );</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="421"><span class="lineNum"> 421 </span> : : </a>
+<a name="422"><span class="lineNum"> 422 </span> :<span class="lineCov"> 14 : if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_DATA, &amp;signed_data-&gt;content.oid ) )</span></a>
+<a name="423"><span class="lineNum"> 423 </span> : : {</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_CONTENT_INFO ) ;</span></a>
+<a name="425"><span class="lineNum"> 425 </span> : : }</a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 14 : p = p + signed_data-&gt;content.oid.len;</span></a>
+<a name="428"><span class="lineNum"> 428 </span> : : </a>
+<a name="429"><span class="lineNum"> 429 </span> : : /* Look for certificates, there may or may not be any */</a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 14 : mbedtls_x509_crt_init( &amp;signed_data-&gt;certs );</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_certificates( &amp;p, end_set, &amp;signed_data-&gt;certs );</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : return( ret ) ;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /* TODO: optional CRLs go here, currently no CRLs are expected */</a>
+<a name="436"><span class="lineNum"> 436 </span> : : </a>
+<a name="437"><span class="lineNum"> 437 </span> : : /* Get signers info */</a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_signers_info_set( &amp;p, end_set, &amp;signed_data-&gt;signers );</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 14 : if ( p != end )</span></a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : ret = MBEDTLS_ERR_PKCS7_INVALID_FORMAT;</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 14 : return( ret );</span></a>
+<a name="446"><span class="lineNum"> 446 </span> : : }</a>
+<a name="447"><span class="lineNum"> 447 </span> : : </a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 14 : int mbedtls_pkcs7_parse_der( const unsigned char *buf, const int buflen,</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : mbedtls_pkcs7 *pkcs7 )</a>
+<a name="450"><span class="lineNum"> 450 </span> : : {</a>
+<a name="451"><span class="lineNum"> 451 </span> : : unsigned char *start;</a>
+<a name="452"><span class="lineNum"> 452 </span> : : unsigned char *end;</a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 14 : size_t len = 0;</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : int ret;</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 14 : int isoidset = 0;</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : </a>
+<a name="457"><span class="lineNum"> 457 </span> : : /* use internal buffer for parsing */</a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 14 : start = (unsigned char *)buf;</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 14 : end = start + buflen;</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : </a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineCov"> 14 : if( !pkcs7 )</span></a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_BAD_INPUT_DATA );</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : </a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_content_info_type( &amp;start, end, &amp;pkcs7-&gt;content_type_oid );</span></a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineCov"> 14 : if( ret != 0 )</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : {</a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 2 : len = buflen;</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineCov"> 2 : goto try_data;</span></a>
+<a name="469"><span class="lineNum"> 469 </span> : : }</a>
+<a name="470"><span class="lineNum"> 470 </span> : : </a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineCov"> 12 : if( ! MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_DATA, &amp;pkcs7-&gt;content_type_oid )</span></a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 12 : || ! MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_ENCRYPTED_DATA, &amp;pkcs7-&gt;content_type_oid )</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 12 : || ! MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_ENVELOPED_DATA, &amp;pkcs7-&gt;content_type_oid )</span></a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 12 : || ! MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_SIGNED_AND_ENVELOPED_DATA, &amp;pkcs7-&gt;content_type_oid )</span></a>
+<a name="475"><span class="lineNum"> 475 </span> :<span class="lineCov"> 12 : || ! MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_DIGESTED_DATA, &amp;pkcs7-&gt;content_type_oid )</span></a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 12 : || ! MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_ENCRYPTED_DATA, &amp;pkcs7-&gt;content_type_oid ) )</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : {</a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineNoCov"> 0 : ret = MBEDTLS_ERR_PKCS7_FEATURE_UNAVAILABLE;</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : }</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 12 : if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS7_SIGNED_DATA, &amp;pkcs7-&gt;content_type_oid ) )</span></a>
+<a name="483"><span class="lineNum"> 483 </span> : : {</a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineNoCov"> 0 : ret = MBEDTLS_ERR_PKCS7_BAD_INPUT_DATA;</span></a>
+<a name="485"><span class="lineNum"> 485 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="486"><span class="lineNum"> 486 </span> : : }</a>
+<a name="487"><span class="lineNum"> 487 </span> : : </a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineCov"> 12 : isoidset = 1;</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 12 : start = start + pkcs7-&gt;content_type_oid.len;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> : : </a>
+<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 12 : ret = pkcs7_get_next_content_len( &amp;start, end, &amp;len );</span></a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 12 : if( ret != 0 )</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="494"><span class="lineNum"> 494 </span> : : </a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineCov"> 12 : try_data:</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineCov"> 14 : ret = pkcs7_get_signed_data( start, len, &amp;pkcs7-&gt;signed_data );</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 14 : if (ret != 0)</span></a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="499"><span class="lineNum"> 499 </span> : : </a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineCov"> 14 : if (!isoidset)</span></a>
+<a name="501"><span class="lineNum"> 501 </span> : : {</a>
+<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 2 : pkcs7-&gt;content_type_oid.tag = MBEDTLS_ASN1_OID;</span></a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 2 : pkcs7-&gt;content_type_oid.len = MBEDTLS_OID_SIZE(MBEDTLS_OID_PKCS7_SIGNED_DATA);</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 2 : pkcs7-&gt;content_type_oid.p = (unsigned char *)MBEDTLS_OID_PKCS7_SIGNED_DATA;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> :<span class="lineCov"> 14 : ret = MBEDTLS_PKCS7_SIGNED_DATA;</span></a>
+<a name="508"><span class="lineNum"> 508 </span> : : </a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 14 : out:</span></a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 14 : if ( ret &lt; 0 )</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : mbedtls_pkcs7_free( pkcs7 );</span></a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineCov"> 14 : return( ret );</span></a>
+<a name="514"><span class="lineNum"> 514 </span> : : }</a>
+<a name="515"><span class="lineNum"> 515 </span> : : </a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : int mbedtls_pkcs7_signed_data_verify( mbedtls_pkcs7 *pkcs7,</span></a>
+<a name="517"><span class="lineNum"> 517 </span> : : mbedtls_x509_crt *cert,</a>
+<a name="518"><span class="lineNum"> 518 </span> : : const unsigned char *data,</a>
+<a name="519"><span class="lineNum"> 519 </span> : : size_t datalen )</a>
+<a name="520"><span class="lineNum"> 520 </span> : : {</a>
+<a name="521"><span class="lineNum"> 521 </span> : : </a>
+<a name="522"><span class="lineNum"> 522 </span> : : int ret;</a>
+<a name="523"><span class="lineNum"> 523 </span> : : unsigned char *hash;</a>
+<a name="524"><span class="lineNum"> 524 </span> :<span class="lineNoCov"> 0 : mbedtls_pk_context pk_cxt = cert-&gt;pk;</span></a>
+<a name="525"><span class="lineNum"> 525 </span> : : const mbedtls_md_info_t *md_info;</a>
+<a name="526"><span class="lineNum"> 526 </span> : : mbedtls_md_type_t md_alg;</a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : ret = mbedtls_oid_get_md_alg( &amp;pkcs7-&gt;signed_data.digest_alg_identifiers, &amp;md_alg );</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : if( ret != 0 )</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_ALG + ret );</span></a>
+<a name="531"><span class="lineNum"> 531 </span> : : </a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineNoCov"> 0 : md_info = mbedtls_md_info_from_type( md_alg );</span></a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineNoCov"> 0 : hash = mbedtls_calloc( mbedtls_md_get_size( md_info ), 1 );</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineNoCov"> 0 : if( hash == NULL ) {</span></a>
+<a name="536"><span class="lineNum"> 536 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_ALLOC_FAILED );</span></a>
+<a name="537"><span class="lineNum"> 537 </span> : : }</a>
+<a name="538"><span class="lineNum"> 538 </span> : : </a>
+<a name="539"><span class="lineNum"> 539 </span> :<span class="lineNoCov"> 0 : mbedtls_md( md_info, data, datalen, hash );</span></a>
+<a name="540"><span class="lineNum"> 540 </span> : : </a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineNoCov"> 0 : ret = mbedtls_pk_verify( &amp;pk_cxt, md_alg, hash, sizeof(hash),</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineNoCov"> 0 : pkcs7-&gt;signed_data.signers.sig.p,</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : pkcs7-&gt;signed_data.signers.sig.len );</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineNoCov"> 0 : mbedtls_free( hash );</span></a>
+<a name="546"><span class="lineNum"> 546 </span> : : </a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineNoCov"> 0 : return( ret );</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : }</a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineCov"> 16 : int mbedtls_pkcs7_signed_hash_verify( mbedtls_pkcs7 *pkcs7,</span></a>
+<a name="551"><span class="lineNum"> 551 </span> : : mbedtls_x509_crt *cert,</a>
+<a name="552"><span class="lineNum"> 552 </span> : : const unsigned char *hash, int hashlen)</a>
+<a name="553"><span class="lineNum"> 553 </span> : : {</a>
+<a name="554"><span class="lineNum"> 554 </span> : : int ret;</a>
+<a name="555"><span class="lineNum"> 555 </span> : : mbedtls_md_type_t md_alg;</a>
+<a name="556"><span class="lineNum"> 556 </span> : : mbedtls_pk_context pk_cxt;</a>
+<a name="557"><span class="lineNum"> 557 </span> : : </a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 16 : ret = mbedtls_oid_get_md_alg( &amp;pkcs7-&gt;signed_data.digest_alg_identifiers, &amp;md_alg );</span></a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 16 : if( ret != 0 )</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : return( MBEDTLS_ERR_PKCS7_INVALID_ALG + ret );</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : </a>
+<a name="562"><span class="lineNum"> 562 </span> :<span class="lineCov"> 16 : pk_cxt = cert-&gt;pk;</span></a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineCov"> 16 : ret = mbedtls_pk_verify( &amp;pk_cxt, md_alg, hash, hashlen,</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineCov"> 16 : pkcs7-&gt;signed_data.signers.sig.p,</span></a>
+<a name="565"><span class="lineNum"> 565 </span> : : pkcs7-&gt;signed_data.signers.sig.len );</a>
+<a name="566"><span class="lineNum"> 566 </span> : : </a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineCov"> 16 : return ( ret );</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : }</a>
+<a name="569"><span class="lineNum"> 569 </span> : : </a>
+<a name="570"><span class="lineNum"> 570 </span> : : /*</a>
+<a name="571"><span class="lineNum"> 571 </span> : : * Unallocate all pkcs7 data</a>
+<a name="572"><span class="lineNum"> 572 </span> : : */</a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineCov"> 14 : void mbedtls_pkcs7_free( mbedtls_pkcs7 *pkcs7 )</span></a>
+<a name="574"><span class="lineNum"> 574 </span> : : {</a>
+<a name="575"><span class="lineNum"> 575 </span> : : mbedtls_x509_name *name_cur;</a>
+<a name="576"><span class="lineNum"> 576 </span> : : mbedtls_x509_name *name_prv;</a>
+<a name="577"><span class="lineNum"> 577 </span> : : </a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineCov"> 14 : if( pkcs7 == NULL )</span></a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="580"><span class="lineNum"> 580 </span> : : </a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineCov"> 14 : mbedtls_x509_crt_free( &amp;pkcs7-&gt;signed_data.certs );</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineCov"> 14 : mbedtls_x509_crl_free( &amp;pkcs7-&gt;signed_data.crl );</span></a>
+<a name="583"><span class="lineNum"> 583 </span> : : </a>
+<a name="584"><span class="lineNum"> 584 </span> :<span class="lineCov"> 14 : name_cur = pkcs7-&gt;signed_data.signers.issuer.next;</span></a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineCov"> 98 : while( name_cur != NULL )</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : {</a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 84 : name_prv = name_cur;</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineCov"> 84 : name_cur = name_cur-&gt;next;</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineCov"> 84 : mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) );</span></a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 84 : mbedtls_free( name_prv );</span></a>
+<a name="591"><span class="lineNum"> 591 </span> : : }</a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 14 : mbedtls_platform_zeroize( pkcs7, sizeof( mbedtls_pkcs7 ) );</span></a>
+<a name="594"><span class="lineNum"> 594 </span> : : }</a>
+<a name="595"><span class="lineNum"> 595 </span> : : </a>
+<a name="596"><span class="lineNum"> 596 </span> : : #endif</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/index-sort-b.html b/coverage-report/libstb/index-sort-b.html
new file mode 100644
index 0000000..924129a
--- /dev/null
+++ b/coverage-report/libstb/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libstb</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryLo">14.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="container.c.gcov.html">container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=15 height=10 alt="14.9%"><img src="../snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/index-sort-f.html b/coverage-report/libstb/index-sort-f.html
new file mode 100644
index 0000000..544d2d9
--- /dev/null
+++ b/coverage-report/libstb/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libstb</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryLo">14.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="container.c.gcov.html">container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=15 height=10 alt="14.9%"><img src="../snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/index-sort-l.html b/coverage-report/libstb/index-sort-l.html
new file mode 100644
index 0000000..bd13446
--- /dev/null
+++ b/coverage-report/libstb/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libstb</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryLo">14.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="container.c.gcov.html">container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=15 height=10 alt="14.9%"><img src="../snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/index.html b/coverage-report/libstb/index.html
new file mode 100644
index 0000000..4615f70
--- /dev/null
+++ b/coverage-report/libstb/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - libstb</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryLo">14.9 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryLo">16.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="container.c.gcov.html">container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=15 height=10 alt="14.9%"><img src="../snow.png" width=85 height=10 alt="14.9%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">14.9&nbsp;%</td>
+ <td class="coverNumLo">7 / 47</td>
+ <td class="coverPerLo">16.7&nbsp;%</td>
+ <td class="coverNumLo">1 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/edk2-compat-process.c.func-sort-c.html b/coverage-report/libstb/secvar/backend/edk2-compat-process.c.func-sort-c.html
new file mode 100644
index 0000000..6772111
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/edk2-compat-process.c.func-sort-c.html
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend/edk2-compat-process.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/backend</a> - edk2-compat-process.c<span style="font-size: 80%;"> (<a href="edk2-compat-process.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">323</td>
+ <td class="headerCovTableEntry">397</td>
+ <td class="headerCovTableEntryMed">81.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="edk2-compat-process.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#231">validate_hash</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#52">char_to_wchar</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#575">get_hash_to_verify</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#70">get_key_authority</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#351">update_timestamp</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#21">update_variable_in_bank</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#412">get_pkcs7</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#455">verify_signature</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#99">get_esl_signature_list_size</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#202">validate_cert</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#251">validate_esl_list</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#385">check_timestamp</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#170">get_auth_descriptor2</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#655">process_update</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#647">is_pkcs7_sig_format</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#332">get_last_timestamp</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#154">get_pkcs7_len</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#113">get_esl_cert</a></td>
+ <td class="coverFnHi">39</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#368">unpack_timestamp</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#86">get_esl_signature_list</a></td>
+ <td class="coverFnHi">78</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/edk2-compat-process.c.func.html b/coverage-report/libstb/secvar/backend/edk2-compat-process.c.func.html
new file mode 100644
index 0000000..ce9ab37
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/edk2-compat-process.c.func.html
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend/edk2-compat-process.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/backend</a> - edk2-compat-process.c<span style="font-size: 80%;"> (<a href="edk2-compat-process.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">323</td>
+ <td class="headerCovTableEntry">397</td>
+ <td class="headerCovTableEntryMed">81.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="edk2-compat-process.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#52">char_to_wchar</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#385">check_timestamp</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#170">get_auth_descriptor2</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#113">get_esl_cert</a></td>
+ <td class="coverFnHi">39</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#86">get_esl_signature_list</a></td>
+ <td class="coverFnHi">78</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#99">get_esl_signature_list_size</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#575">get_hash_to_verify</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#70">get_key_authority</a></td>
+ <td class="coverFnHi">11</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#332">get_last_timestamp</a></td>
+ <td class="coverFnHi">36</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#412">get_pkcs7</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#154">get_pkcs7_len</a></td>
+ <td class="coverFnHi">38</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#647">is_pkcs7_sig_format</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#655">process_update</a></td>
+ <td class="coverFnHi">24</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#368">unpack_timestamp</a></td>
+ <td class="coverFnHi">48</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#351">update_timestamp</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#21">update_variable_in_bank</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#202">validate_cert</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#251">validate_esl_list</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#231">validate_hash</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat-process.c.gcov.html#455">verify_signature</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/edk2-compat-process.c.gcov.html b/coverage-report/libstb/secvar/backend/edk2-compat-process.c.gcov.html
new file mode 100644
index 0000000..1ba58f0
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/edk2-compat-process.c.gcov.html
@@ -0,0 +1,850 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend/edk2-compat-process.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/backend</a> - edk2-compat-process.c<span style="font-size: 80%;"> (source / <a href="edk2-compat-process.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">323</td>
+ <td class="headerCovTableEntry">397</td>
+ <td class="headerCovTableEntryMed">81.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntry">20</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2020 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #ifndef pr_fmt</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define pr_fmt(fmt) &quot;EDK2_COMPAT: &quot; fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #endif</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;opal.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;string.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;time.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;mbedtls/error.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;device.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;assert.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;libstb/crypto/pkcs7/pkcs7.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;edk2.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;../secvar.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &quot;edk2-compat-process.h&quot;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : bool setup_mode;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 12 : int update_variable_in_bank(struct secvar *update_var, const char *data,</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : const uint64_t dsize, struct list_head *bank)</a>
+<a name="25"><span class="lineNum"> 25 </span> : : {</a>
+<a name="26"><span class="lineNum"> 26 </span> : : struct secvar *var;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 12 : var = find_secvar(update_var-&gt;key, update_var-&gt;key_len, bank);</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 12 : if (!var)</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : return OPAL_EMPTY;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : /* Reallocate the data memory, if there is change in data size */</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 12 : if (var-&gt;data_size &lt; dsize)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 9 : if (realloc_secvar(var, dsize))</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 12 : if (dsize &amp;&amp; data)</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 10 : memcpy(var-&gt;data, data, dsize);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 12 : var-&gt;data_size = dsize;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : /* Clear the volatile bit only if updated with positive data size */</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 12 : if (dsize)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 10 : var-&gt;flags &amp;= ~SECVAR_FLAG_VOLATILE;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : else</a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 2 : var-&gt;flags |= SECVAR_FLAG_VOLATILE;</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 12 : if (key_equals(update_var-&gt;key, &quot;PK&quot;) || key_equals(update_var-&gt;key, &quot;HWKH&quot;))</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 5 : var-&gt;flags |= SECVAR_FLAG_PROTECTED;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 12 : return 0;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : }</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : /* Expand char to wide character size */</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 11 : static char *char_to_wchar(const char *key, const size_t keylen)</span></a>
+<a name="55"><span class="lineNum"> 55 </span> : : {</a>
+<a name="56"><span class="lineNum"> 56 </span> : : int i;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : char *str;</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 11 : str = zalloc(keylen * 2);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 11 : if (!str)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 36 : for (i = 0; i &lt; keylen*2; key++) {</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 25 : str[i++] = *key;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 25 : str[i++] = '\0';</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : }</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 11 : return str;</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : }</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> : : /* Returns the authority that can sign the given key update */</a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 11 : static void get_key_authority(const char *ret[3], const char *key)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : {</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 11 : int i = 0;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 11 : if (key_equals(key, &quot;PK&quot;)) {</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 2 : ret[i++] = &quot;PK&quot;;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 9 : } else if (key_equals(key, &quot;KEK&quot;)) {</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 2 : ret[i++] = &quot;PK&quot;;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 7 : } else if (key_equals(key, &quot;db&quot;) || key_equals(key, &quot;dbx&quot;)) {</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 7 : ret[i++] = &quot;KEK&quot;;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 7 : ret[i++] = &quot;PK&quot;;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : }</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 11 : ret[i] = NULL;</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 11 : }</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 78 : static EFI_SIGNATURE_LIST* get_esl_signature_list(const char *buf, size_t buflen)</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : {</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 78 : EFI_SIGNATURE_LIST *list = NULL;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 78 : if (buflen &lt; sizeof(EFI_SIGNATURE_LIST) || !buf)</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 78 : list = (EFI_SIGNATURE_LIST *)buf;</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 78 : return list;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : }</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> : : /* Returns the size of the complete ESL. */</a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 16 : static int32_t get_esl_signature_list_size(const char *buf, const size_t buflen)</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : {</a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 16 : EFI_SIGNATURE_LIST *list = get_esl_signature_list(buf, buflen);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 16 : if (!list)</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 16 : return le32_to_cpu(list-&gt;SignatureListSize);</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : }</a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> : : /* </a>
+<a name="112"><span class="lineNum"> 112 </span> : : * Copies the certificate from the ESL into cert buffer and returns the size</a>
+<a name="113"><span class="lineNum"> 113 </span> : : * of the certificate</a>
+<a name="114"><span class="lineNum"> 114 </span> : : */</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 39 : static int get_esl_cert(const char *buf, const size_t buflen, char **cert)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : {</a>
+<a name="117"><span class="lineNum"> 117 </span> : : size_t sig_data_offset;</a>
+<a name="118"><span class="lineNum"> 118 </span> : : size_t size;</a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 39 : EFI_SIGNATURE_LIST *list = get_esl_signature_list(buf, buflen);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 39 : if (!list)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 39 : assert(cert != NULL);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 39 : size = le32_to_cpu(list-&gt;SignatureSize) - sizeof(uuid_t);</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : </a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 39 : prlog(PR_DEBUG,&quot;size of signature list size is %u\n&quot;,</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : le32_to_cpu(list-&gt;SignatureListSize));</a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 39 : prlog(PR_DEBUG, &quot;size of signature header size is %u\n&quot;,</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : le32_to_cpu(list-&gt;SignatureHeaderSize));</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 39 : prlog(PR_DEBUG, &quot;size of signature size is %u\n&quot;,</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : le32_to_cpu(list-&gt;SignatureSize));</a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 39 : sig_data_offset = sizeof(EFI_SIGNATURE_LIST)</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 39 : + le32_to_cpu(list-&gt;SignatureHeaderSize)</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : + 16 * sizeof(uint8_t);</a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 39 : if (sig_data_offset &gt; buflen)</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 39 : *cert = zalloc(size);</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 39 : if (!(*cert))</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /* Since buf can have more than one ESL, copy only the size calculated</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * to return single ESL */</a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 39 : memcpy(*cert, buf + sig_data_offset, size);</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 39 : return size;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : }</a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> : : /* </a>
+<a name="153"><span class="lineNum"> 153 </span> : : * Extracts size of the PKCS7 signed data embedded in the</a>
+<a name="154"><span class="lineNum"> 154 </span> : : * struct Authentication 2 Descriptor Header.</a>
+<a name="155"><span class="lineNum"> 155 </span> : : */</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 38 : static size_t get_pkcs7_len(const struct efi_variable_authentication_2 *auth)</span></a>
+<a name="157"><span class="lineNum"> 157 </span> : : {</a>
+<a name="158"><span class="lineNum"> 158 </span> : : uint32_t dw_length;</a>
+<a name="159"><span class="lineNum"> 159 </span> : : size_t size;</a>
+<a name="160"><span class="lineNum"> 160 </span> : : </a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 38 : assert(auth != NULL);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 38 : dw_length = le32_to_cpu(auth-&gt;auth_info.hdr.dw_length);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 38 : size = dw_length - (sizeof(auth-&gt;auth_info.hdr.dw_length)</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : + sizeof(auth-&gt;auth_info.hdr.w_revision)</a>
+<a name="166"><span class="lineNum"> 166 </span> : : + sizeof(auth-&gt;auth_info.hdr.w_certificate_type)</a>
+<a name="167"><span class="lineNum"> 167 </span> : : + sizeof(auth-&gt;auth_info.cert_type));</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 38 : return size;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> :<span class="lineCov"> 24 : int get_auth_descriptor2(const void *buf, const size_t buflen, void **auth_buffer)</span></a>
+<a name="173"><span class="lineNum"> 173 </span> : : {</a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 24 : const struct efi_variable_authentication_2 *auth = buf;</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : int auth_buffer_size;</a>
+<a name="176"><span class="lineNum"> 176 </span> : : size_t len;</a>
+<a name="177"><span class="lineNum"> 177 </span> : : </a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 24 : assert(auth_buffer != NULL);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 24 : if (buflen &lt; sizeof(struct efi_variable_authentication_2)</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 24 : || !buf)</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 24 : len = get_pkcs7_len(auth);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : /* pkcs7 content length cannot be greater than buflen */ </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 24 : if (len &gt; buflen)</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="187"><span class="lineNum"> 187 </span> : : </a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 24 : auth_buffer_size = sizeof(auth-&gt;timestamp) + sizeof(auth-&gt;auth_info.hdr)</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 24 : + sizeof(auth-&gt;auth_info.cert_type) + len;</span></a>
+<a name="190"><span class="lineNum"> 190 </span> : : </a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineCov"> 24 : *auth_buffer = zalloc(auth_buffer_size);</span></a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 24 : if (!(*auth_buffer))</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> : : /*</a>
+<a name="196"><span class="lineNum"> 196 </span> : : * Data = auth descriptor + new ESL data.</a>
+<a name="197"><span class="lineNum"> 197 </span> : : * Extracts only the auth descriptor from data.</a>
+<a name="198"><span class="lineNum"> 198 </span> : : */</a>
+<a name="199"><span class="lineNum"> 199 </span> :<span class="lineCov"> 24 : memcpy(*auth_buffer, buf, auth_buffer_size);</span></a>
+<a name="200"><span class="lineNum"> 200 </span> : : </a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 24 : return auth_buffer_size;</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : }</a>
+<a name="203"><span class="lineNum"> 203 </span> : : </a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 16 : static bool validate_cert(char *signing_cert, int signing_cert_size)</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : {</a>
+<a name="206"><span class="lineNum"> 206 </span> : : mbedtls_x509_crt x509;</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 16 : char *x509_buf = NULL;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> : : int rc;</a>
+<a name="209"><span class="lineNum"> 209 </span> : : </a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 16 : mbedtls_x509_crt_init(&amp;x509);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 16 : rc = mbedtls_x509_crt_parse(&amp;x509, signing_cert, signing_cert_size);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /* If failure in parsing the certificate, exit */</a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 16 : if(rc) {</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;X509 certificate parsing failed %04x\n&quot;, rc);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : }</a>
+<a name="218"><span class="lineNum"> 218 </span> : : </a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 16 : x509_buf = zalloc(CERT_BUFFER_SIZE);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 16 : rc = mbedtls_x509_crt_info(x509_buf, CERT_BUFFER_SIZE, &quot;CRT:&quot;, &amp;x509);</span></a>
+<a name="221"><span class="lineNum"> 221 </span> : : </a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 16 : mbedtls_x509_crt_free(&amp;x509);</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 16 : free(x509_buf);</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 16 : x509_buf = NULL;</span></a>
+<a name="225"><span class="lineNum"> 225 </span> : : </a>
+<a name="226"><span class="lineNum"> 226 </span> : : /* If failure in reading the certificate, exit */</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 16 : if (rc &lt; 0)</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : </a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 16 : return true;</span></a>
+<a name="231"><span class="lineNum"> 231 </span> : : }</a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 6 : static bool validate_hash(uuid_t type, int size)</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : {</a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 6 : if (uuid_equals(&amp;type, &amp;EFI_CERT_SHA1_GUID) &amp;&amp; (size == 20))</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 6 : if (uuid_equals(&amp;type, &amp;EFI_CERT_SHA224_GUID) &amp;&amp; (size == 28))</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> : : </a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 6 : if (uuid_equals(&amp;type, &amp;EFI_CERT_SHA256_GUID) &amp;&amp; (size == 32))</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 1 : return true;</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : </a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 5 : if (uuid_equals(&amp;type, &amp;EFI_CERT_SHA384_GUID) &amp;&amp; (size == 48))</span></a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="246"><span class="lineNum"> 246 </span> : : </a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 5 : if (uuid_equals(&amp;type, &amp;EFI_CERT_SHA512_GUID) &amp;&amp; (size == 64))</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 1 : return true;</span></a>
+<a name="249"><span class="lineNum"> 249 </span> : : </a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 4 : return false;</span></a>
+<a name="251"><span class="lineNum"> 251 </span> : : }</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 21 : int validate_esl_list(const char *key, const char *esl, const size_t size)</span></a>
+<a name="254"><span class="lineNum"> 254 </span> : : {</a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 21 : int count = 0;</span></a>
+<a name="256"><span class="lineNum"> 256 </span> : : int dsize;</a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 21 : char *data = NULL;</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 21 : int eslvarsize = size;</span></a>
+<a name="259"><span class="lineNum"> 259 </span> : : int eslsize;</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 21 : int rc = OPAL_SUCCESS;</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 21 : int offset = 0;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 21 : EFI_SIGNATURE_LIST *list = NULL;</span></a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 39 : while (eslvarsize &gt; 0) {</span></a>
+<a name="265"><span class="lineNum"> 265 </span> :<span class="lineCov"> 26 : prlog(PR_DEBUG, &quot;esl var size size is %d offset is %d\n&quot;, eslvarsize, offset);</span></a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 26 : if (eslvarsize &lt; sizeof(EFI_SIGNATURE_LIST))</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 3 : break;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : </a>
+<a name="269"><span class="lineNum"> 269 </span> : : /* Check Supported ESL Type */</a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 23 : list = get_esl_signature_list(esl, eslvarsize);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : </a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 23 : if (!list)</span></a>
+<a name="273"><span class="lineNum"> 273 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /* Calculate the size of the ESL */</a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 23 : eslsize = le32_to_cpu(list-&gt;SignatureListSize);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> : : </a>
+<a name="278"><span class="lineNum"> 278 </span> : : /* If could not extract the size */</a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 23 : if (eslsize &lt;= 0) {</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Invalid size of the ESL: %u\n&quot;,</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : le32_to_cpu(list-&gt;SignatureListSize));</a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineNoCov"> 0 : rc = OPAL_PARAMETER;</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="284"><span class="lineNum"> 284 </span> : : }</a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> : : /* Extract the certificate from the ESL */</a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 23 : dsize = get_esl_cert(esl, eslvarsize, &amp;data);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 23 : if (dsize &lt; 0) {</span></a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineNoCov"> 0 : rc = dsize;</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="291"><span class="lineNum"> 291 </span> : : }</a>
+<a name="292"><span class="lineNum"> 292 </span> : : </a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 23 : if (key_equals(key, &quot;dbx&quot;)) {</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 6 : if (!validate_hash(list-&gt;SignatureType, dsize)) {</span></a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 4 : prlog(PR_ERR, &quot;No valid hash is found\n&quot;);</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 4 : rc = OPAL_PARAMETER;</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 4 : break;</span></a>
+<a name="298"><span class="lineNum"> 298 </span> : : }</a>
+<a name="299"><span class="lineNum"> 299 </span> : : } else {</a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 17 : if (!uuid_equals(&amp;list-&gt;SignatureType, &amp;EFI_CERT_X509_GUID)</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 16 : || !validate_cert(data, dsize)) {</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 1 : prlog(PR_ERR, &quot;No valid cert is found\n&quot;);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> :<span class="lineCov"> 1 : rc = OPAL_PARAMETER;</span></a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 1 : break;</span></a>
+<a name="305"><span class="lineNum"> 305 </span> : : }</a>
+<a name="306"><span class="lineNum"> 306 </span> : : }</a>
+<a name="307"><span class="lineNum"> 307 </span> : : </a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 18 : count++;</span></a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> : : /* Look for the next ESL */</a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 18 : offset = offset + eslsize;</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 18 : eslvarsize = eslvarsize - eslsize;</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 18 : free(data);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> : : /* Since we are going to allocate again in the next iteration */</a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 18 : data = NULL;</span></a>
+<a name="316"><span class="lineNum"> 316 </span> : : }</a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 21 : if (rc == OPAL_SUCCESS) {</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 16 : if (key_equals(key, &quot;PK&quot;) &amp;&amp; (count &gt; 1)) {</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 1 : prlog(PR_ERR, &quot;PK can only be one\n&quot;);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 1 : rc = OPAL_PARAMETER;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : } else {</a>
+<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 15 : rc = count;</span></a>
+<a name="324"><span class="lineNum"> 324 </span> : : }</a>
+<a name="325"><span class="lineNum"> 325 </span> : : }</a>
+<a name="326"><span class="lineNum"> 326 </span> : : </a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 21 : free(data);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> : : </a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 21 : prlog(PR_INFO, &quot;Total ESLs are %d\n&quot;, rc);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 21 : return rc;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : }</a>
+<a name="332"><span class="lineNum"> 332 </span> : : </a>
+<a name="333"><span class="lineNum"> 333 </span> : : /* Get the timestamp for the last update of the give key */</a>
+<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 36 : static struct efi_time *get_last_timestamp(const char *key, char *last_timestamp)</span></a>
+<a name="335"><span class="lineNum"> 335 </span> : : {</a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 36 : struct efi_time *timestamp = (struct efi_time*)last_timestamp;</span></a>
+<a name="337"><span class="lineNum"> 337 </span> : : </a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 36 : if (!last_timestamp)</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="340"><span class="lineNum"> 340 </span> : : </a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 36 : if (key_equals(key, &quot;PK&quot;))</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 11 : return &amp;timestamp[0];</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 25 : else if (key_equals(key, &quot;KEK&quot;))</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 7 : return &amp;timestamp[1];</span></a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 18 : else if (key_equals(key, &quot;db&quot;))</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 10 : return &amp;timestamp[2];</span></a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 8 : else if (key_equals(key, &quot;dbx&quot;))</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 8 : return &amp;timestamp[3];</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : else</a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="351"><span class="lineNum"> 351 </span> : : }</a>
+<a name="352"><span class="lineNum"> 352 </span> : : </a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 12 : int update_timestamp(const char *key, const struct efi_time *timestamp, char *last_timestamp)</span></a>
+<a name="354"><span class="lineNum"> 354 </span> : : {</a>
+<a name="355"><span class="lineNum"> 355 </span> : : struct efi_time *prev;</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 12 : prev = get_last_timestamp(key, last_timestamp);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 12 : if (prev == NULL)</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Update with new timestamp */</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 12 : memcpy(prev, timestamp, sizeof(struct efi_time));</span></a>
+<a name="363"><span class="lineNum"> 363 </span> : : </a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 12 : prlog(PR_DEBUG, &quot;updated prev year is %d month %d day %d\n&quot;,</span></a>
+<a name="365"><span class="lineNum"> 365 </span> : : le16_to_cpu(prev-&gt;year), prev-&gt;month, prev-&gt;day);</a>
+<a name="366"><span class="lineNum"> 366 </span> : : </a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 12 : return OPAL_SUCCESS;</span></a>
+<a name="368"><span class="lineNum"> 368 </span> : : }</a>
+<a name="369"><span class="lineNum"> 369 </span> : : </a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 48 : static uint64_t unpack_timestamp(const struct efi_time *timestamp)</span></a>
+<a name="371"><span class="lineNum"> 371 </span> : : {</a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 48 : uint64_t val = 0;</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 48 : uint16_t year = le32_to_cpu(timestamp-&gt;year);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> : : </a>
+<a name="375"><span class="lineNum"> 375 </span> : : /* pad1, nanosecond, timezone, daylight and pad2 are meant to be zero */</a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 48 : val |= ((uint64_t) timestamp-&gt;pad1 &amp; 0xFF) &lt;&lt; 0;</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 48 : val |= ((uint64_t) timestamp-&gt;second &amp; 0xFF) &lt;&lt; (1*8);</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 48 : val |= ((uint64_t) timestamp-&gt;minute &amp; 0xFF) &lt;&lt; (2*8);</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 48 : val |= ((uint64_t) timestamp-&gt;hour &amp; 0xFF) &lt;&lt; (3*8);</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 48 : val |= ((uint64_t) timestamp-&gt;day &amp; 0xFF) &lt;&lt; (4*8);</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 48 : val |= ((uint64_t) timestamp-&gt;month &amp; 0xFF) &lt;&lt; (5*8);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 48 : val |= ((uint64_t) year) &lt;&lt; (6*8);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> : : </a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 48 : return val;</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : }</a>
+<a name="386"><span class="lineNum"> 386 </span> : : </a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 24 : int check_timestamp(const char *key, const struct efi_time *timestamp,</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : char *last_timestamp)</a>
+<a name="389"><span class="lineNum"> 389 </span> : : {</a>
+<a name="390"><span class="lineNum"> 390 </span> : : struct efi_time *prev;</a>
+<a name="391"><span class="lineNum"> 391 </span> : : uint64_t new;</a>
+<a name="392"><span class="lineNum"> 392 </span> : : uint64_t last;</a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 24 : prev = get_last_timestamp(key, last_timestamp);</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 24 : if (prev == NULL)</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 24 : prlog(PR_DEBUG, &quot;timestamp year is %d month %d day %d\n&quot;,</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : le16_to_cpu(timestamp-&gt;year), timestamp-&gt;month,</a>
+<a name="400"><span class="lineNum"> 400 </span> : : timestamp-&gt;day);</a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 24 : prlog(PR_DEBUG, &quot;prev year is %d month %d day %d\n&quot;,</span></a>
+<a name="402"><span class="lineNum"> 402 </span> : : le16_to_cpu(prev-&gt;year), prev-&gt;month, prev-&gt;day);</a>
+<a name="403"><span class="lineNum"> 403 </span> : : </a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 24 : new = unpack_timestamp(timestamp);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 24 : last = unpack_timestamp(prev);</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineCov"> 24 : if (new &gt; last)</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 21 : return OPAL_SUCCESS;</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : </a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 3 : return OPAL_PERMISSION;</span></a>
+<a name="411"><span class="lineNum"> 411 </span> : : }</a>
+<a name="412"><span class="lineNum"> 412 </span> : : </a>
+<a name="413"><span class="lineNum"> 413 </span> : : /* Extract PKCS7 from the authentication header */</a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 14 : static mbedtls_pkcs7* get_pkcs7(const struct efi_variable_authentication_2 *auth)</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : {</a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 14 : char *checkpkcs7cert = NULL;</span></a>
+<a name="417"><span class="lineNum"> 417 </span> : : size_t len;</a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 14 : mbedtls_pkcs7 *pkcs7 = NULL;</span></a>
+<a name="419"><span class="lineNum"> 419 </span> : : int rc;</a>
+<a name="420"><span class="lineNum"> 420 </span> : : </a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineCov"> 14 : len = get_pkcs7_len(auth);</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> :<span class="lineCov"> 14 : pkcs7 = malloc(sizeof(struct mbedtls_pkcs7));</span></a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 14 : if (!pkcs7)</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 14 : mbedtls_pkcs7_init(pkcs7);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 14 : rc = mbedtls_pkcs7_parse_der( auth-&gt;auth_info.cert_data, len, pkcs7);</span></a>
+<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 14 : if (rc &lt;= 0) {</span></a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Parsing pkcs7 failed %04x\n&quot;, rc);</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="432"><span class="lineNum"> 432 </span> : : }</a>
+<a name="433"><span class="lineNum"> 433 </span> : : </a>
+<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 14 : checkpkcs7cert = zalloc(CERT_BUFFER_SIZE);</span></a>
+<a name="435"><span class="lineNum"> 435 </span> :<span class="lineCov"> 14 : if (!checkpkcs7cert)</span></a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="437"><span class="lineNum"> 437 </span> : : </a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineCov"> 14 : rc = mbedtls_x509_crt_info(checkpkcs7cert, CERT_BUFFER_SIZE, &quot;CRT:&quot;,</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 14 : &amp;(pkcs7-&gt;signed_data.certs));</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 14 : if (rc &lt; 0) {</span></a>
+<a name="441"><span class="lineNum"> 441 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to parse the certificate in PKCS7 structure\n&quot;);</span></a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineNoCov"> 0 : free(checkpkcs7cert);</span></a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="444"><span class="lineNum"> 444 </span> : : }</a>
+<a name="445"><span class="lineNum"> 445 </span> : : </a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 14 : prlog(PR_DEBUG, &quot;%s \n&quot;, checkpkcs7cert);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 14 : free(checkpkcs7cert);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 14 : return pkcs7;</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineNoCov"> 0 : out:</span></a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineNoCov"> 0 : mbedtls_pkcs7_free(pkcs7);</span></a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : pkcs7 = NULL;</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineNoCov"> 0 : return pkcs7;</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : }</a>
+<a name="455"><span class="lineNum"> 455 </span> : : </a>
+<a name="456"><span class="lineNum"> 456 </span> : : /* Verify the PKCS7 signature on the signed data. */</a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 14 : static int verify_signature(const struct efi_variable_authentication_2 *auth,</span></a>
+<a name="458"><span class="lineNum"> 458 </span> : : const char *newcert, const size_t new_data_size,</a>
+<a name="459"><span class="lineNum"> 459 </span> : : const struct secvar *avar)</a>
+<a name="460"><span class="lineNum"> 460 </span> : : {</a>
+<a name="461"><span class="lineNum"> 461 </span> :<span class="lineCov"> 14 : mbedtls_pkcs7 *pkcs7 = NULL;</span></a>
+<a name="462"><span class="lineNum"> 462 </span> : : mbedtls_x509_crt x509;</a>
+<a name="463"><span class="lineNum"> 463 </span> :<span class="lineCov"> 14 : char *signing_cert = NULL;</span></a>
+<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 14 : char *x509_buf = NULL;</span></a>
+<a name="465"><span class="lineNum"> 465 </span> : : int signing_cert_size;</a>
+<a name="466"><span class="lineNum"> 466 </span> :<span class="lineCov"> 14 : int rc = 0;</span></a>
+<a name="467"><span class="lineNum"> 467 </span> : : char *errbuf;</a>
+<a name="468"><span class="lineNum"> 468 </span> : : int eslvarsize;</a>
+<a name="469"><span class="lineNum"> 469 </span> : : int eslsize;</a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 14 : int offset = 0;</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 14 : if (!auth)</span></a>
+<a name="473"><span class="lineNum"> 473 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="474"><span class="lineNum"> 474 </span> : : </a>
+<a name="475"><span class="lineNum"> 475 </span> : : /* Extract the pkcs7 from the auth structure */</a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 14 : pkcs7 = get_pkcs7(auth);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> : : /* Failure to parse pkcs7 implies bad input. */</a>
+<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 14 : if (!pkcs7)</span></a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : </a>
+<a name="481"><span class="lineNum"> 481 </span> :<span class="lineCov"> 14 : prlog(PR_INFO, &quot;Load the signing certificate from the keystore&quot;);</span></a>
+<a name="482"><span class="lineNum"> 482 </span> : : </a>
+<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 14 : eslvarsize = avar-&gt;data_size;</span></a>
+<a name="484"><span class="lineNum"> 484 </span> : : </a>
+<a name="485"><span class="lineNum"> 485 </span> : : /* Variable is not empty */</a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineCov"> 22 : while (eslvarsize &gt; 0) {</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 16 : prlog(PR_DEBUG, &quot;esl var size size is %d offset is %d\n&quot;, eslvarsize, offset);</span></a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineCov"> 16 : if (eslvarsize &lt; sizeof(EFI_SIGNATURE_LIST))</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> : : </a>
+<a name="491"><span class="lineNum"> 491 </span> : : /* Calculate the size of the ESL */</a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 16 : eslsize = get_esl_signature_list_size(avar-&gt;data + offset,</span></a>
+<a name="493"><span class="lineNum"> 493 </span> : : eslvarsize);</a>
+<a name="494"><span class="lineNum"> 494 </span> : : /* If could not extract the size */</a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineCov"> 16 : if (eslsize &lt;= 0) {</span></a>
+<a name="496"><span class="lineNum"> 496 </span> :<span class="lineNoCov"> 0 : rc = OPAL_PARAMETER;</span></a>
+<a name="497"><span class="lineNum"> 497 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="498"><span class="lineNum"> 498 </span> : : }</a>
+<a name="499"><span class="lineNum"> 499 </span> : : </a>
+<a name="500"><span class="lineNum"> 500 </span> : : /* Extract the certificate from the ESL */</a>
+<a name="501"><span class="lineNum"> 501 </span> :<span class="lineCov"> 16 : signing_cert_size = get_esl_cert(avar-&gt;data + offset,</span></a>
+<a name="502"><span class="lineNum"> 502 </span> : : eslvarsize, &amp;signing_cert);</a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 16 : if (signing_cert_size &lt; 0) {</span></a>
+<a name="504"><span class="lineNum"> 504 </span> :<span class="lineNoCov"> 0 : rc = signing_cert_size;</span></a>
+<a name="505"><span class="lineNum"> 505 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="506"><span class="lineNum"> 506 </span> : : }</a>
+<a name="507"><span class="lineNum"> 507 </span> : : </a>
+<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 16 : mbedtls_x509_crt_init(&amp;x509);</span></a>
+<a name="509"><span class="lineNum"> 509 </span> :<span class="lineCov"> 16 : rc = mbedtls_x509_crt_parse(&amp;x509,</span></a>
+<a name="510"><span class="lineNum"> 510 </span> : : signing_cert,</a>
+<a name="511"><span class="lineNum"> 511 </span> : : signing_cert_size);</a>
+<a name="512"><span class="lineNum"> 512 </span> : : </a>
+<a name="513"><span class="lineNum"> 513 </span> : : /* This should not happen, unless something corrupted in PNOR */</a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 16 : if(rc) {</span></a>
+<a name="515"><span class="lineNum"> 515 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;X509 certificate parsing failed %04x\n&quot;, rc);</span></a>
+<a name="516"><span class="lineNum"> 516 </span> :<span class="lineNoCov"> 0 : rc = OPAL_INTERNAL_ERROR;</span></a>
+<a name="517"><span class="lineNum"> 517 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="518"><span class="lineNum"> 518 </span> : : }</a>
+<a name="519"><span class="lineNum"> 519 </span> : : </a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineCov"> 16 : x509_buf = zalloc(CERT_BUFFER_SIZE);</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineCov"> 16 : rc = mbedtls_x509_crt_info(x509_buf,</span></a>
+<a name="522"><span class="lineNum"> 522 </span> : : CERT_BUFFER_SIZE,</a>
+<a name="523"><span class="lineNum"> 523 </span> : : &quot;CRT:&quot;,</a>
+<a name="524"><span class="lineNum"> 524 </span> : : &amp;x509);</a>
+<a name="525"><span class="lineNum"> 525 </span> : : </a>
+<a name="526"><span class="lineNum"> 526 </span> : : /* This should not happen, unless something corrupted in PNOR */</a>
+<a name="527"><span class="lineNum"> 527 </span> :<span class="lineCov"> 16 : if (rc &lt; 0) {</span></a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : free(x509_buf);</span></a>
+<a name="529"><span class="lineNum"> 529 </span> :<span class="lineNoCov"> 0 : rc = OPAL_INTERNAL_ERROR;</span></a>
+<a name="530"><span class="lineNum"> 530 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="531"><span class="lineNum"> 531 </span> : : }</a>
+<a name="532"><span class="lineNum"> 532 </span> : : </a>
+<a name="533"><span class="lineNum"> 533 </span> :<span class="lineCov"> 16 : prlog(PR_INFO, &quot;%s \n&quot;, x509_buf);</span></a>
+<a name="534"><span class="lineNum"> 534 </span> :<span class="lineCov"> 16 : free(x509_buf);</span></a>
+<a name="535"><span class="lineNum"> 535 </span> :<span class="lineCov"> 16 : x509_buf = NULL;</span></a>
+<a name="536"><span class="lineNum"> 536 </span> : : </a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineCov"> 16 : rc = mbedtls_pkcs7_signed_hash_verify(pkcs7, &amp;x509, newcert, new_data_size);</span></a>
+<a name="538"><span class="lineNum"> 538 </span> : : </a>
+<a name="539"><span class="lineNum"> 539 </span> : : /* If you find a signing certificate, you are done */</a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 16 : if (rc == 0) {</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineCov"> 8 : prlog(PR_INFO, &quot;Signature Verification passed\n&quot;);</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineCov"> 8 : mbedtls_x509_crt_free(&amp;x509);</span></a>
+<a name="543"><span class="lineNum"> 543 </span> :<span class="lineCov"> 8 : break;</span></a>
+<a name="544"><span class="lineNum"> 544 </span> : : } else {</a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 8 : errbuf = zalloc(MBEDTLS_ERR_BUFFER_SIZE);</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineCov"> 8 : mbedtls_strerror(rc, errbuf, MBEDTLS_ERR_BUFFER_SIZE);</span></a>
+<a name="547"><span class="lineNum"> 547 </span> :<span class="lineCov"> 8 : prlog(PR_ERR, &quot;Signature Verification failed %02x %s\n&quot;,</span></a>
+<a name="548"><span class="lineNum"> 548 </span> : : rc, errbuf);</a>
+<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 8 : free(errbuf);</span></a>
+<a name="550"><span class="lineNum"> 550 </span> :<span class="lineCov"> 8 : rc = OPAL_PERMISSION;</span></a>
+<a name="551"><span class="lineNum"> 551 </span> : : }</a>
+<a name="552"><span class="lineNum"> 552 </span> : : </a>
+<a name="553"><span class="lineNum"> 553 </span> : : </a>
+<a name="554"><span class="lineNum"> 554 </span> : : /* Look for the next ESL */</a>
+<a name="555"><span class="lineNum"> 555 </span> :<span class="lineCov"> 8 : offset = offset + eslsize;</span></a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineCov"> 8 : eslvarsize = eslvarsize - eslsize;</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineCov"> 8 : mbedtls_x509_crt_free(&amp;x509);</span></a>
+<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 8 : free(signing_cert);</span></a>
+<a name="559"><span class="lineNum"> 559 </span> : : /* Since we are going to allocate again in the next iteration */</a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineCov"> 8 : signing_cert = NULL;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : </a>
+<a name="562"><span class="lineNum"> 562 </span> : : }</a>
+<a name="563"><span class="lineNum"> 563 </span> : : </a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineCov"> 14 : free(signing_cert);</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineCov"> 14 : mbedtls_pkcs7_free(pkcs7);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineCov"> 14 : free(pkcs7);</span></a>
+<a name="567"><span class="lineNum"> 567 </span> : : </a>
+<a name="568"><span class="lineNum"> 568 </span> :<span class="lineCov"> 14 : return rc;</span></a>
+<a name="569"><span class="lineNum"> 569 </span> : : }</a>
+<a name="570"><span class="lineNum"> 570 </span> : : </a>
+<a name="571"><span class="lineNum"> 571 </span> : : /* </a>
+<a name="572"><span class="lineNum"> 572 </span> : : * Create the hash of the buffer</a>
+<a name="573"><span class="lineNum"> 573 </span> : : * name || vendor guid || attributes || timestamp || newcontent</a>
+<a name="574"><span class="lineNum"> 574 </span> : : * which is submitted as signed by the user.</a>
+<a name="575"><span class="lineNum"> 575 </span> : : * Returns the sha256 hash, else negative error code.</a>
+<a name="576"><span class="lineNum"> 576 </span> : : */</a>
+<a name="577"><span class="lineNum"> 577 </span> :<span class="lineCov"> 11 : static char *get_hash_to_verify(const char *key, const char *new_data,</span></a>
+<a name="578"><span class="lineNum"> 578 </span> : : const size_t new_data_size,</a>
+<a name="579"><span class="lineNum"> 579 </span> : : const struct efi_time *timestamp)</a>
+<a name="580"><span class="lineNum"> 580 </span> : : {</a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineCov"> 11 : le32 attr = cpu_to_le32(SECVAR_ATTRIBUTES);</span></a>
+<a name="582"><span class="lineNum"> 582 </span> : : size_t varlen;</a>
+<a name="583"><span class="lineNum"> 583 </span> : : char *wkey;</a>
+<a name="584"><span class="lineNum"> 584 </span> : : uuid_t guid;</a>
+<a name="585"><span class="lineNum"> 585 </span> :<span class="lineCov"> 11 : unsigned char *hash = NULL;</span></a>
+<a name="586"><span class="lineNum"> 586 </span> : : const mbedtls_md_info_t *md_info;</a>
+<a name="587"><span class="lineNum"> 587 </span> : : mbedtls_md_context_t ctx;</a>
+<a name="588"><span class="lineNum"> 588 </span> : : int rc;</a>
+<a name="589"><span class="lineNum"> 589 </span> : : </a>
+<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 11 : md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );</span></a>
+<a name="591"><span class="lineNum"> 591 </span> :<span class="lineCov"> 11 : mbedtls_md_init(&amp;ctx);</span></a>
+<a name="592"><span class="lineNum"> 592 </span> : : </a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_setup(&amp;ctx, md_info, 0);</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="596"><span class="lineNum"> 596 </span> : : </a>
+<a name="597"><span class="lineNum"> 597 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_starts(&amp;ctx);</span></a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="599"><span class="lineNum"> 599 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="600"><span class="lineNum"> 600 </span> : : </a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 11 : if (key_equals(key, &quot;PK&quot;)</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineCov"> 9 : || key_equals(key, &quot;KEK&quot;))</span></a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineCov"> 4 : guid = EFI_GLOBAL_VARIABLE_GUID;</span></a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineCov"> 7 : else if (key_equals(key, &quot;db&quot;)</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineCov"> 1 : || key_equals(key, &quot;dbx&quot;))</span></a>
+<a name="606"><span class="lineNum"> 606 </span> :<span class="lineCov"> 7 : guid = EFI_IMAGE_SECURITY_DATABASE_GUID;</span></a>
+<a name="607"><span class="lineNum"> 607 </span> : : else</a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="609"><span class="lineNum"> 609 </span> : : </a>
+<a name="610"><span class="lineNum"> 610 </span> : : /* Expand char name to wide character width */</a>
+<a name="611"><span class="lineNum"> 611 </span> :<span class="lineCov"> 11 : varlen = strlen(key) * 2;</span></a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineCov"> 11 : wkey = char_to_wchar(key, strlen(key));</span></a>
+<a name="613"><span class="lineNum"> 613 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_update(&amp;ctx, wkey, varlen);</span></a>
+<a name="614"><span class="lineNum"> 614 </span> :<span class="lineCov"> 11 : free(wkey);</span></a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 11 : if (rc) </span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="617"><span class="lineNum"> 617 </span> : : </a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_update(&amp;ctx, (const unsigned char *)&amp;guid, sizeof(guid));</span></a>
+<a name="619"><span class="lineNum"> 619 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="620"><span class="lineNum"> 620 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="621"><span class="lineNum"> 621 </span> : : </a>
+<a name="622"><span class="lineNum"> 622 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_update(&amp;ctx, (const unsigned char *)&amp;attr, sizeof(attr));</span></a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="624"><span class="lineNum"> 624 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="625"><span class="lineNum"> 625 </span> : : </a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_update(&amp;ctx, (const unsigned char *)timestamp,</span></a>
+<a name="627"><span class="lineNum"> 627 </span> : : sizeof(struct efi_time));</a>
+<a name="628"><span class="lineNum"> 628 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="629"><span class="lineNum"> 629 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="630"><span class="lineNum"> 630 </span> : : </a>
+<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_update(&amp;ctx, new_data, new_data_size);</span></a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineCov"> 11 : if (rc)</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="634"><span class="lineNum"> 634 </span> : : </a>
+<a name="635"><span class="lineNum"> 635 </span> :<span class="lineCov"> 11 : hash = zalloc(32);</span></a>
+<a name="636"><span class="lineNum"> 636 </span> :<span class="lineCov"> 11 : if (!hash)</span></a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineCov"> 11 : rc = mbedtls_md_finish(&amp;ctx, hash);</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineCov"> 11 : if (rc) {</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : free(hash);</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : hash = NULL;</span></a>
+<a name="642"><span class="lineNum"> 642 </span> : : }</a>
+<a name="643"><span class="lineNum"> 643 </span> : : </a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineCov"> 11 : out:</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineCov"> 11 : mbedtls_md_free(&amp;ctx);</span></a>
+<a name="646"><span class="lineNum"> 646 </span> :<span class="lineCov"> 11 : return hash;</span></a>
+<a name="647"><span class="lineNum"> 647 </span> : : }</a>
+<a name="648"><span class="lineNum"> 648 </span> : : </a>
+<a name="649"><span class="lineNum"> 649 </span> :<span class="lineCov"> 26 : bool is_pkcs7_sig_format(const void *data)</span></a>
+<a name="650"><span class="lineNum"> 650 </span> : : {</a>
+<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 26 : const struct efi_variable_authentication_2 *auth = data;</span></a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineCov"> 26 : uuid_t pkcs7_guid = EFI_CERT_TYPE_PKCS7_GUID;</span></a>
+<a name="653"><span class="lineNum"> 653 </span> : : </a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 26 : return !memcmp(&amp;auth-&gt;auth_info.cert_type, &amp;pkcs7_guid, 16);</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : }</a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 24 : int process_update(const struct secvar *update, char **newesl,</span></a>
+<a name="658"><span class="lineNum"> 658 </span> : : int *new_data_size, struct efi_time *timestamp,</a>
+<a name="659"><span class="lineNum"> 659 </span> : : struct list_head *bank, char *last_timestamp)</a>
+<a name="660"><span class="lineNum"> 660 </span> : : {</a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 24 : struct efi_variable_authentication_2 *auth = NULL;</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineCov"> 24 : void *auth_buffer = NULL;</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineCov"> 24 : int auth_buffer_size = 0;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> : : const char *key_authority[3];</a>
+<a name="665"><span class="lineNum"> 665 </span> :<span class="lineCov"> 24 : char *tbhbuffer = NULL;</span></a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineCov"> 24 : size_t tbhbuffersize = 0;</span></a>
+<a name="667"><span class="lineNum"> 667 </span> :<span class="lineCov"> 24 : struct secvar *avar = NULL;</span></a>
+<a name="668"><span class="lineNum"> 668 </span> :<span class="lineCov"> 24 : int rc = 0;</span></a>
+<a name="669"><span class="lineNum"> 669 </span> : : int i;</a>
+<a name="670"><span class="lineNum"> 670 </span> : : </a>
+<a name="671"><span class="lineNum"> 671 </span> : : /* We need to split data into authentication descriptor and new ESL */</a>
+<a name="672"><span class="lineNum"> 672 </span> :<span class="lineCov"> 24 : auth_buffer_size = get_auth_descriptor2(update-&gt;data,</span></a>
+<a name="673"><span class="lineNum"> 673 </span> : : update-&gt;data_size,</a>
+<a name="674"><span class="lineNum"> 674 </span> : : &amp;auth_buffer);</a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineCov"> 24 : if ((auth_buffer_size &lt; 0)</span></a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineCov"> 24 : || (update-&gt;data_size &lt; auth_buffer_size)) {</span></a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Invalid auth buffer size\n&quot;);</span></a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineNoCov"> 0 : rc = auth_buffer_size;</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="680"><span class="lineNum"> 680 </span> : : }</a>
+<a name="681"><span class="lineNum"> 681 </span> : : </a>
+<a name="682"><span class="lineNum"> 682 </span> :<span class="lineCov"> 24 : auth = auth_buffer;</span></a>
+<a name="683"><span class="lineNum"> 683 </span> : : </a>
+<a name="684"><span class="lineNum"> 684 </span> :<span class="lineCov"> 24 : if (!timestamp) {</span></a>
+<a name="685"><span class="lineNum"> 685 </span> :<span class="lineNoCov"> 0 : rc = OPAL_INTERNAL_ERROR;</span></a>
+<a name="686"><span class="lineNum"> 686 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="687"><span class="lineNum"> 687 </span> : : }</a>
+<a name="688"><span class="lineNum"> 688 </span> : : </a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineCov"> 24 : memcpy(timestamp, auth_buffer, sizeof(struct efi_time));</span></a>
+<a name="690"><span class="lineNum"> 690 </span> : : </a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineCov"> 24 : rc = check_timestamp(update-&gt;key, timestamp, last_timestamp);</span></a>
+<a name="692"><span class="lineNum"> 692 </span> : : /* Failure implies probably an older command being resubmitted */</a>
+<a name="693"><span class="lineNum"> 693 </span> :<span class="lineCov"> 24 : if (rc != OPAL_SUCCESS) {</span></a>
+<a name="694"><span class="lineNum"> 694 </span> :<span class="lineCov"> 3 : prlog(PR_ERR, &quot;Timestamp verification failed for key %s\n&quot;, update-&gt;key);</span></a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 3 : goto out;</span></a>
+<a name="696"><span class="lineNum"> 696 </span> : : }</a>
+<a name="697"><span class="lineNum"> 697 </span> : : </a>
+<a name="698"><span class="lineNum"> 698 </span> : : /* Calculate the size of new ESL data */</a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineCov"> 21 : *new_data_size = update-&gt;data_size - auth_buffer_size;</span></a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 21 : if (*new_data_size &lt; 0) {</span></a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Invalid new ESL (new data content) size\n&quot;);</span></a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineNoCov"> 0 : rc = OPAL_PARAMETER;</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : }</a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineCov"> 21 : *newesl = zalloc(*new_data_size);</span></a>
+<a name="706"><span class="lineNum"> 706 </span> :<span class="lineCov"> 21 : if (!(*newesl)) {</span></a>
+<a name="707"><span class="lineNum"> 707 </span> :<span class="lineNoCov"> 0 : rc = OPAL_NO_MEM;</span></a>
+<a name="708"><span class="lineNum"> 708 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="709"><span class="lineNum"> 709 </span> : : }</a>
+<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 21 : memcpy(*newesl, update-&gt;data + auth_buffer_size, *new_data_size);</span></a>
+<a name="711"><span class="lineNum"> 711 </span> : : </a>
+<a name="712"><span class="lineNum"> 712 </span> : : /* Validate the new ESL is in right format */</a>
+<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 21 : rc = validate_esl_list(update-&gt;key, *newesl, *new_data_size);</span></a>
+<a name="714"><span class="lineNum"> 714 </span> :<span class="lineCov"> 21 : if (rc &lt; 0) {</span></a>
+<a name="715"><span class="lineNum"> 715 </span> :<span class="lineCov"> 6 : prlog(PR_ERR, &quot;ESL validation failed for key %s with error %04x\n&quot;,</span></a>
+<a name="716"><span class="lineNum"> 716 </span> : : update-&gt;key, rc);</a>
+<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 6 : goto out;</span></a>
+<a name="718"><span class="lineNum"> 718 </span> : : }</a>
+<a name="719"><span class="lineNum"> 719 </span> : : </a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 15 : if (setup_mode) {</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 4 : rc = OPAL_SUCCESS;</span></a>
+<a name="722"><span class="lineNum"> 722 </span> :<span class="lineCov"> 4 : goto out;</span></a>
+<a name="723"><span class="lineNum"> 723 </span> : : }</a>
+<a name="724"><span class="lineNum"> 724 </span> : : </a>
+<a name="725"><span class="lineNum"> 725 </span> : : /* Prepare the data to be verified */</a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineCov"> 11 : tbhbuffer = get_hash_to_verify(update-&gt;key, *newesl, *new_data_size,</span></a>
+<a name="727"><span class="lineNum"> 727 </span> : : timestamp);</a>
+<a name="728"><span class="lineNum"> 728 </span> :<span class="lineCov"> 11 : if (!tbhbuffer) {</span></a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : rc = OPAL_INTERNAL_ERROR;</span></a>
+<a name="730"><span class="lineNum"> 730 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="731"><span class="lineNum"> 731 </span> : : }</a>
+<a name="732"><span class="lineNum"> 732 </span> : : </a>
+<a name="733"><span class="lineNum"> 733 </span> : : /* Get the authority to verify the signature */</a>
+<a name="734"><span class="lineNum"> 734 </span> :<span class="lineCov"> 11 : get_key_authority(key_authority, update-&gt;key);</span></a>
+<a name="735"><span class="lineNum"> 735 </span> : : </a>
+<a name="736"><span class="lineNum"> 736 </span> : : /*</a>
+<a name="737"><span class="lineNum"> 737 </span> : : * Try for all the authorities that are allowed to sign.</a>
+<a name="738"><span class="lineNum"> 738 </span> : : * For eg. db/dbx can be signed by both PK or KEK</a>
+<a name="739"><span class="lineNum"> 739 </span> : : */</a>
+<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 19 : for (i = 0; key_authority[i] != NULL; i++) {</span></a>
+<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 16 : prlog(PR_DEBUG, &quot;key is %s\n&quot;, update-&gt;key);</span></a>
+<a name="742"><span class="lineNum"> 742 </span> :<span class="lineCov"> 16 : prlog(PR_DEBUG, &quot;key authority is %s\n&quot;, key_authority[i]);</span></a>
+<a name="743"><span class="lineNum"> 743 </span> :<span class="lineCov"> 16 : avar = find_secvar(key_authority[i],</span></a>
+<a name="744"><span class="lineNum"> 744 </span> :<span class="lineCov"> 16 : strlen(key_authority[i]) + 1,</span></a>
+<a name="745"><span class="lineNum"> 745 </span> : : bank);</a>
+<a name="746"><span class="lineNum"> 746 </span> :<span class="lineCov"> 16 : if (!avar || !avar-&gt;data_size)</span></a>
+<a name="747"><span class="lineNum"> 747 </span> :<span class="lineCov"> 2 : continue;</span></a>
+<a name="748"><span class="lineNum"> 748 </span> : : </a>
+<a name="749"><span class="lineNum"> 749 </span> : : /* Verify the signature */</a>
+<a name="750"><span class="lineNum"> 750 </span> :<span class="lineCov"> 14 : rc = verify_signature(auth, tbhbuffer, tbhbuffersize,</span></a>
+<a name="751"><span class="lineNum"> 751 </span> : : avar);</a>
+<a name="752"><span class="lineNum"> 752 </span> : : </a>
+<a name="753"><span class="lineNum"> 753 </span> : : /* Break if signature verification is successful */</a>
+<a name="754"><span class="lineNum"> 754 </span> :<span class="lineCov"> 14 : if (rc == OPAL_SUCCESS) {</span></a>
+<a name="755"><span class="lineNum"> 755 </span> :<span class="lineCov"> 8 : prlog(PR_INFO, &quot;Key %s successfully verified by authority %s\n&quot;, update-&gt;key, key_authority[i]);</span></a>
+<a name="756"><span class="lineNum"> 756 </span> :<span class="lineCov"> 8 : break;</span></a>
+<a name="757"><span class="lineNum"> 757 </span> : : }</a>
+<a name="758"><span class="lineNum"> 758 </span> : : }</a>
+<a name="759"><span class="lineNum"> 759 </span> : : </a>
+<a name="760"><span class="lineNum"> 760 </span> :<span class="lineCov"> 3 : out:</span></a>
+<a name="761"><span class="lineNum"> 761 </span> :<span class="lineCov"> 24 : free(auth_buffer);</span></a>
+<a name="762"><span class="lineNum"> 762 </span> :<span class="lineCov"> 24 : free(tbhbuffer);</span></a>
+<a name="763"><span class="lineNum"> 763 </span> : : </a>
+<a name="764"><span class="lineNum"> 764 </span> :<span class="lineCov"> 24 : return rc;</span></a>
+<a name="765"><span class="lineNum"> 765 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/edk2-compat.c.func-sort-c.html b/coverage-report/libstb/secvar/backend/edk2-compat.c.func-sort-c.html
new file mode 100644
index 0000000..c3a3c44
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/edk2-compat.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend/edk2-compat.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/backend</a> - edk2-compat.c<span style="font-size: 80%;"> (<a href="edk2-compat.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntryMed">84.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="edk2-compat.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#27">edk2_compat_pre_process</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#244">edk2_compat_post_process</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#97">edk2_compat_process</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#268">edk2_compat_validate</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/edk2-compat.c.func.html b/coverage-report/libstb/secvar/backend/edk2-compat.c.func.html
new file mode 100644
index 0000000..c173ee6
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/edk2-compat.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend/edk2-compat.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/backend</a> - edk2-compat.c<span style="font-size: 80%;"> (<a href="edk2-compat.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntryMed">84.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="edk2-compat.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#244">edk2_compat_post_process</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#27">edk2_compat_pre_process</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#97">edk2_compat_process</a></td>
+ <td class="coverFnHi">21</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="edk2-compat.c.gcov.html#268">edk2_compat_validate</a></td>
+ <td class="coverFnHi">26</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/edk2-compat.c.gcov.html b/coverage-report/libstb/secvar/backend/edk2-compat.c.gcov.html
new file mode 100644
index 0000000..30c10d8
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/edk2-compat.c.gcov.html
@@ -0,0 +1,381 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend/edk2-compat.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/backend</a> - edk2-compat.c<span style="font-size: 80%;"> (source / <a href="edk2-compat.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">100</td>
+ <td class="headerCovTableEntry">119</td>
+ <td class="headerCovTableEntryMed">84.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2020 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #ifndef pr_fmt</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define pr_fmt(fmt) &quot;EDK2_COMPAT: &quot; fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #endif</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;opal.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;string.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;time.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;unistd.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;stdint.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;ccan/endian/endian.h&gt;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;mbedtls/error.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;libstb/crypto/pkcs7/pkcs7.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;edk2.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;../secvar.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;edk2-compat-process.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &quot;edk2-compat-reset.h&quot;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : struct list_head staging_bank;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : /*</a>
+<a name="24"><span class="lineNum"> 24 </span> : : * Initializes supported variables as empty if not loaded from</a>
+<a name="25"><span class="lineNum"> 25 </span> : : * storage. Variables are initialized as volatile if not found.</a>
+<a name="26"><span class="lineNum"> 26 </span> : : * Updates should clear this flag.</a>
+<a name="27"><span class="lineNum"> 27 </span> : : * Returns OPAL Error if anything fails in initialization</a>
+<a name="28"><span class="lineNum"> 28 </span> : : */</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : static int edk2_compat_pre_process(struct list_head *variable_bank,</span></a>
+<a name="30"><span class="lineNum"> 30 </span> : : struct list_head *update_bank __unused)</a>
+<a name="31"><span class="lineNum"> 31 </span> : : {</a>
+<a name="32"><span class="lineNum"> 32 </span> : : struct secvar *pkvar;</a>
+<a name="33"><span class="lineNum"> 33 </span> : : struct secvar *kekvar;</a>
+<a name="34"><span class="lineNum"> 34 </span> : : struct secvar *dbvar;</a>
+<a name="35"><span class="lineNum"> 35 </span> : : struct secvar *dbxvar;</a>
+<a name="36"><span class="lineNum"> 36 </span> : : struct secvar *tsvar;</a>
+<a name="37"><span class="lineNum"> 37 </span> : : </a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : pkvar = find_secvar(&quot;PK&quot;, 3, variable_bank);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : if (!pkvar) {</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1 : pkvar = new_secvar(&quot;PK&quot;, 3, NULL, 0, SECVAR_FLAG_VOLATILE</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : | SECVAR_FLAG_PROTECTED);</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : if (!pkvar)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : list_add_tail(variable_bank, &amp;pkvar-&gt;link);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : }</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : if (pkvar-&gt;data_size == 0)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : setup_mode = true;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : else</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : setup_mode = false;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : kekvar = find_secvar(&quot;KEK&quot;, 4, variable_bank);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : if (!kekvar) {</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : kekvar = new_secvar(&quot;KEK&quot;, 4, NULL, 0, SECVAR_FLAG_VOLATILE);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : if (!kekvar)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : list_add_tail(variable_bank, &amp;kekvar-&gt;link);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : }</a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : dbvar = find_secvar(&quot;db&quot;, 3, variable_bank);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : if (!dbvar) {</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : dbvar = new_secvar(&quot;db&quot;, 3, NULL, 0, SECVAR_FLAG_VOLATILE);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : if (!dbvar)</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : list_add_tail(variable_bank, &amp;dbvar-&gt;link);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : }</a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : dbxvar = find_secvar(&quot;dbx&quot;, 4, variable_bank);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : if (!dbxvar) {</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : dbxvar = new_secvar(&quot;dbx&quot;, 4, NULL, 0, SECVAR_FLAG_VOLATILE);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : if (!dbxvar)</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : list_add_tail(variable_bank, &amp;dbxvar-&gt;link);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : /*</a>
+<a name="80"><span class="lineNum"> 80 </span> : : * Should only ever happen on first boot. Timestamp is</a>
+<a name="81"><span class="lineNum"> 81 </span> : : * initialized with all zeroes.</a>
+<a name="82"><span class="lineNum"> 82 </span> : : */</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : tsvar = find_secvar(&quot;TS&quot;, 3, variable_bank);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : if (!tsvar) {</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : tsvar = alloc_secvar(3, sizeof(struct efi_time) * 4);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : if (!tsvar)</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : memcpy(tsvar-&gt;key, &quot;TS&quot;, 3);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : tsvar-&gt;key_len = 3;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : tsvar-&gt;data_size = sizeof(struct efi_time) * 4;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : memset(tsvar-&gt;data, 0, tsvar-&gt;data_size);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : list_add_tail(variable_bank, &amp;tsvar-&gt;link);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : }</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : return OPAL_SUCCESS;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : };</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 21 : static int edk2_compat_process(struct list_head *variable_bank,</span></a>
+<a name="100"><span class="lineNum"> 100 </span> : : struct list_head *update_bank)</a>
+<a name="101"><span class="lineNum"> 101 </span> : : {</a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 21 : struct secvar *var = NULL;</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 21 : struct secvar *tsvar = NULL;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : struct efi_time timestamp;</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 21 : char *newesl = NULL;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : int neweslsize;</a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 21 : int rc = 0;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 21 : prlog(PR_INFO, &quot;Setup mode = %d\n&quot;, setup_mode);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : </a>
+<a name="111"><span class="lineNum"> 111 </span> : : /* Check HW-KEY-HASH */</a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 21 : if (!setup_mode) {</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 14 : rc = verify_hw_key_hash();</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 14 : if (rc != OPAL_SUCCESS) {</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : prlog(PR_ERR, &quot;Hardware key hash verification mismatch. Keystore and update queue is reset.\n&quot;);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : rc = reset_keystore(variable_bank);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineNoCov"> 0 : goto cleanup;</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : setup_mode = true;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : goto cleanup;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : }</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /* Return early if we have no updates to process */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 20 : if (list_empty(update_bank)) {</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : return OPAL_EMPTY;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : }</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> : : /*</a>
+<a name="130"><span class="lineNum"> 130 </span> : : * Make a working copy of variable bank that is updated</a>
+<a name="131"><span class="lineNum"> 131 </span> : : * during process</a>
+<a name="132"><span class="lineNum"> 132 </span> : : */</a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineCov"> 20 : list_head_init(&amp;staging_bank);</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 20 : copy_bank_list(&amp;staging_bank, variable_bank);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : /*</a>
+<a name="137"><span class="lineNum"> 137 </span> : : * Loop through each command in the update bank.</a>
+<a name="138"><span class="lineNum"> 138 </span> : : * If any command fails, it just loops out of the update bank.</a>
+<a name="139"><span class="lineNum"> 139 </span> : : * It should also clear the update bank.</a>
+<a name="140"><span class="lineNum"> 140 </span> : : */</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> : : /* Read the TS variable first time and then keep updating it in-memory */</a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 20 : tsvar = find_secvar(&quot;TS&quot;, 3, &amp;staging_bank);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> : : /*</a>
+<a name="146"><span class="lineNum"> 146 </span> : : * We cannot find timestamp variable, did someone tamper it ?, return</a>
+<a name="147"><span class="lineNum"> 147 </span> : : * OPAL_PERMISSION</a>
+<a name="148"><span class="lineNum"> 148 </span> : : */</a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 20 : if (!tsvar)</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineNoCov"> 0 : return OPAL_PERMISSION;</span></a>
+<a name="151"><span class="lineNum"> 151 </span> : : </a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 32 : list_for_each(update_bank, var, link) {</span></a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> : : /*</a>
+<a name="155"><span class="lineNum"> 155 </span> : : * Submitted data is auth_2 descriptor + new ESL data</a>
+<a name="156"><span class="lineNum"> 156 </span> : : * Extract the auth_2 2 descriptor</a>
+<a name="157"><span class="lineNum"> 157 </span> : : */</a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 24 : prlog(PR_INFO, &quot;Update for %s\n&quot;, var-&gt;key);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 24 : rc = process_update(var, &amp;newesl,</span></a>
+<a name="161"><span class="lineNum"> 161 </span> : : &amp;neweslsize, &amp;timestamp,</a>
+<a name="162"><span class="lineNum"> 162 </span> : : &amp;staging_bank,</a>
+<a name="163"><span class="lineNum"> 163 </span> : : tsvar-&gt;data);</a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 24 : if (rc) {</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 12 : prlog(PR_ERR, &quot;Update processing failed with rc %04x\n&quot;, rc);</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 12 : break;</span></a>
+<a name="167"><span class="lineNum"> 167 </span> : : }</a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> : : /*</a>
+<a name="170"><span class="lineNum"> 170 </span> : : * If reached here means, signature is verified so update the</a>
+<a name="171"><span class="lineNum"> 171 </span> : : * value in the variable bank</a>
+<a name="172"><span class="lineNum"> 172 </span> : : */</a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 12 : rc = update_variable_in_bank(var,</span></a>
+<a name="174"><span class="lineNum"> 174 </span> : : newesl,</a>
+<a name="175"><span class="lineNum"> 175 </span> : : neweslsize,</a>
+<a name="176"><span class="lineNum"> 176 </span> : : &amp;staging_bank);</a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 12 : if (rc) {</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Updating the variable data failed %04x\n&quot;, rc);</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="180"><span class="lineNum"> 180 </span> : : }</a>
+<a name="181"><span class="lineNum"> 181 </span> : : </a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 12 : free(newesl);</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 12 : newesl = NULL;</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : /* Update the TS variable with the new timestamp */</a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 12 : rc = update_timestamp(var-&gt;key,</span></a>
+<a name="186"><span class="lineNum"> 186 </span> : : &amp;timestamp,</a>
+<a name="187"><span class="lineNum"> 187 </span> : : tsvar-&gt;data);</a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 12 : if (rc) {</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineNoCov"> 0 : prlog (PR_ERR, &quot;Variable updated, but timestamp updated failed %04x\n&quot;, rc);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : }</a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : /*</a>
+<a name="194"><span class="lineNum"> 194 </span> : : * If the PK is updated, update the secure boot state of the</a>
+<a name="195"><span class="lineNum"> 195 </span> : : * system at the end of processing</a>
+<a name="196"><span class="lineNum"> 196 </span> : : */</a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 12 : if (key_equals(var-&gt;key, &quot;PK&quot;)) {</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : /*</a>
+<a name="199"><span class="lineNum"> 199 </span> : : * PK is tied to a particular firmware image by mapping it with</a>
+<a name="200"><span class="lineNum"> 200 </span> : : * hw-key-hash of that firmware. When PK is updated, hw-key-hash</a>
+<a name="201"><span class="lineNum"> 201 </span> : : * is updated. And when PK is deleted, delete hw-key-hash as well</a>
+<a name="202"><span class="lineNum"> 202 </span> : : */</a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 5 : if(neweslsize == 0) {</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 2 : setup_mode = true;</span></a>
+<a name="205"><span class="lineNum"> 205 </span> :<span class="lineCov"> 2 : delete_hw_key_hash(&amp;staging_bank);</span></a>
+<a name="206"><span class="lineNum"> 206 </span> : : } else {</a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 3 : setup_mode = false;</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 3 : add_hw_key_hash(&amp;staging_bank);</span></a>
+<a name="209"><span class="lineNum"> 209 </span> : : }</a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 5 : prlog(PR_DEBUG, &quot;setup mode is %d\n&quot;, setup_mode);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : }</a>
+<a name="212"><span class="lineNum"> 212 </span> : : }</a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 20 : if (rc == 0) {</span></a>
+<a name="215"><span class="lineNum"> 215 </span> : : /* Update the variable bank with updated working copy */</a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 8 : clear_bank_list(variable_bank);</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 8 : copy_bank_list(variable_bank, &amp;staging_bank);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> : : }</a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 20 : free(newesl);</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 20 : clear_bank_list(&amp;staging_bank);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> : : /* Set the global variable setup_mode as per final contents in variable_bank */</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 20 : var = find_secvar(&quot;PK&quot;, 3, variable_bank);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 20 : if (!var) {</span></a>
+<a name="226"><span class="lineNum"> 226 </span> : : /* This should not happen */</a>
+<a name="227"><span class="lineNum"> 227 </span> :<span class="lineNoCov"> 0 : rc = OPAL_INTERNAL_ERROR;</span></a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineNoCov"> 0 : goto cleanup;</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : }</a>
+<a name="230"><span class="lineNum"> 230 </span> : : </a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 20 : if (var-&gt;data_size == 0)</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 7 : setup_mode = true;</span></a>
+<a name="233"><span class="lineNum"> 233 </span> : : else</a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 13 : setup_mode = false;</span></a>
+<a name="235"><span class="lineNum"> 235 </span> : : </a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 21 : cleanup:</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : /*</a>
+<a name="238"><span class="lineNum"> 238 </span> : : * For any failure in processing update queue, we clear the update bank</a>
+<a name="239"><span class="lineNum"> 239 </span> : : * and return failure</a>
+<a name="240"><span class="lineNum"> 240 </span> : : */</a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 21 : clear_bank_list(update_bank);</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : </a>
+<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 21 : return rc;</span></a>
+<a name="244"><span class="lineNum"> 244 </span> : : }</a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 5 : static int edk2_compat_post_process(struct list_head *variable_bank,</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : struct list_head *update_bank __unused)</a>
+<a name="248"><span class="lineNum"> 248 </span> : : {</a>
+<a name="249"><span class="lineNum"> 249 </span> : : struct secvar *hwvar;</a>
+<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 5 : if (!setup_mode) {</span></a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 2 : secvar_set_secure_mode();</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 2 : prlog(PR_INFO, &quot;Enforcing OS secure mode\n&quot;);</span></a>
+<a name="253"><span class="lineNum"> 253 </span> : : /*</a>
+<a name="254"><span class="lineNum"> 254 </span> : : * HW KEY HASH is no more needed after this point. It is already</a>
+<a name="255"><span class="lineNum"> 255 </span> : : * visible to userspace via device-tree, so exposing via sysfs is</a>
+<a name="256"><span class="lineNum"> 256 </span> : : * just a duplication. Remove it from in-memory copy.</a>
+<a name="257"><span class="lineNum"> 257 </span> : : */</a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineCov"> 2 : hwvar = find_secvar(&quot;HWKH&quot;, 5, variable_bank);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineCov"> 2 : if (!hwvar) {</span></a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;cannot find hw-key-hash, should not happen\n&quot;);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="262"><span class="lineNum"> 262 </span> : : }</a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 2 : list_del(&amp;hwvar-&gt;link);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 2 : dealloc_secvar(hwvar);</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : }</a>
+<a name="266"><span class="lineNum"> 266 </span> : : </a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 5 : return OPAL_SUCCESS;</span></a>
+<a name="268"><span class="lineNum"> 268 </span> : : }</a>
+<a name="269"><span class="lineNum"> 269 </span> : : </a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 26 : static int edk2_compat_validate(struct secvar *var)</span></a>
+<a name="271"><span class="lineNum"> 271 </span> : : {</a>
+<a name="272"><span class="lineNum"> 272 </span> : : </a>
+<a name="273"><span class="lineNum"> 273 </span> : : /*</a>
+<a name="274"><span class="lineNum"> 274 </span> : : * Checks if the update is for supported</a>
+<a name="275"><span class="lineNum"> 275 </span> : : * Non-volatile secure variables</a>
+<a name="276"><span class="lineNum"> 276 </span> : : */</a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 26 : if (!key_equals(var-&gt;key, &quot;PK&quot;)</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 19 : &amp;&amp; !key_equals(var-&gt;key, &quot;KEK&quot;)</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 13 : &amp;&amp; !key_equals(var-&gt;key, &quot;db&quot;)</span></a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 6 : &amp;&amp; !key_equals(var-&gt;key, &quot;dbx&quot;))</span></a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> : : /* Check that signature type is PKCS7 */</a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 26 : if (!is_pkcs7_sig_format(var-&gt;data))</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineNoCov"> 0 : return OPAL_PARAMETER;</span></a>
+<a name="286"><span class="lineNum"> 286 </span> : : </a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 26 : return OPAL_SUCCESS;</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : };</a>
+<a name="289"><span class="lineNum"> 289 </span> : : </a>
+<a name="290"><span class="lineNum"> 290 </span> : : struct secvar_backend_driver edk2_compatible_v1 = {</a>
+<a name="291"><span class="lineNum"> 291 </span> : : .pre_process = edk2_compat_pre_process,</a>
+<a name="292"><span class="lineNum"> 292 </span> : : .process = edk2_compat_process,</a>
+<a name="293"><span class="lineNum"> 293 </span> : : .post_process = edk2_compat_post_process,</a>
+<a name="294"><span class="lineNum"> 294 </span> : : .validate = edk2_compat_validate,</a>
+<a name="295"><span class="lineNum"> 295 </span> : : .compatible = &quot;ibm,edk2-compat-v1&quot;,</a>
+<a name="296"><span class="lineNum"> 296 </span> : : };</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/index-sort-b.html b/coverage-report/libstb/secvar/backend/index-sort-b.html
new file mode 100644
index 0000000..d7af0b1
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/backend</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">423</td>
+ <td class="headerCovTableEntry">516</td>
+ <td class="headerCovTableEntryMed">82.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat-process.c.gcov.html">edk2-compat-process.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=81 height=10 alt="81.4%"><img src="../../../snow.png" width=19 height=10 alt="81.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.4&nbsp;%</td>
+ <td class="coverNumMed">323 / 397</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat.c.gcov.html">edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=84 height=10 alt="84.0%"><img src="../../../snow.png" width=16 height=10 alt="84.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.0&nbsp;%</td>
+ <td class="coverNumMed">100 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/index-sort-f.html b/coverage-report/libstb/secvar/backend/index-sort-f.html
new file mode 100644
index 0000000..0d334d3
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/backend</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">423</td>
+ <td class="headerCovTableEntry">516</td>
+ <td class="headerCovTableEntryMed">82.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat.c.gcov.html">edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=84 height=10 alt="84.0%"><img src="../../../snow.png" width=16 height=10 alt="84.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.0&nbsp;%</td>
+ <td class="coverNumMed">100 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat-process.c.gcov.html">edk2-compat-process.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=81 height=10 alt="81.4%"><img src="../../../snow.png" width=19 height=10 alt="81.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.4&nbsp;%</td>
+ <td class="coverNumMed">323 / 397</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/index-sort-l.html b/coverage-report/libstb/secvar/backend/index-sort-l.html
new file mode 100644
index 0000000..d88e7e6
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/backend</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">423</td>
+ <td class="headerCovTableEntry">516</td>
+ <td class="headerCovTableEntryMed">82.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat-process.c.gcov.html">edk2-compat-process.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=81 height=10 alt="81.4%"><img src="../../../snow.png" width=19 height=10 alt="81.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.4&nbsp;%</td>
+ <td class="coverNumMed">323 / 397</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat.c.gcov.html">edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=84 height=10 alt="84.0%"><img src="../../../snow.png" width=16 height=10 alt="84.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.0&nbsp;%</td>
+ <td class="coverNumMed">100 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/backend/index.html b/coverage-report/libstb/secvar/backend/index.html
new file mode 100644
index 0000000..f3f1a0a
--- /dev/null
+++ b/coverage-report/libstb/secvar/backend/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/backend</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/backend</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">423</td>
+ <td class="headerCovTableEntry">516</td>
+ <td class="headerCovTableEntryMed">82.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntry">24</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat-process.c.gcov.html">edk2-compat-process.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=81 height=10 alt="81.4%"><img src="../../../snow.png" width=19 height=10 alt="81.4%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.4&nbsp;%</td>
+ <td class="coverNumMed">323 / 397</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">20 / 20</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="edk2-compat.c.gcov.html">edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../amber.png" width=84 height=10 alt="84.0%"><img src="../../../snow.png" width=16 height=10 alt="84.0%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">84.0&nbsp;%</td>
+ <td class="coverNumMed">100 / 119</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/index-sort-b.html b/coverage-report/libstb/secvar/index-sort-b.html
new file mode 100644
index 0000000..5f4707d
--- /dev/null
+++ b/coverage-report/libstb/secvar/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/secvar</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_util.c.gcov.html">secvar_util.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=82 height=10 alt="81.6%"><img src="../../snow.png" width=18 height=10 alt="81.6%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.6&nbsp;%</td>
+ <td class="coverNumMed">62 / 76</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api.c.gcov.html">secvar_api.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="95.8%"><img src="../../snow.png" width=4 height=10 alt="95.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.8&nbsp;%</td>
+ <td class="coverNumHi">91 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/index-sort-f.html b/coverage-report/libstb/secvar/index-sort-f.html
new file mode 100644
index 0000000..9130074
--- /dev/null
+++ b/coverage-report/libstb/secvar/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/secvar</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api.c.gcov.html">secvar_api.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="95.8%"><img src="../../snow.png" width=4 height=10 alt="95.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.8&nbsp;%</td>
+ <td class="coverNumHi">91 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_util.c.gcov.html">secvar_util.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=82 height=10 alt="81.6%"><img src="../../snow.png" width=18 height=10 alt="81.6%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.6&nbsp;%</td>
+ <td class="coverNumMed">62 / 76</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/index-sort-l.html b/coverage-report/libstb/secvar/index-sort-l.html
new file mode 100644
index 0000000..d155f7b
--- /dev/null
+++ b/coverage-report/libstb/secvar/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/secvar</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_util.c.gcov.html">secvar_util.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=82 height=10 alt="81.6%"><img src="../../snow.png" width=18 height=10 alt="81.6%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.6&nbsp;%</td>
+ <td class="coverNumMed">62 / 76</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api.c.gcov.html">secvar_api.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="95.8%"><img src="../../snow.png" width=4 height=10 alt="95.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.8&nbsp;%</td>
+ <td class="coverNumHi">91 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/index.html b/coverage-report/libstb/secvar/index.html
new file mode 100644
index 0000000..4c59b85
--- /dev/null
+++ b/coverage-report/libstb/secvar/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/secvar</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">153</td>
+ <td class="headerCovTableEntry">171</td>
+ <td class="headerCovTableEntryMed">89.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api.c.gcov.html">secvar_api.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="95.8%"><img src="../../snow.png" width=4 height=10 alt="95.8%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.8&nbsp;%</td>
+ <td class="coverNumHi">91 / 95</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">3 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_util.c.gcov.html">secvar_util.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../amber.png" width=82 height=10 alt="81.6%"><img src="../../snow.png" width=18 height=10 alt="81.6%"></td></tr></table>
+ </td>
+ <td class="coverPerMed">81.6&nbsp;%</td>
+ <td class="coverNumMed">62 / 76</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/secvar_api.c.func-sort-c.html b/coverage-report/libstb/secvar/secvar_api.c.func-sort-c.html
new file mode 100644
index 0000000..297c3d2
--- /dev/null
+++ b/coverage-report/libstb/secvar/secvar_api.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/secvar_api.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/secvar</a> - secvar_api.c<span style="font-size: 80%;"> (<a href="secvar_api.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryHi">95.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar_api.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api.c.gcov.html#10">opal_secvar_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api.c.gcov.html#45">opal_secvar_get_next</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api.c.gcov.html#90">opal_secvar_enqueue_update</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/secvar_api.c.func.html b/coverage-report/libstb/secvar/secvar_api.c.func.html
new file mode 100644
index 0000000..3fc82f8
--- /dev/null
+++ b/coverage-report/libstb/secvar/secvar_api.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/secvar_api.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/secvar</a> - secvar_api.c<span style="font-size: 80%;"> (<a href="secvar_api.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryHi">95.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar_api.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api.c.gcov.html#90">opal_secvar_enqueue_update</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api.c.gcov.html#10">opal_secvar_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api.c.gcov.html#45">opal_secvar_get_next</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/secvar_api.c.gcov.html b/coverage-report/libstb/secvar/secvar_api.c.gcov.html
new file mode 100644
index 0000000..6c871da
--- /dev/null
+++ b/coverage-report/libstb/secvar/secvar_api.c.gcov.html
@@ -0,0 +1,242 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/secvar_api.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/secvar</a> - secvar_api.c<span style="font-size: 80%;"> (source / <a href="secvar_api.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">91</td>
+ <td class="headerCovTableEntry">95</td>
+ <td class="headerCovTableEntryHi">95.8 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef pr_fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define pr_fmt(fmt) &quot;SECVAR_API: &quot; fmt</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #endif</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;opal.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;secvar.h&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 10 : static int64_t opal_secvar_get(const char *key, uint64_t key_len, void *data, uint64_t *data_size)</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : {</a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct secvar *var;</a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 10 : int64_t rc = OPAL_SUCCESS;</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 10 : if (!secvar_enabled)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 1 : return OPAL_UNSUPPORTED;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 9 : if (!secvar_ready)</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 1 : return OPAL_RESOURCE;</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 8 : if (!key)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 7 : if (key_len == 0)</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : // Data size must be set, data is optional for size query</a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 6 : if (!data_size)</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 5 : var = find_secvar(key, key_len, &amp;variable_bank);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 5 : if (!var)</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1 : return OPAL_EMPTY; // Variable not found, bail early</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 4 : if (!data)</span></a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1 : rc = OPAL_SUCCESS;</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 3 : else if (*data_size &lt; var-&gt;data_size)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 2 : rc = OPAL_PARTIAL;</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : else</a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : memcpy(data, var-&gt;data, var-&gt;data_size);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 4 : *data_size = var-&gt;data_size;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 4 : return rc;</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : }</a>
+<a name="44"><span class="lineNum"> 44 </span> : : opal_call(OPAL_SECVAR_GET, opal_secvar_get, 4);</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 13 : static int64_t opal_secvar_get_next(char *key, uint64_t *key_len, uint64_t key_buf_size)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : {</a>
+<a name="49"><span class="lineNum"> 49 </span> : : struct secvar *var;</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 13 : if (!secvar_enabled)</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : return OPAL_UNSUPPORTED;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 12 : if (!secvar_ready)</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : return OPAL_RESOURCE;</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 11 : if (!key_len)</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 10 : if (key_buf_size == 0)</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 9 : if (*key_len &gt; SECVAR_MAX_KEY_LEN)</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 8 : if (*key_len &gt; key_buf_size)</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 7 : if (!key)</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 6 : if (!is_key_empty(key, *key_len)) {</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 4 : var = find_secvar(key, *key_len, &amp;variable_bank);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 4 : if (!var)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 3 : var = list_next(&amp;variable_bank, var, link);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : } else {</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 2 : var = list_top(&amp;variable_bank, struct secvar, link);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : }</a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 5 : if (!var)</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : return OPAL_EMPTY;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 4 : if (key_buf_size &lt; var-&gt;key_len) {</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : *key_len = var-&gt;key_len;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : return OPAL_PARTIAL;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : }</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 3 : *key_len = var-&gt;key_len;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 3 : memcpy(key, var-&gt;key, var-&gt;key_len);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 3 : return OPAL_SUCCESS;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : opal_call(OPAL_SECVAR_GET_NEXT, opal_secvar_get_next, 3);</a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 16 : static int64_t opal_secvar_enqueue_update(const char *key, uint64_t key_len, void *data, uint64_t data_size)</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : {</a>
+<a name="94"><span class="lineNum"> 94 </span> : : struct secvar *var;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : </a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 16 : if (!secvar_enabled)</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : return OPAL_UNSUPPORTED;</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 15 : if (!secvar_ready)</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : return OPAL_RESOURCE;</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 14 : if (!secvar_storage.write_bank)</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : return OPAL_HARDWARE;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 13 : if (!key)</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineCov"> 12 : if (key_len == 0)</span></a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 11 : if (key_len &gt; SECVAR_MAX_KEY_LEN)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 10 : if ((!data) &amp;&amp; (data_size != 0))</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 9 : if (data_size &gt; secvar_storage.max_var_size)</span></a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : return OPAL_PARAMETER;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : // Key should not be empty</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 8 : if (is_key_empty(key, key_len))</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 2 : return OPAL_PARAMETER;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 6 : var = find_secvar(key, key_len, &amp;update_bank);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> : : // Unstage an update</a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 6 : if (data_size == 0) {</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 2 : if (!var)</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : return OPAL_EMPTY;</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : list_del(&amp;var-&gt;link);</span></a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : dealloc_secvar(var);</span></a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : goto out;</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : }</a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 4 : if (var) {</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : list_del(&amp;var-&gt;link);</span></a>
+<a name="131"><span class="lineNum"> 131 </span> : : // Realloc var if too small</a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : if (var-&gt;data_size &lt; data_size) {</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : if (realloc_secvar(var, data_size))</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : } else {</a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : memset(var-&gt;data, 0x00, var-&gt;data_size);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> : : }</a>
+<a name="138"><span class="lineNum"> 138 </span> : : } else {</a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 3 : var = alloc_secvar(key_len, data_size);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 3 : if (!var)</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="142"><span class="lineNum"> 142 </span> : : }</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 4 : memcpy(var-&gt;key, key, key_len);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 4 : var-&gt;key_len = key_len;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 4 : memcpy(var-&gt;data, data, data_size);</span></a>
+<a name="147"><span class="lineNum"> 147 </span> :<span class="lineCov"> 4 : var-&gt;data_size = data_size;</span></a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 4 : list_add_tail(&amp;update_bank, &amp;var-&gt;link);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 5 : out:</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 5 : if (secvar_storage.write_bank(&amp;update_bank, SECVAR_UPDATE_BANK))</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : return OPAL_HARDWARE;</span></a>
+<a name="154"><span class="lineNum"> 154 </span> : : else</a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 5 : return OPAL_SUCCESS;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : }</a>
+<a name="157"><span class="lineNum"> 157 </span> : : opal_call(OPAL_SECVAR_ENQUEUE_UPDATE, opal_secvar_enqueue_update, 4);</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/secvar_util.c.func-sort-c.html b/coverage-report/libstb/secvar/secvar_util.c.func-sort-c.html
new file mode 100644
index 0000000..aa2d03a
--- /dev/null
+++ b/coverage-report/libstb/secvar/secvar_util.c.func-sort-c.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/secvar_util.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/secvar</a> - secvar_util.c<span style="font-size: 80%;"> (<a href="secvar_util.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">76</td>
+ <td class="headerCovTableEntryMed">81.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar_util.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#93">realloc_secvar</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#136">is_key_empty</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#25">copy_bank_list</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#12">clear_bank_list</a></td>
+ <td class="coverFnHi">63</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#147">list_length</a></td>
+ <td class="coverFnHi">92</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#121">find_secvar</a></td>
+ <td class="coverFnHi">109</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#67">new_secvar</a></td>
+ <td class="coverFnHi">186</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#40">alloc_secvar</a></td>
+ <td class="coverFnHi">198</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#111">dealloc_secvar</a></td>
+ <td class="coverFnHi">198</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/secvar_util.c.func.html b/coverage-report/libstb/secvar/secvar_util.c.func.html
new file mode 100644
index 0000000..6345815
--- /dev/null
+++ b/coverage-report/libstb/secvar/secvar_util.c.func.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/secvar_util.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/secvar</a> - secvar_util.c<span style="font-size: 80%;"> (<a href="secvar_util.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">76</td>
+ <td class="headerCovTableEntryMed">81.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar_util.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#40">alloc_secvar</a></td>
+ <td class="coverFnHi">198</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#12">clear_bank_list</a></td>
+ <td class="coverFnHi">63</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#25">copy_bank_list</a></td>
+ <td class="coverFnHi">28</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#111">dealloc_secvar</a></td>
+ <td class="coverFnHi">198</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#121">find_secvar</a></td>
+ <td class="coverFnHi">109</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#136">is_key_empty</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#147">list_length</a></td>
+ <td class="coverFnHi">92</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#67">new_secvar</a></td>
+ <td class="coverFnHi">186</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_util.c.gcov.html#93">realloc_secvar</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/secvar_util.c.gcov.html b/coverage-report/libstb/secvar/secvar_util.c.gcov.html
new file mode 100644
index 0000000..7a5ffa8
--- /dev/null
+++ b/coverage-report/libstb/secvar/secvar_util.c.gcov.html
@@ -0,0 +1,243 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/secvar_util.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/secvar</a> - secvar_util.c<span style="font-size: 80%;"> (source / <a href="secvar_util.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">76</td>
+ <td class="headerCovTableEntryMed">81.6 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #ifndef pr_fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #define pr_fmt(fmt) &quot;SECVAR: &quot; fmt</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #endif</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;string.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;opal.h&gt;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;secvar.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 63 : void clear_bank_list(struct list_head *bank)</span></a>
+<a name="15"><span class="lineNum"> 15 </span> : : {</a>
+<a name="16"><span class="lineNum"> 16 </span> : : struct secvar *var, *next;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 63 : if (!bank)</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 256 : list_for_each_safe(bank, var, next, link) {</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 193 : list_del(&amp;var-&gt;link);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 193 : dealloc_secvar(var);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : }</a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 28 : int copy_bank_list(struct list_head *dst, struct list_head *src)</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : {</a>
+<a name="29"><span class="lineNum"> 29 </span> : : struct secvar *var, *tmp;</a>
+<a name="30"><span class="lineNum"> 30 </span> : : </a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 171 : list_for_each(src, var, link) {</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : /* Allocate new secvar using actual data size */</a>
+<a name="33"><span class="lineNum"> 33 </span> :<span class="lineCov"> 143 : tmp = new_secvar(var-&gt;key, var-&gt;key_len, var-&gt;data,</span></a>
+<a name="34"><span class="lineNum"> 34 </span> : : var-&gt;data_size, var-&gt;flags);</a>
+<a name="35"><span class="lineNum"> 35 </span> : : /* Append to new list */</a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 143 : list_add_tail(dst, &amp;tmp-&gt;link);</span></a>
+<a name="37"><span class="lineNum"> 37 </span> : : }</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 28 : return OPAL_SUCCESS;</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : }</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 198 : struct secvar *alloc_secvar(uint64_t key_len, uint64_t data_size)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> : : struct secvar *ret;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 198 : ret = zalloc(sizeof(struct secvar));</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 198 : if (!ret)</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : </a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 198 : ret-&gt;key = zalloc(key_len);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 198 : if (!ret-&gt;key) {</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : free(ret);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 198 : ret-&gt;data = zalloc(data_size);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 198 : if (!ret-&gt;data) {</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineNoCov"> 0 : free(ret-&gt;key);</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : free(ret);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : }</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 198 : ret-&gt;key_len = key_len;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 198 : ret-&gt;data_size = data_size;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> : : </a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 198 : return ret;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : }</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 186 : struct secvar *new_secvar(const char *key, uint64_t key_len,</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : const char *data, uint64_t data_size,</a>
+<a name="71"><span class="lineNum"> 71 </span> : : uint64_t flags)</a>
+<a name="72"><span class="lineNum"> 72 </span> : : {</a>
+<a name="73"><span class="lineNum"> 73 </span> : : struct secvar *ret;</a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 186 : if (!key)</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 186 : if ((!key_len) || (key_len &gt; SECVAR_MAX_KEY_LEN))</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 186 : if ((!data) &amp;&amp; (data_size))</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 186 : ret = alloc_secvar(key_len, data_size);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 186 : if (!ret)</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 186 : memcpy(ret-&gt;key, key, key_len);</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 186 : ret-&gt;flags = flags;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : </a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 186 : if (data)</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 179 : memcpy(ret-&gt;data, data, data_size);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 186 : return ret;</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : }</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 9 : int realloc_secvar(struct secvar *var, uint64_t size)</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : {</a>
+<a name="97"><span class="lineNum"> 97 </span> : : void *tmp;</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 9 : if (var-&gt;data_size &gt;= size)</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 9 : tmp = zalloc(size);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 9 : if (!tmp)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 9 : memcpy(tmp, var-&gt;data, var-&gt;data_size);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 9 : free(var-&gt;data);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 9 : var-&gt;data = tmp;</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 9 : return 0;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 198 : void dealloc_secvar(struct secvar *var)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 198 : if (!var)</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : return;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : </a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 198 : free(var-&gt;key);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 198 : free(var-&gt;data);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 198 : free(var);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 109 : struct secvar *find_secvar(const char *key, uint64_t key_len, struct list_head *bank)</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : {</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 109 : struct secvar *var = NULL;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 279 : list_for_each(bank, var, link) {</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : // Prevent matching shorter key subsets / bail early</a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 268 : if (key_len != var-&gt;key_len)</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 108 : continue;</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 160 : if (!memcmp(key, var-&gt;key, key_len))</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 98 : return var;</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : }</a>
+<a name="134"><span class="lineNum"> 134 </span> : : </a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 11 : return NULL;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> : : }</a>
+<a name="137"><span class="lineNum"> 137 </span> : : </a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 14 : int is_key_empty(const char *key, uint64_t key_len)</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : {</a>
+<a name="140"><span class="lineNum"> 140 </span> : : int i;</a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 24 : for (i = 0; i &lt; key_len; i++) {</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 20 : if (key[i] != 0)</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 10 : return 0;</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : }</a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 4 : return 1;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : }</a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 92 : int list_length(struct list_head *bank)</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : {</a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 92 : int ret = 0;</span></a>
+<a name="152"><span class="lineNum"> 152 </span> : : struct secvar *var;</a>
+<a name="153"><span class="lineNum"> 153 </span> : : </a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 295 : list_for_each(bank, var, link)</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 203 : ret++;</span></a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 92 : return ret;</span></a>
+<a name="158"><span class="lineNum"> 158 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/fakenv_ops.c.func-sort-c.html b/coverage-report/libstb/secvar/storage/fakenv_ops.c.func-sort-c.html
new file mode 100644
index 0000000..7f433e1
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/fakenv_ops.c.func-sort-c.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage/fakenv_ops.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/storage</a> - fakenv_ops.c<span style="font-size: 80%;"> (<a href="fakenv_ops.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">34</td>
+ <td class="headerCovTableEntry">81</td>
+ <td class="headerCovTableEntryLo">42.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryLo">55.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="fakenv_ops.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#49">fakenv_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#143">fakenv_readpublic</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#124">fakenv_undefinespace</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#91">fakenv_writelock</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#101">fakenv_get_defined_indices</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#72">fakenv_definespace</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#60">fakenv_write</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#20">nv_index_address</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#33">tpm_init</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/fakenv_ops.c.func.html b/coverage-report/libstb/secvar/storage/fakenv_ops.c.func.html
new file mode 100644
index 0000000..8a16cbe
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/fakenv_ops.c.func.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage/fakenv_ops.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/storage</a> - fakenv_ops.c<span style="font-size: 80%;"> (<a href="fakenv_ops.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">34</td>
+ <td class="headerCovTableEntry">81</td>
+ <td class="headerCovTableEntryLo">42.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryLo">55.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="fakenv_ops.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#72">fakenv_definespace</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#101">fakenv_get_defined_indices</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#49">fakenv_read</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#143">fakenv_readpublic</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#124">fakenv_undefinespace</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#60">fakenv_write</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#91">fakenv_writelock</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#20">nv_index_address</a></td>
+ <td class="coverFnHi">9</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="fakenv_ops.c.gcov.html#33">tpm_init</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/fakenv_ops.c.gcov.html b/coverage-report/libstb/secvar/storage/fakenv_ops.c.gcov.html
new file mode 100644
index 0000000..5b79fb4
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/fakenv_ops.c.gcov.html
@@ -0,0 +1,260 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage/fakenv_ops.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/storage</a> - fakenv_ops.c<span style="font-size: 80%;"> (source / <a href="fakenv_ops.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">34</td>
+ <td class="headerCovTableEntry">81</td>
+ <td class="headerCovTableEntryLo">42.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">5</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryLo">55.6 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2020 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;secboot_tpm.h&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : /* Offset into the SECBOOT PNOR partition to write &quot;TPMNV&quot; data */</a>
+<a name="7"><span class="lineNum"> 7 </span> : : static size_t fakenv_offset = sizeof(struct secboot);</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : struct fake_tpmnv {</a>
+<a name="10"><span class="lineNum"> 10 </span> : : struct {</a>
+<a name="11"><span class="lineNum"> 11 </span> : : struct secboot_header header;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : char vars[2048]; // Hardcode the size to 2048 for now</a>
+<a name="13"><span class="lineNum"> 13 </span> : : } vars;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : struct tpmnv_control control;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : int defined[2];</a>
+<a name="16"><span class="lineNum"> 16 </span> : : } __attribute__((packed));</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : static struct fake_tpmnv fakenv;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : static int tpm_ready;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 9 : static inline void *nv_index_address(int index)</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : {</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 9 : switch (index) {</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 3 : case SECBOOT_TPMNV_VARS_INDEX:</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 3 : return &amp;fakenv.vars;</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 6 : case SECBOOT_TPMNV_CONTROL_INDEX:</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 6 : return &amp;fakenv.control;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : }</a>
+<a name="32"><span class="lineNum"> 32 </span> : : }</a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 12 : static int tpm_init(void)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : {</a>
+<a name="37"><span class="lineNum"> 37 </span> : : int rc;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 12 : if (tpm_ready)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 11 : return 0;</span></a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : rc = flash_secboot_read(&amp;fakenv, fakenv_offset, sizeof(struct fake_tpmnv));</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : tpm_ready = 1;</span></a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : }</a>
+<a name="50"><span class="lineNum"> 50 </span> : : </a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : static int fakenv_read(TPMI_RH_NV_INDEX nvIndex, void *buf,</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : size_t bufsize, uint16_t off)</a>
+<a name="53"><span class="lineNum"> 53 </span> : : {</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineNoCov"> 0 : if (tpm_init())</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineNoCov"> 0 : memcpy(buf, nv_index_address(nvIndex) + off, bufsize);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : }</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 9 : static int fakenv_write(TPMI_RH_NV_INDEX nvIndex, void *buf,</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : size_t bufsize, uint16_t off)</a>
+<a name="64"><span class="lineNum"> 64 </span> : : {</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 9 : if (tpm_init())</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 9 : memcpy(nv_index_address(nvIndex) + off, buf, bufsize);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : </a>
+<a name="70"><span class="lineNum"> 70 </span> : : /* Just write the whole NV struct for now */</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 9 : return flash_secboot_write(fakenv_offset, &amp;fakenv, sizeof(struct fake_tpmnv));</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : }</a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 2 : static int fakenv_definespace(TPMI_RH_NV_INDEX nvIndex, uint16_t dataSize)</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : {</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 2 : if (tpm_init())</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : (void) dataSize;</a>
+<a name="80"><span class="lineNum"> 80 </span> : : </a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 2 : switch (nvIndex) {</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : case SECBOOT_TPMNV_VARS_INDEX:</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : fakenv.defined[0] = 1;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : case SECBOOT_TPMNV_CONTROL_INDEX:</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : fakenv.defined[1] = 1;</span></a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : }</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineNoCov"> 0 : static int fakenv_writelock(TPMI_RH_NV_INDEX nvIndex)</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : {</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineNoCov"> 0 : if (tpm_init())</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> : : (void) nvIndex;</a>
+<a name="99"><span class="lineNum"> 99 </span> : : </a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : static int fakenv_get_defined_indices(TPMI_RH_NV_INDEX **indices, size_t *count)</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : {</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : if (tpm_init())</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="107"><span class="lineNum"> 107 </span> : : </a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : *indices = zalloc(sizeof(fakenv.defined));</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : if (*indices == NULL)</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : *count = 0;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : if (fakenv.defined[0]) {</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineNoCov"> 0 : *indices[0] = SECBOOT_TPMNV_VARS_INDEX;</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineNoCov"> 0 : (*count)++;</span></a>
+<a name="117"><span class="lineNum"> 117 </span> : : }</a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : if (fakenv.defined[1]) {</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineNoCov"> 0 : *indices[1] = SECBOOT_TPMNV_CONTROL_INDEX;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineNoCov"> 0 : (*count)++;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : }</a>
+<a name="125"><span class="lineNum"> 125 </span> : : </a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineNoCov"> 0 : static int fakenv_undefinespace(TPMI_RH_NV_INDEX index)</span></a>
+<a name="127"><span class="lineNum"> 127 </span> : : {</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : if (tpm_init())</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineNoCov"> 0 : switch (index) {</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : case SECBOOT_TPMNV_VARS_INDEX:</span></a>
+<a name="133"><span class="lineNum"> 133 </span> :<span class="lineNoCov"> 0 : fakenv.defined[0] = 0;</span></a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineNoCov"> 0 : memset(&amp;fakenv.vars, 0, sizeof(fakenv.vars));</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineNoCov"> 0 : case SECBOOT_TPMNV_CONTROL_INDEX:</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : fakenv.defined[1] = 0;</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : memset(&amp;fakenv.control, 0, sizeof(fakenv.control));</span></a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="140"><span class="lineNum"> 140 </span> : : }</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineNoCov"> 0 : return -1;</span></a>
+<a name="143"><span class="lineNum"> 143 </span> : : }</a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineNoCov"> 0 : static int fakenv_readpublic(TPMI_RH_NV_INDEX index, TPMS_NV_PUBLIC *nv_public,</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : TPM2B_NAME *nv_name)</a>
+<a name="147"><span class="lineNum"> 147 </span> : : {</a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineNoCov"> 0 : if (tpm_init())</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="150"><span class="lineNum"> 150 </span> : : </a>
+<a name="151"><span class="lineNum"> 151 </span> : : (void) nv_public;</a>
+<a name="152"><span class="lineNum"> 152 </span> : : </a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineNoCov"> 0 : switch (index) {</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineNoCov"> 0 : case SECBOOT_TPMNV_VARS_INDEX:</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;nv_name-&gt;t.name, tpmnv_vars_name, sizeof(TPM2B_NAME));</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineNoCov"> 0 : case SECBOOT_TPMNV_CONTROL_INDEX:</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : memcpy(&amp;nv_name-&gt;t.name, tpmnv_control_name, sizeof(TPM2B_NAME));</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineNoCov"> 0 : return OPAL_INTERNAL_ERROR;</span></a>
+<a name="162"><span class="lineNum"> 162 </span> : : }</a>
+<a name="163"><span class="lineNum"> 163 </span> : : </a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineNoCov"> 0 : return 0;</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : }</a>
+<a name="166"><span class="lineNum"> 166 </span> : : </a>
+<a name="167"><span class="lineNum"> 167 </span> : : struct tpmnv_ops_s tpmnv_ops = {</a>
+<a name="168"><span class="lineNum"> 168 </span> : : .read = fakenv_read,</a>
+<a name="169"><span class="lineNum"> 169 </span> : : .write = fakenv_write,</a>
+<a name="170"><span class="lineNum"> 170 </span> : : .writelock = fakenv_writelock,</a>
+<a name="171"><span class="lineNum"> 171 </span> : : .definespace = fakenv_definespace,</a>
+<a name="172"><span class="lineNum"> 172 </span> : : .getindices = fakenv_get_defined_indices,</a>
+<a name="173"><span class="lineNum"> 173 </span> : : .undefinespace = fakenv_undefinespace,</a>
+<a name="174"><span class="lineNum"> 174 </span> : : .readpublic = fakenv_readpublic,</a>
+<a name="175"><span class="lineNum"> 175 </span> : : };</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/index-sort-b.html b/coverage-report/libstb/secvar/storage/index-sort-b.html
new file mode 100644
index 0000000..4d4af61
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/storage</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">201</td>
+ <td class="headerCovTableEntry">426</td>
+ <td class="headerCovTableEntryLo">47.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secboot_tpm.c.gcov.html">secboot_tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.4%"><img src="../../../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">167 / 345</td>
+ <td class="coverPerLo">72.2&nbsp;%</td>
+ <td class="coverNumLo">13 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fakenv_ops.c.gcov.html">fakenv_ops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=42 height=10 alt="42.0%"><img src="../../../snow.png" width=58 height=10 alt="42.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">42.0&nbsp;%</td>
+ <td class="coverNumLo">34 / 81</td>
+ <td class="coverPerLo">55.6&nbsp;%</td>
+ <td class="coverNumLo">5 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/index-sort-f.html b/coverage-report/libstb/secvar/storage/index-sort-f.html
new file mode 100644
index 0000000..7602d8d
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/storage</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">201</td>
+ <td class="headerCovTableEntry">426</td>
+ <td class="headerCovTableEntryLo">47.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fakenv_ops.c.gcov.html">fakenv_ops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=42 height=10 alt="42.0%"><img src="../../../snow.png" width=58 height=10 alt="42.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">42.0&nbsp;%</td>
+ <td class="coverNumLo">34 / 81</td>
+ <td class="coverPerLo">55.6&nbsp;%</td>
+ <td class="coverNumLo">5 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secboot_tpm.c.gcov.html">secboot_tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.4%"><img src="../../../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">167 / 345</td>
+ <td class="coverPerLo">72.2&nbsp;%</td>
+ <td class="coverNumLo">13 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/index-sort-l.html b/coverage-report/libstb/secvar/storage/index-sort-l.html
new file mode 100644
index 0000000..a03109e
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/storage</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">201</td>
+ <td class="headerCovTableEntry">426</td>
+ <td class="headerCovTableEntryLo">47.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fakenv_ops.c.gcov.html">fakenv_ops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=42 height=10 alt="42.0%"><img src="../../../snow.png" width=58 height=10 alt="42.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">42.0&nbsp;%</td>
+ <td class="coverNumLo">34 / 81</td>
+ <td class="coverPerLo">55.6&nbsp;%</td>
+ <td class="coverNumLo">5 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secboot_tpm.c.gcov.html">secboot_tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.4%"><img src="../../../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">167 / 345</td>
+ <td class="coverPerLo">72.2&nbsp;%</td>
+ <td class="coverNumLo">13 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/index.html b/coverage-report/libstb/secvar/storage/index.html
new file mode 100644
index 0000000..5bfb49d
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/storage</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">201</td>
+ <td class="headerCovTableEntry">426</td>
+ <td class="headerCovTableEntryLo">47.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">27</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="fakenv_ops.c.gcov.html">fakenv_ops.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=42 height=10 alt="42.0%"><img src="../../../snow.png" width=58 height=10 alt="42.0%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">42.0&nbsp;%</td>
+ <td class="coverNumLo">34 / 81</td>
+ <td class="coverPerLo">55.6&nbsp;%</td>
+ <td class="coverNumLo">5 / 9</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secboot_tpm.c.gcov.html">secboot_tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../ruby.png" width=48 height=10 alt="48.4%"><img src="../../../snow.png" width=52 height=10 alt="48.4%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">48.4&nbsp;%</td>
+ <td class="coverNumLo">167 / 345</td>
+ <td class="coverPerLo">72.2&nbsp;%</td>
+ <td class="coverNumLo">13 / 18</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/secboot_tpm.c.func-sort-c.html b/coverage-report/libstb/secvar/storage/secboot_tpm.c.func-sort-c.html
new file mode 100644
index 0000000..5818d15
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/secboot_tpm.c.func-sort-c.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage/secboot_tpm.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/storage</a> - secboot_tpm.c<span style="font-size: 80%;"> (<a href="secboot_tpm.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">167</td>
+ <td class="headerCovTableEntry">345</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">72.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secboot_tpm.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#460">secboot_tpm_check_provisioned_indices</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#442">secboot_tpm_check_tpmnv_attrs</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#412">secboot_tpm_get_tpmnv_names</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#707">secboot_tpm_lockdown</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#504">secboot_tpm_undefine_indices</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#111">secboot_format</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#480">secboot_tpm_define_indices</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#530">secboot_tpm_store_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#79">tpmnv_format</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#247">secboot_tpm_write_bank</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#199">secboot_tpm_write_variable_bank</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#172">secboot_serialize_bank</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#400">secboot_tpm_load_bank</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#372">secboot_tpm_load_variable_bank</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#335">secboot_tpm_deserialize_from_buffer</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#58">calc_bank_hash</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#152">secboot_serialize_secvar</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#278">secboot_deserialize_secvar</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/secboot_tpm.c.func.html b/coverage-report/libstb/secvar/storage/secboot_tpm.c.func.html
new file mode 100644
index 0000000..3ff37c0
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/secboot_tpm.c.func.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage/secboot_tpm.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/storage</a> - secboot_tpm.c<span style="font-size: 80%;"> (<a href="secboot_tpm.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">167</td>
+ <td class="headerCovTableEntry">345</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">72.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secboot_tpm.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#58">calc_bank_hash</a></td>
+ <td class="coverFnHi">7</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#278">secboot_deserialize_secvar</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#111">secboot_format</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#172">secboot_serialize_bank</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#152">secboot_serialize_secvar</a></td>
+ <td class="coverFnHi">8</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#460">secboot_tpm_check_provisioned_indices</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#442">secboot_tpm_check_tpmnv_attrs</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#480">secboot_tpm_define_indices</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#335">secboot_tpm_deserialize_from_buffer</a></td>
+ <td class="coverFnHi">6</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#412">secboot_tpm_get_tpmnv_names</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#400">secboot_tpm_load_bank</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#372">secboot_tpm_load_variable_bank</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#707">secboot_tpm_lockdown</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#530">secboot_tpm_store_init</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#504">secboot_tpm_undefine_indices</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#247">secboot_tpm_write_bank</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#199">secboot_tpm_write_variable_bank</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secboot_tpm.c.gcov.html#79">tpmnv_format</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/storage/secboot_tpm.c.gcov.html b/coverage-report/libstb/secvar/storage/secboot_tpm.c.gcov.html
new file mode 100644
index 0000000..29c21f0
--- /dev/null
+++ b/coverage-report/libstb/secvar/storage/secboot_tpm.c.gcov.html
@@ -0,0 +1,822 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/storage/secboot_tpm.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/storage</a> - secboot_tpm.c<span style="font-size: 80%;"> (source / <a href="secboot_tpm.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">167</td>
+ <td class="headerCovTableEntry">345</td>
+ <td class="headerCovTableEntryLo">48.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">13</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntryLo">72.2 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2020 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #ifndef pr_fmt</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define pr_fmt(fmt) &quot;SECBOOT_TPM: &quot; fmt</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #endif</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;opal.h&gt;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;mbedtls/sha256.h&gt;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;../secvar.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;../secvar_devtree.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;secboot_tpm.h&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;tssskiboot.h&gt;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &lt;ibmtss/TPM_Types.h&gt;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : #define CYCLE_BIT(b) (b^0x1)</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #define SECBOOT_TPM_MAX_VAR_SIZE 8192</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : struct secboot *secboot_image = NULL;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : struct tpmnv_vars *tpmnv_vars_image = NULL;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : struct tpmnv_control *tpmnv_control_image = NULL;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : const size_t tpmnv_vars_size = 2048;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /* Expected TPM NV index name field from NV_ReadPublic given our known</a>
+<a name="28"><span class="lineNum"> 28 </span> : : * set of attributes (see tss_nv_define_space).</a>
+<a name="29"><span class="lineNum"> 29 </span> : : * See Part 1 Section 16, and Part 2 Section 13.5 of the TPM Specification</a>
+<a name="30"><span class="lineNum"> 30 </span> : : * for how this is calculated</a>
+<a name="31"><span class="lineNum"> 31 </span> : : *</a>
+<a name="32"><span class="lineNum"> 32 </span> : : * These hashes are calculated and checked BEFORE TPM2_NV_WriteLock is called,</a>
+<a name="33"><span class="lineNum"> 33 </span> : : * which alters the hash slightly as it sets TPMA_NV_WRITELOCKED</a>
+<a name="34"><span class="lineNum"> 34 </span> : : */</a>
+<a name="35"><span class="lineNum"> 35 </span> : : const uint8_t tpmnv_vars_name[] = {</a>
+<a name="36"><span class="lineNum"> 36 </span> : : 0x00, 0x0b, 0x7a, 0xdb, 0x70, 0xdd, 0x27, 0x94, 0x93, 0x26, 0x11, 0xe2, 0x97,</a>
+<a name="37"><span class="lineNum"> 37 </span> : : 0x00, 0x77, 0x22, 0x4d, 0x5a, 0x74, 0xf8, 0x91, 0x6f, 0xbf, 0xf8, 0x51, 0x4a,</a>
+<a name="38"><span class="lineNum"> 38 </span> : : 0x67, 0x6f, 0xd9, 0xa8, 0xc3, 0xfc, 0x39, 0xed,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : };</a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : const uint8_t tpmnv_control_name[] = {</a>
+<a name="42"><span class="lineNum"> 42 </span> : : 0x00, 0x0b, 0xad, 0x47, 0x6b, 0xa5, 0xdf, 0xb1, 0xe2, 0x18, 0x50, 0xf6, 0x05,</a>
+<a name="43"><span class="lineNum"> 43 </span> : : 0x67, 0xe8, 0x8b, 0xa9, 0x0f, 0x86, 0x1f, 0x06, 0xab, 0x43, 0x96, 0x7f, 0x6e,</a>
+<a name="44"><span class="lineNum"> 44 </span> : : 0x85, 0x33, 0x5b, 0xa6, 0xf0, 0x63, 0x73, 0xd0,</a>
+<a name="45"><span class="lineNum"> 45 </span> : : };</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : const uint8_t tpmnv_vars_prov_name[] = {</a>
+<a name="48"><span class="lineNum"> 48 </span> : : 0x00, 0x0b, 0x58, 0x36, 0x2c, 0xbf, 0xec, 0x0e, 0xcc, 0xbf, 0xa9, 0x41, 0x94,</a>
+<a name="49"><span class="lineNum"> 49 </span> : : 0xe9, 0x95, 0xe8, 0x3b, 0xd7, 0x8b, 0x52, 0xac, 0x61, 0x6f, 0xe6, 0x42, 0x93,</a>
+<a name="50"><span class="lineNum"> 50 </span> : : 0xbb, 0x5a, 0x79, 0x9f, 0xcc, 0x60, 0x5e, 0x8d,</a>
+<a name="51"><span class="lineNum"> 51 </span> : : };</a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : const uint8_t tpmnv_control_prov_name[] = {</a>
+<a name="54"><span class="lineNum"> 54 </span> : : 0x00, 0x0b, 0x7b, 0xd6, 0x02, 0xac, 0xf5, 0x34, 0x54, 0x5c, 0x3e, 0xda, 0xe5,</a>
+<a name="55"><span class="lineNum"> 55 </span> : : 0xb2, 0xe4, 0x93, 0x4f, 0x36, 0xfb, 0x7f, 0xea, 0xbe, 0xfa, 0x3c, 0xfe, 0xed,</a>
+<a name="56"><span class="lineNum"> 56 </span> : : 0x6a, 0x12, 0xfb, 0xc8, 0xf7, 0x92, 0x0e, 0xd3,</a>
+<a name="57"><span class="lineNum"> 57 </span> : : };</a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> : : /* Calculate a SHA256 hash over the supplied buffer */</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 7 : static int calc_bank_hash(char *target_hash, const char *source_buf, uint64_t size)</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : {</a>
+<a name="62"><span class="lineNum"> 62 </span> : : mbedtls_sha256_context ctx;</a>
+<a name="63"><span class="lineNum"> 63 </span> : : int rc;</a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 7 : mbedtls_sha256_init(&amp;ctx);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : </a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 7 : rc = mbedtls_sha256_update_ret(&amp;ctx, source_buf, size);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 7 : if (rc)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 7 : mbedtls_sha256_finish_ret(&amp;ctx, target_hash);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 7 : if (rc)</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 7 : out:</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 7 : mbedtls_sha256_free(&amp;ctx);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 7 : return rc;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : }</a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : /* Reformat the TPMNV space */</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : static int tpmnv_format(void)</span></a>
+<a name="82"><span class="lineNum"> 82 </span> : : {</a>
+<a name="83"><span class="lineNum"> 83 </span> : : int rc;</a>
+<a name="84"><span class="lineNum"> 84 </span> : : </a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : memset(tpmnv_vars_image, 0x00, tpmnv_vars_size);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : memset(tpmnv_control_image, 0x00, sizeof(struct tpmnv_control));</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : tpmnv_vars_image-&gt;header.magic_number = SECBOOT_MAGIC_NUMBER;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : tpmnv_vars_image-&gt;header.version = SECBOOT_VERSION;</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : tpmnv_control_image-&gt;header.magic_number = SECBOOT_MAGIC_NUMBER;</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : tpmnv_control_image-&gt;header.version = SECBOOT_VERSION;</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> : : /* Counts as first write to the TPM NV, which sets the</a>
+<a name="94"><span class="lineNum"> 94 </span> : : * TPMA_NVA_WRITTEN attribute */</a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : rc = tpmnv_ops.write(SECBOOT_TPMNV_VARS_INDEX,</span></a>
+<a name="96"><span class="lineNum"> 96 </span> : : tpmnv_vars_image,</a>
+<a name="97"><span class="lineNum"> 97 </span> : : tpmnv_vars_size, 0);</a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Could not write new formatted data to VARS index, rc=%d\n&quot;, rc);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : }</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : rc = tpmnv_ops.write(SECBOOT_TPMNV_CONTROL_INDEX,</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : tpmnv_control_image,</a>
+<a name="105"><span class="lineNum"> 105 </span> : : sizeof(struct tpmnv_control), 0);</a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Could not write new formatted data to CONTROL index, rc=%d\n&quot;, rc);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> : : </a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="110"><span class="lineNum"> 110 </span> : : }</a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> : : /* Reformat the secboot PNOR space */</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : static int secboot_format(void)</span></a>
+<a name="114"><span class="lineNum"> 114 </span> : : {</a>
+<a name="115"><span class="lineNum"> 115 </span> : : int rc;</a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : memset(secboot_image, 0x00, sizeof(struct secboot));</span></a>
+<a name="118"><span class="lineNum"> 118 </span> : : </a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : secboot_image-&gt;header.magic_number = SECBOOT_MAGIC_NUMBER;</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : secboot_image-&gt;header.version = SECBOOT_VERSION;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : /* Write the hash of the empty bank to the tpm so future loads work */</a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1 : rc = calc_bank_hash(tpmnv_control_image-&gt;bank_hash[0],</span></a>
+<a name="124"><span class="lineNum"> 124 </span> :<span class="lineCov"> 1 : secboot_image-&gt;bank[0],</span></a>
+<a name="125"><span class="lineNum"> 125 </span> : : SECBOOT_VARIABLE_BANK_SIZE);</a>
+<a name="126"><span class="lineNum"> 126 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Bank hash failed to calculate somehow\n&quot;);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="129"><span class="lineNum"> 129 </span> : : }</a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : rc = tpmnv_ops.write(SECBOOT_TPMNV_CONTROL_INDEX,</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : tpmnv_control_image-&gt;bank_hash[0],</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : SHA256_DIGEST_SIZE,</a>
+<a name="134"><span class="lineNum"> 134 </span> : : offsetof(struct tpmnv_control,</a>
+<a name="135"><span class="lineNum"> 135 </span> : : bank_hash[0]));</a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Could not write fresh formatted bank hashes to CONTROL index, rc=%d\n&quot;, rc);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : }</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 1 : rc = flash_secboot_write(0, secboot_image, sizeof(struct secboot));</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Could not write formatted data to PNOR, rc=%d\n&quot;, rc);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> : : </a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : }</a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> : : </a>
+<a name="149"><span class="lineNum"> 149 </span> : : /*</a>
+<a name="150"><span class="lineNum"> 150 </span> : : * Serialize one variable to a target memory location.</a>
+<a name="151"><span class="lineNum"> 151 </span> : : * Returns the advanced target pointer,</a>
+<a name="152"><span class="lineNum"> 152 </span> : : * NULL if advanced pointer would exceed the supplied bound</a>
+<a name="153"><span class="lineNum"> 153 </span> : : */</a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 8 : static char *secboot_serialize_secvar(char *target, const struct secvar *var, const char *end)</span></a>
+<a name="155"><span class="lineNum"> 155 </span> : : {</a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 8 : if ((target + sizeof(uint64_t) + sizeof(uint64_t)</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 8 : + var-&gt;key_len + var-&gt;data_size) &gt; end)</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineNoCov"> 0 : return NULL;</span></a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 8 : *((uint64_t*) target) = cpu_to_be64(var-&gt;key_len);</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 8 : target += sizeof(var-&gt;key_len);</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 8 : *((uint64_t*) target) = cpu_to_be64(var-&gt;data_size);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 8 : target += sizeof(var-&gt;data_size);</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 8 : memcpy(target, var-&gt;key, var-&gt;key_len);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> :<span class="lineCov"> 8 : target += var-&gt;key_len;</span></a>
+<a name="166"><span class="lineNum"> 166 </span> :<span class="lineCov"> 8 : memcpy(target, var-&gt;data, var-&gt;data_size);</span></a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 8 : target += var-&gt;data_size;</span></a>
+<a name="168"><span class="lineNum"> 168 </span> : : </a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 8 : return target;</span></a>
+<a name="170"><span class="lineNum"> 170 </span> : : }</a>
+<a name="171"><span class="lineNum"> 171 </span> : : </a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> : : /* Flattens a linked-list bank into a contiguous buffer for writing */</a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 4 : static int secboot_serialize_bank(const struct list_head *bank, char *target,</span></a>
+<a name="175"><span class="lineNum"> 175 </span> : : size_t target_size, int flags)</a>
+<a name="176"><span class="lineNum"> 176 </span> : : {</a>
+<a name="177"><span class="lineNum"> 177 </span> : : struct secvar *var;</a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 4 : char *end = target + target_size;</span></a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 4 : assert(bank);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 4 : assert(target);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> : : </a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 4 : memset(target, 0x00, target_size);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 20 : list_for_each(bank, var, link) {</span></a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 16 : if (var-&gt;flags != flags)</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 8 : continue;</span></a>
+<a name="188"><span class="lineNum"> 188 </span> : : </a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 8 : target = secboot_serialize_secvar(target, var, end);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 8 : if (!target) {</span></a>
+<a name="191"><span class="lineNum"> 191 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Ran out of %s space, giving up!&quot;,</span></a>
+<a name="192"><span class="lineNum"> 192 </span> : : (flags &amp; SECVAR_FLAG_PROTECTED) ? &quot;TPMNV&quot; : &quot;PNOR&quot;);</a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineNoCov"> 0 : return OPAL_EMPTY;</span></a>
+<a name="194"><span class="lineNum"> 194 </span> : : }</a>
+<a name="195"><span class="lineNum"> 195 </span> : : }</a>
+<a name="196"><span class="lineNum"> 196 </span> : : </a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 4 : return OPAL_SUCCESS;</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : }</a>
+<a name="199"><span class="lineNum"> 199 </span> : : </a>
+<a name="200"><span class="lineNum"> 200 </span> : : /* Helper for the variable-bank specific writing logic */</a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 2 : static int secboot_tpm_write_variable_bank(const struct list_head *bank)</span></a>
+<a name="202"><span class="lineNum"> 202 </span> : : {</a>
+<a name="203"><span class="lineNum"> 203 </span> : : int rc;</a>
+<a name="204"><span class="lineNum"> 204 </span> : : uint64_t bit;</a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 2 : bit = CYCLE_BIT(tpmnv_control_image-&gt;active_bit);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> : : /* Serialize TPMNV variables */</a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 2 : rc = secboot_serialize_bank(bank, tpmnv_vars_image-&gt;vars, tpmnv_vars_size - sizeof(struct tpmnv_vars), SECVAR_FLAG_PROTECTED);</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="211"><span class="lineNum"> 211 </span> : : </a>
+<a name="212"><span class="lineNum"> 212 </span> : : </a>
+<a name="213"><span class="lineNum"> 213 </span> : : /* Write TPMNV variables to actual NV */</a>
+<a name="214"><span class="lineNum"> 214 </span> :<span class="lineCov"> 2 : rc = tpmnv_ops.write(SECBOOT_TPMNV_VARS_INDEX, tpmnv_vars_image, tpmnv_vars_size, 0);</span></a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="217"><span class="lineNum"> 217 </span> : : </a>
+<a name="218"><span class="lineNum"> 218 </span> : : /* Serialize the PNOR variables, but don't write to flash until after the bank hash */</a>
+<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 2 : rc = secboot_serialize_bank(bank, secboot_image-&gt;bank[bit], SECBOOT_VARIABLE_BANK_SIZE, 0);</span></a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="222"><span class="lineNum"> 222 </span> : : </a>
+<a name="223"><span class="lineNum"> 223 </span> : : /* Calculate the bank hash, and write to TPM NV */</a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 2 : rc = calc_bank_hash(tpmnv_control_image-&gt;bank_hash[bit], secboot_image-&gt;bank[bit], SECBOOT_VARIABLE_BANK_SIZE);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> :<span class="lineCov"> 2 : rc = tpmnv_ops.write(SECBOOT_TPMNV_CONTROL_INDEX, tpmnv_control_image-&gt;bank_hash[bit],</span></a>
+<a name="229"><span class="lineNum"> 229 </span> : : SHA256_DIGEST_LENGTH, offsetof(struct tpmnv_control, bank_hash[bit]));</a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="232"><span class="lineNum"> 232 </span> : : </a>
+<a name="233"><span class="lineNum"> 233 </span> : : /* Write new variable bank to pnor */</a>
+<a name="234"><span class="lineNum"> 234 </span> :<span class="lineCov"> 2 : rc = flash_secboot_write(0, secboot_image, sizeof(struct secboot));</span></a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 2 : if (rc)</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineNoCov"> 0 : goto out;</span></a>
+<a name="237"><span class="lineNum"> 237 </span> : : </a>
+<a name="238"><span class="lineNum"> 238 </span> : : /* Flip the bit, and write to TPM NV */</a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 2 : tpmnv_control_image-&gt;active_bit = bit;</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 2 : rc = tpmnv_ops.write(SECBOOT_TPMNV_CONTROL_INDEX,</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 2 : &amp;tpmnv_control_image-&gt;active_bit,</span></a>
+<a name="242"><span class="lineNum"> 242 </span> : : sizeof(tpmnv_control_image-&gt;active_bit),</a>
+<a name="243"><span class="lineNum"> 243 </span> : : offsetof(struct tpmnv_control, active_bit));</a>
+<a name="244"><span class="lineNum"> 244 </span> :<span class="lineCov"> 2 : out:</span></a>
+<a name="245"><span class="lineNum"> 245 </span> : : </a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 2 : return rc;</span></a>
+<a name="247"><span class="lineNum"> 247 </span> : : }</a>
+<a name="248"><span class="lineNum"> 248 </span> : : </a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 2 : static int secboot_tpm_write_bank(struct list_head *bank, int section)</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : {</a>
+<a name="251"><span class="lineNum"> 251 </span> : : int rc;</a>
+<a name="252"><span class="lineNum"> 252 </span> : : </a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 2 : switch (section) {</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 2 : case SECVAR_VARIABLE_BANK:</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 2 : rc = secboot_tpm_write_variable_bank(bank);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 2 : break;</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineNoCov"> 0 : case SECVAR_UPDATE_BANK:</span></a>
+<a name="258"><span class="lineNum"> 258 </span> :<span class="lineNoCov"> 0 : memset(secboot_image-&gt;update, 0, SECBOOT_UPDATE_BANK_SIZE);</span></a>
+<a name="259"><span class="lineNum"> 259 </span> :<span class="lineNoCov"> 0 : rc = secboot_serialize_bank(bank, secboot_image-&gt;update,</span></a>
+<a name="260"><span class="lineNum"> 260 </span> : : SECBOOT_UPDATE_BANK_SIZE, 0);</a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="263"><span class="lineNum"> 263 </span> : : </a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineNoCov"> 0 : rc = flash_secboot_write(0, secboot_image,</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : sizeof(struct secboot));</a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineNoCov"> 0 : default:</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineNoCov"> 0 : rc = OPAL_HARDWARE;</span></a>
+<a name="269"><span class="lineNum"> 269 </span> : : }</a>
+<a name="270"><span class="lineNum"> 270 </span> : : </a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 2 : return rc;</span></a>
+<a name="272"><span class="lineNum"> 272 </span> : : }</a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> : : </a>
+<a name="275"><span class="lineNum"> 275 </span> : : /*</a>
+<a name="276"><span class="lineNum"> 276 </span> : : * Deserialize a single secvar from a buffer.</a>
+<a name="277"><span class="lineNum"> 277 </span> : : * Returns an advanced pointer, and an allocated secvar in *var.</a>
+<a name="278"><span class="lineNum"> 278 </span> : : * Returns NULL if out of bounds reached, or out of memory.</a>
+<a name="279"><span class="lineNum"> 279 </span> : : */</a>
+<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 14 : static int secboot_deserialize_secvar(struct secvar **var, char **src, const char *end)</span></a>
+<a name="281"><span class="lineNum"> 281 </span> : : {</a>
+<a name="282"><span class="lineNum"> 282 </span> : : uint64_t key_len;</a>
+<a name="283"><span class="lineNum"> 283 </span> : : uint64_t data_size;</a>
+<a name="284"><span class="lineNum"> 284 </span> : : struct secvar *ret;</a>
+<a name="285"><span class="lineNum"> 285 </span> : : </a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 14 : assert(var);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> : : </a>
+<a name="288"><span class="lineNum"> 288 </span> : : /* Load in the two header values */</a>
+<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 14 : key_len = be64_to_cpu(*((uint64_t *) *src));</span></a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 14 : *src += sizeof(uint64_t);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 14 : data_size = be64_to_cpu(*((uint64_t *) *src));</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 14 : *src += sizeof(uint64_t);</span></a>
+<a name="293"><span class="lineNum"> 293 </span> : : </a>
+<a name="294"><span class="lineNum"> 294 </span> : : /* Check if we've reached the last var to deserialize */</a>
+<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 14 : if ((key_len == 0) &amp;&amp; (data_size == 0)) {</span></a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 6 : return OPAL_EMPTY;</span></a>
+<a name="297"><span class="lineNum"> 297 </span> : : }</a>
+<a name="298"><span class="lineNum"> 298 </span> : : </a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 8 : if (key_len &gt; SECVAR_MAX_KEY_LEN) {</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Deserialization failed: key length exceeded maximum value&quot;</span></a>
+<a name="301"><span class="lineNum"> 301 </span> : : &quot;%llu &gt; %u&quot;, key_len, SECVAR_MAX_KEY_LEN);</a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : }</a>
+<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 8 : if (data_size &gt; SECBOOT_TPM_MAX_VAR_SIZE) {</span></a>
+<a name="305"><span class="lineNum"> 305 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Deserialization failed: data size exceeded maximum value&quot;</span></a>
+<a name="306"><span class="lineNum"> 306 </span> : : &quot;%llu &gt; %u&quot;, key_len, SECBOOT_TPM_MAX_VAR_SIZE);</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="308"><span class="lineNum"> 308 </span> : : }</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> : : /* Make sure these fields aren't oversized... */</a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 8 : if ((*src + key_len + data_size) &gt; end) {</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineNoCov"> 0 : *var = NULL;</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;key_len or data_size exceeded the expected bounds&quot;);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="315"><span class="lineNum"> 315 </span> : : }</a>
+<a name="316"><span class="lineNum"> 316 </span> : : </a>
+<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 8 : ret = alloc_secvar(key_len, data_size);</span></a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 8 : if (!ret) {</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineNoCov"> 0 : *var = NULL;</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Out of memory, could not allocate new secvar&quot;);</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : }</a>
+<a name="323"><span class="lineNum"> 323 </span> : : </a>
+<a name="324"><span class="lineNum"> 324 </span> : : /* Load in variable-sized data */</a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 8 : memcpy(ret-&gt;key, *src, ret-&gt;key_len);</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 8 : *src += ret-&gt;key_len;</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 8 : memcpy(ret-&gt;data, *src, ret-&gt;data_size);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 8 : *src += ret-&gt;data_size;</span></a>
+<a name="329"><span class="lineNum"> 329 </span> : : </a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 8 : *var = ret;</span></a>
+<a name="331"><span class="lineNum"> 331 </span> : : </a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 8 : return OPAL_SUCCESS;</span></a>
+<a name="333"><span class="lineNum"> 333 </span> : : }</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> : : </a>
+<a name="336"><span class="lineNum"> 336 </span> : : /* Load variables from a flattened buffer into a bank list */</a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 6 : static int secboot_tpm_deserialize_from_buffer(struct list_head *bank, char *src,</span></a>
+<a name="338"><span class="lineNum"> 338 </span> : : uint64_t size, uint64_t flags)</a>
+<a name="339"><span class="lineNum"> 339 </span> : : {</a>
+<a name="340"><span class="lineNum"> 340 </span> : : struct secvar *var;</a>
+<a name="341"><span class="lineNum"> 341 </span> : : char *cur;</a>
+<a name="342"><span class="lineNum"> 342 </span> : : char *end;</a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 6 : int rc = 0;</span></a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> :<span class="lineCov"> 6 : cur = src;</span></a>
+<a name="346"><span class="lineNum"> 346 </span> :<span class="lineCov"> 6 : end = src + size;</span></a>
+<a name="347"><span class="lineNum"> 347 </span> : : </a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 14 : while (cur &lt; end) {</span></a>
+<a name="349"><span class="lineNum"> 349 </span> : : /* Ensure there is enough space to even check for another var header */</a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 14 : if ((end - cur) &lt; (sizeof(uint64_t) * 2))</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineNoCov"> 0 : break;</span></a>
+<a name="352"><span class="lineNum"> 352 </span> : : </a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 14 : rc = secboot_deserialize_secvar(&amp;var, &amp;cur, end);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 14 : switch (rc) {</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineNoCov"> 0 : case OPAL_RESOURCE:</span></a>
+<a name="356"><span class="lineNum"> 356 </span> : : case OPAL_NO_MEM:</a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineNoCov"> 0 : goto fail;</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 6 : case OPAL_EMPTY:</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 6 : goto done;</span></a>
+<a name="360"><span class="lineNum"> 360 </span> :<span class="lineCov"> 8 : default: assert(1);</span></a>
+<a name="361"><span class="lineNum"> 361 </span> : : }</a>
+<a name="362"><span class="lineNum"> 362 </span> : : </a>
+<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 8 : var-&gt;flags |= flags;</span></a>
+<a name="364"><span class="lineNum"> 364 </span> : : </a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 8 : list_add_tail(bank, &amp;var-&gt;link);</span></a>
+<a name="366"><span class="lineNum"> 366 </span> : : }</a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineNoCov"> 0 : done:</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 6 : return OPAL_SUCCESS;</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineNoCov"> 0 : fail:</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineNoCov"> 0 : clear_bank_list(bank);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="372"><span class="lineNum"> 372 </span> : : }</a>
+<a name="373"><span class="lineNum"> 373 </span> : : </a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 4 : static int secboot_tpm_load_variable_bank(struct list_head *bank)</span></a>
+<a name="375"><span class="lineNum"> 375 </span> : : {</a>
+<a name="376"><span class="lineNum"> 376 </span> : : char bank_hash[SHA256_DIGEST_LENGTH];</a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 4 : uint64_t bit = tpmnv_control_image-&gt;active_bit;</span></a>
+<a name="378"><span class="lineNum"> 378 </span> : : int rc;</a>
+<a name="379"><span class="lineNum"> 379 </span> : : </a>
+<a name="380"><span class="lineNum"> 380 </span> : : /* Check the hash of the bank we loaded from PNOR</a>
+<a name="381"><span class="lineNum"> 381 </span> : : * versus the expected hash in TPM NV */</a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 4 : rc = calc_bank_hash(bank_hash,</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 4 : secboot_image-&gt;bank[bit],</span></a>
+<a name="384"><span class="lineNum"> 384 </span> : : SECBOOT_VARIABLE_BANK_SIZE);</a>
+<a name="385"><span class="lineNum"> 385 </span> :<span class="lineCov"> 4 : if (rc)</span></a>
+<a name="386"><span class="lineNum"> 386 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="387"><span class="lineNum"> 387 </span> : : </a>
+<a name="388"><span class="lineNum"> 388 </span> :<span class="lineCov"> 4 : if (memcmp(bank_hash,</span></a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 4 : tpmnv_control_image-&gt;bank_hash[bit],</span></a>
+<a name="390"><span class="lineNum"> 390 </span> : : SHA256_DIGEST_LENGTH))</a>
+<a name="391"><span class="lineNum"> 391 </span> : : /* Tampered pnor space detected, abandon ship */</a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 1 : return OPAL_PERMISSION;</span></a>
+<a name="393"><span class="lineNum"> 393 </span> : : </a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 3 : rc = secboot_tpm_deserialize_from_buffer(bank, tpmnv_vars_image-&gt;vars, tpmnv_vars_size, SECVAR_FLAG_PROTECTED);</span></a>
+<a name="395"><span class="lineNum"> 395 </span> :<span class="lineCov"> 3 : if (rc)</span></a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="397"><span class="lineNum"> 397 </span> : : </a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 3 : return secboot_tpm_deserialize_from_buffer(bank, secboot_image-&gt;bank[bit], SECBOOT_VARIABLE_BANK_SIZE, 0);</span></a>
+<a name="399"><span class="lineNum"> 399 </span> : : }</a>
+<a name="400"><span class="lineNum"> 400 </span> : : </a>
+<a name="401"><span class="lineNum"> 401 </span> : : </a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 4 : static int secboot_tpm_load_bank(struct list_head *bank, int section)</span></a>
+<a name="403"><span class="lineNum"> 403 </span> : : {</a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 4 : switch (section) {</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 4 : case SECVAR_VARIABLE_BANK:</span></a>
+<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 4 : return secboot_tpm_load_variable_bank(bank);</span></a>
+<a name="407"><span class="lineNum"> 407 </span> :<span class="lineNoCov"> 0 : case SECVAR_UPDATE_BANK:</span></a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineNoCov"> 0 : return secboot_tpm_deserialize_from_buffer(bank, secboot_image-&gt;update, SECBOOT_UPDATE_BANK_SIZE, 0);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> : : }</a>
+<a name="410"><span class="lineNum"> 410 </span> : : </a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineNoCov"> 0 : return OPAL_HARDWARE;</span></a>
+<a name="412"><span class="lineNum"> 412 </span> : : }</a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineNoCov"> 0 : static int secboot_tpm_get_tpmnv_names(char *nv_vars_name, char *nv_control_name)</span></a>
+<a name="415"><span class="lineNum"> 415 </span> : : {</a>
+<a name="416"><span class="lineNum"> 416 </span> : : TPMS_NV_PUBLIC nv_public; /* Throwaway, we only want the name field */</a>
+<a name="417"><span class="lineNum"> 417 </span> : : TPM2B_NAME vars_tmp;</a>
+<a name="418"><span class="lineNum"> 418 </span> : : TPM2B_NAME control_tmp;</a>
+<a name="419"><span class="lineNum"> 419 </span> : : int rc;</a>
+<a name="420"><span class="lineNum"> 420 </span> : : </a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.readpublic(SECBOOT_TPMNV_VARS_INDEX,</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : &amp;nv_public,</a>
+<a name="423"><span class="lineNum"> 423 </span> : : &amp;vars_tmp);</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to readpublic from the VARS index, rc=%d\n&quot;, rc);</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="427"><span class="lineNum"> 427 </span> : : }</a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.readpublic(SECBOOT_TPMNV_CONTROL_INDEX,</span></a>
+<a name="429"><span class="lineNum"> 429 </span> : : &amp;nv_public,</a>
+<a name="430"><span class="lineNum"> 430 </span> : : &amp;control_tmp);</a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to readpublic from the CONTROL index, rc=%d\n&quot;, rc);</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : }</a>
+<a name="435"><span class="lineNum"> 435 </span> : : </a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineNoCov"> 0 : memcpy(nv_vars_name, vars_tmp.t.name, MIN(sizeof(tpmnv_vars_name), vars_tmp.t.size));</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineNoCov"> 0 : memcpy(nv_control_name, control_tmp.t.name, MIN(sizeof(tpmnv_control_name), control_tmp.t.size));</span></a>
+<a name="438"><span class="lineNum"> 438 </span> : : </a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="440"><span class="lineNum"> 440 </span> : : }</a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> : : </a>
+<a name="443"><span class="lineNum"> 443 </span> : : /* Ensure the NV indices were defined with the correct set of attributes */</a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineNoCov"> 0 : static int secboot_tpm_check_tpmnv_attrs(char *nv_vars_name, char *nv_control_name)</span></a>
+<a name="445"><span class="lineNum"> 445 </span> : : {</a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineNoCov"> 0 : if (memcmp(tpmnv_vars_name,</span></a>
+<a name="447"><span class="lineNum"> 447 </span> : : nv_vars_name,</a>
+<a name="448"><span class="lineNum"> 448 </span> : : sizeof(tpmnv_vars_name))) {</a>
+<a name="449"><span class="lineNum"> 449 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;VARS index not defined with the correct attributes\n&quot;);</span></a>
+<a name="450"><span class="lineNum"> 450 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="451"><span class="lineNum"> 451 </span> : : }</a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineNoCov"> 0 : if (memcmp(tpmnv_control_name,</span></a>
+<a name="453"><span class="lineNum"> 453 </span> : : nv_control_name,</a>
+<a name="454"><span class="lineNum"> 454 </span> : : sizeof(tpmnv_control_name))) {</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;CONTROL index not defined with the correct attributes\n&quot;);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> :<span class="lineNoCov"> 0 : return OPAL_RESOURCE;</span></a>
+<a name="457"><span class="lineNum"> 457 </span> : : }</a>
+<a name="458"><span class="lineNum"> 458 </span> : : </a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="460"><span class="lineNum"> 460 </span> : : }</a>
+<a name="461"><span class="lineNum"> 461 </span> : : </a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineNoCov"> 0 : static bool secboot_tpm_check_provisioned_indices(char *nv_vars_name, char *nv_control_name)</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : {</a>
+<a name="464"><span class="lineNum"> 464 </span> : : /* Check for provisioned NV indices, redefine them if detected. */</a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineNoCov"> 0 : if (!memcmp(tpmnv_vars_prov_name,</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : nv_vars_name,</a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineNoCov"> 0 : sizeof(tpmnv_vars_prov_name)) &amp;&amp;</span></a>
+<a name="468"><span class="lineNum"> 468 </span> :<span class="lineNoCov"> 0 : !memcmp(tpmnv_control_prov_name,</span></a>
+<a name="469"><span class="lineNum"> 469 </span> : : nv_control_name,</a>
+<a name="470"><span class="lineNum"> 470 </span> : : sizeof(tpmnv_control_prov_name))) {</a>
+<a name="471"><span class="lineNum"> 471 </span> :<span class="lineNoCov"> 0 : return true;</span></a>
+<a name="472"><span class="lineNum"> 472 </span> : : }</a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> : : /*</a>
+<a name="475"><span class="lineNum"> 475 </span> : : * If one matches but the other doesn't, do NOT redefine.</a>
+<a name="476"><span class="lineNum"> 476 </span> : : * The next step should detect they don't match the expected values</a>
+<a name="477"><span class="lineNum"> 477 </span> : : * and fail the boot.</a>
+<a name="478"><span class="lineNum"> 478 </span> : : */</a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineNoCov"> 0 : return false;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : }</a>
+<a name="481"><span class="lineNum"> 481 </span> : : </a>
+<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 1 : static int secboot_tpm_define_indices(void)</span></a>
+<a name="483"><span class="lineNum"> 483 </span> : : {</a>
+<a name="484"><span class="lineNum"> 484 </span> :<span class="lineCov"> 1 : int rc = OPAL_SUCCESS;</span></a>
+<a name="485"><span class="lineNum"> 485 </span> : : </a>
+<a name="486"><span class="lineNum"> 486 </span> :<span class="lineCov"> 1 : rc = tpmnv_ops.definespace(SECBOOT_TPMNV_VARS_INDEX, tpmnv_vars_size);</span></a>
+<a name="487"><span class="lineNum"> 487 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="488"><span class="lineNum"> 488 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to define the VARS index, rc=%d\n&quot;, rc);</span></a>
+<a name="489"><span class="lineNum"> 489 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="490"><span class="lineNum"> 490 </span> : : }</a>
+<a name="491"><span class="lineNum"> 491 </span> : : </a>
+<a name="492"><span class="lineNum"> 492 </span> :<span class="lineCov"> 1 : rc = tpmnv_ops.definespace(SECBOOT_TPMNV_CONTROL_INDEX, sizeof(struct tpmnv_control));</span></a>
+<a name="493"><span class="lineNum"> 493 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="494"><span class="lineNum"> 494 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to define the CONTROL index, rc=%d\n&quot;, rc);</span></a>
+<a name="495"><span class="lineNum"> 495 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="496"><span class="lineNum"> 496 </span> : : }</a>
+<a name="497"><span class="lineNum"> 497 </span> : : </a>
+<a name="498"><span class="lineNum"> 498 </span> :<span class="lineCov"> 1 : rc = tpmnv_format();</span></a>
+<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="500"><span class="lineNum"> 500 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="501"><span class="lineNum"> 501 </span> : : </a>
+<a name="502"><span class="lineNum"> 502 </span> : : /* TPM NV just got redefined, so unconditionally format the SECBOOT partition */</a>
+<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 1 : return secboot_format();</span></a>
+<a name="504"><span class="lineNum"> 504 </span> : : }</a>
+<a name="505"><span class="lineNum"> 505 </span> : : </a>
+<a name="506"><span class="lineNum"> 506 </span> :<span class="lineNoCov"> 0 : static int secboot_tpm_undefine_indices(bool *vars_defined, bool *control_defined)</span></a>
+<a name="507"><span class="lineNum"> 507 </span> : : {</a>
+<a name="508"><span class="lineNum"> 508 </span> : : int rc;</a>
+<a name="509"><span class="lineNum"> 509 </span> : : </a>
+<a name="510"><span class="lineNum"> 510 </span> :<span class="lineNoCov"> 0 : if (vars_defined) {</span></a>
+<a name="511"><span class="lineNum"> 511 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.undefinespace(SECBOOT_TPMNV_VARS_INDEX);</span></a>
+<a name="512"><span class="lineNum"> 512 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="513"><span class="lineNum"> 513 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to undefine VARS, something is seriously wrong\n&quot;);</span></a>
+<a name="514"><span class="lineNum"> 514 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="515"><span class="lineNum"> 515 </span> : : }</a>
+<a name="516"><span class="lineNum"> 516 </span> : : }</a>
+<a name="517"><span class="lineNum"> 517 </span> : : </a>
+<a name="518"><span class="lineNum"> 518 </span> :<span class="lineNoCov"> 0 : if (control_defined) {</span></a>
+<a name="519"><span class="lineNum"> 519 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.undefinespace(SECBOOT_TPMNV_CONTROL_INDEX);</span></a>
+<a name="520"><span class="lineNum"> 520 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="521"><span class="lineNum"> 521 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to undefine CONTROL, something is seriously wrong\n&quot;);</span></a>
+<a name="522"><span class="lineNum"> 522 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="523"><span class="lineNum"> 523 </span> : : }</a>
+<a name="524"><span class="lineNum"> 524 </span> : : }</a>
+<a name="525"><span class="lineNum"> 525 </span> : : </a>
+<a name="526"><span class="lineNum"> 526 </span> :<span class="lineNoCov"> 0 : *vars_defined = *control_defined = false;</span></a>
+<a name="527"><span class="lineNum"> 527 </span> : : </a>
+<a name="528"><span class="lineNum"> 528 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="529"><span class="lineNum"> 529 </span> : : }</a>
+<a name="530"><span class="lineNum"> 530 </span> : : </a>
+<a name="531"><span class="lineNum"> 531 </span> : : </a>
+<a name="532"><span class="lineNum"> 532 </span> :<span class="lineCov"> 1 : static int secboot_tpm_store_init(void)</span></a>
+<a name="533"><span class="lineNum"> 533 </span> : : {</a>
+<a name="534"><span class="lineNum"> 534 </span> : : int rc;</a>
+<a name="535"><span class="lineNum"> 535 </span> : : unsigned int secboot_size;</a>
+<a name="536"><span class="lineNum"> 536 </span> : : </a>
+<a name="537"><span class="lineNum"> 537 </span> :<span class="lineCov"> 1 : TPMI_RH_NV_INDEX *indices = NULL;</span></a>
+<a name="538"><span class="lineNum"> 538 </span> : : char nv_vars_name[sizeof(tpmnv_vars_name)];</a>
+<a name="539"><span class="lineNum"> 539 </span> : : char nv_control_name[sizeof(tpmnv_control_name)];</a>
+<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 1 : size_t count = 0;</span></a>
+<a name="541"><span class="lineNum"> 541 </span> :<span class="lineCov"> 1 : bool control_defined = false;</span></a>
+<a name="542"><span class="lineNum"> 542 </span> :<span class="lineCov"> 1 : bool vars_defined = false;</span></a>
+<a name="543"><span class="lineNum"> 543 </span> : : int i;</a>
+<a name="544"><span class="lineNum"> 544 </span> : : </a>
+<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 1 : if (secboot_image)</span></a>
+<a name="546"><span class="lineNum"> 546 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="547"><span class="lineNum"> 547 </span> : : </a>
+<a name="548"><span class="lineNum"> 548 </span> :<span class="lineCov"> 1 : prlog(PR_DEBUG, &quot;Initializing for pnor+tpm based platform\n&quot;);</span></a>
+<a name="549"><span class="lineNum"> 549 </span> : : </a>
+<a name="550"><span class="lineNum"> 550 </span> : : /* Initialize SECBOOT first, we may need to format this later */</a>
+<a name="551"><span class="lineNum"> 551 </span> :<span class="lineCov"> 1 : rc = flash_secboot_info(&amp;secboot_size);</span></a>
+<a name="552"><span class="lineNum"> 552 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="553"><span class="lineNum"> 553 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;error %d retrieving keystore info\n&quot;, rc);</span></a>
+<a name="554"><span class="lineNum"> 554 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="555"><span class="lineNum"> 555 </span> : : }</a>
+<a name="556"><span class="lineNum"> 556 </span> :<span class="lineCov"> 1 : if (sizeof(struct secboot) &gt; secboot_size) {</span></a>
+<a name="557"><span class="lineNum"> 557 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;secboot partition %d KB too small. min=%ld\n&quot;,</span></a>
+<a name="558"><span class="lineNum"> 558 </span> : : secboot_size &gt;&gt; 10, sizeof(struct secboot));</a>
+<a name="559"><span class="lineNum"> 559 </span> :<span class="lineNoCov"> 0 : rc = OPAL_RESOURCE;</span></a>
+<a name="560"><span class="lineNum"> 560 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="561"><span class="lineNum"> 561 </span> : : }</a>
+<a name="562"><span class="lineNum"> 562 </span> : : </a>
+<a name="563"><span class="lineNum"> 563 </span> :<span class="lineCov"> 1 : secboot_image = memalign(0x1000, sizeof(struct secboot));</span></a>
+<a name="564"><span class="lineNum"> 564 </span> :<span class="lineCov"> 1 : if (!secboot_image) {</span></a>
+<a name="565"><span class="lineNum"> 565 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to allocate space for the secboot image\n&quot;);</span></a>
+<a name="566"><span class="lineNum"> 566 </span> :<span class="lineNoCov"> 0 : rc = OPAL_NO_MEM;</span></a>
+<a name="567"><span class="lineNum"> 567 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="568"><span class="lineNum"> 568 </span> : : }</a>
+<a name="569"><span class="lineNum"> 569 </span> : : </a>
+<a name="570"><span class="lineNum"> 570 </span> : : /* Read in the PNOR data, bank hash is checked on call to .load_bank() */</a>
+<a name="571"><span class="lineNum"> 571 </span> :<span class="lineCov"> 1 : rc = flash_secboot_read(secboot_image, 0, sizeof(struct secboot));</span></a>
+<a name="572"><span class="lineNum"> 572 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="573"><span class="lineNum"> 573 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;failed to read the secboot partition, rc=%d\n&quot;, rc);</span></a>
+<a name="574"><span class="lineNum"> 574 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="575"><span class="lineNum"> 575 </span> : : }</a>
+<a name="576"><span class="lineNum"> 576 </span> : : </a>
+<a name="577"><span class="lineNum"> 577 </span> : : /* Allocate the tpmnv data buffers */</a>
+<a name="578"><span class="lineNum"> 578 </span> :<span class="lineCov"> 1 : tpmnv_vars_image = zalloc(tpmnv_vars_size);</span></a>
+<a name="579"><span class="lineNum"> 579 </span> :<span class="lineCov"> 1 : if (!tpmnv_vars_image)</span></a>
+<a name="580"><span class="lineNum"> 580 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="581"><span class="lineNum"> 581 </span> :<span class="lineCov"> 1 : tpmnv_control_image = zalloc(sizeof(struct tpmnv_control));</span></a>
+<a name="582"><span class="lineNum"> 582 </span> :<span class="lineCov"> 1 : if (!tpmnv_control_image)</span></a>
+<a name="583"><span class="lineNum"> 583 </span> :<span class="lineNoCov"> 0 : return OPAL_NO_MEM;</span></a>
+<a name="584"><span class="lineNum"> 584 </span> : : </a>
+<a name="585"><span class="lineNum"> 585 </span> : : /* Check if the NV indices have been defined already */</a>
+<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 1 : rc = tpmnv_ops.getindices(&amp;indices, &amp;count);</span></a>
+<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 1 : if (rc) {</span></a>
+<a name="588"><span class="lineNum"> 588 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Could not load defined indicies from TPM, rc=%d\n&quot;, rc);</span></a>
+<a name="589"><span class="lineNum"> 589 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="590"><span class="lineNum"> 590 </span> : : }</a>
+<a name="591"><span class="lineNum"> 591 </span> : : </a>
+<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 1 : for (i = 0; i &lt; count; i++) {</span></a>
+<a name="593"><span class="lineNum"> 593 </span> :<span class="lineNoCov"> 0 : if (indices[i] == SECBOOT_TPMNV_VARS_INDEX)</span></a>
+<a name="594"><span class="lineNum"> 594 </span> :<span class="lineNoCov"> 0 : vars_defined = true;</span></a>
+<a name="595"><span class="lineNum"> 595 </span> :<span class="lineNoCov"> 0 : else if (indices[i] == SECBOOT_TPMNV_CONTROL_INDEX)</span></a>
+<a name="596"><span class="lineNum"> 596 </span> :<span class="lineNoCov"> 0 : control_defined = true;</span></a>
+<a name="597"><span class="lineNum"> 597 </span> : : }</a>
+<a name="598"><span class="lineNum"> 598 </span> :<span class="lineCov"> 1 : free(indices);</span></a>
+<a name="599"><span class="lineNum"> 599 </span> : : </a>
+<a name="600"><span class="lineNum"> 600 </span> : : /* Undefine the NV indices if physical presence has been asserted */</a>
+<a name="601"><span class="lineNum"> 601 </span> :<span class="lineCov"> 1 : if (secvar_check_physical_presence()) {</span></a>
+<a name="602"><span class="lineNum"> 602 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;Physical presence asserted, redefining NV indices, and resetting keystore\n&quot;);</span></a>
+<a name="603"><span class="lineNum"> 603 </span> :<span class="lineNoCov"> 0 : rc = secboot_tpm_undefine_indices(&amp;vars_defined, &amp;control_defined);</span></a>
+<a name="604"><span class="lineNum"> 604 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="605"><span class="lineNum"> 605 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="606"><span class="lineNum"> 606 </span> : : </a>
+<a name="607"><span class="lineNum"> 607 </span> :<span class="lineNoCov"> 0 : rc = secboot_tpm_define_indices();</span></a>
+<a name="608"><span class="lineNum"> 608 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="609"><span class="lineNum"> 609 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="610"><span class="lineNum"> 610 </span> : : </a>
+<a name="611"><span class="lineNum"> 611 </span> : : /* Indices got defined and formatted, we're done here */</a>
+<a name="612"><span class="lineNum"> 612 </span> :<span class="lineNoCov"> 0 : goto done;</span></a>
+<a name="613"><span class="lineNum"> 613 </span> : : }</a>
+<a name="614"><span class="lineNum"> 614 </span> : : /* Determine if we need to define the indices. These should BOTH be false or true */</a>
+<a name="615"><span class="lineNum"> 615 </span> :<span class="lineCov"> 1 : if (!vars_defined &amp;&amp; !control_defined) {</span></a>
+<a name="616"><span class="lineNum"> 616 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_define_indices();</span></a>
+<a name="617"><span class="lineNum"> 617 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="618"><span class="lineNum"> 618 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="619"><span class="lineNum"> 619 </span> : : </a>
+<a name="620"><span class="lineNum"> 620 </span> : : /* Indices got defined and formatted, we're done here */</a>
+<a name="621"><span class="lineNum"> 621 </span> :<span class="lineCov"> 1 : goto done;</span></a>
+<a name="622"><span class="lineNum"> 622 </span> : : }</a>
+<a name="623"><span class="lineNum"> 623 </span> :<span class="lineNoCov"> 0 : if (vars_defined ^ control_defined) {</span></a>
+<a name="624"><span class="lineNum"> 624 </span> : : /* This should never happen. Both indices should be defined at the same</a>
+<a name="625"><span class="lineNum"> 625 </span> : : * time. Otherwise something seriously went wrong. */</a>
+<a name="626"><span class="lineNum"> 626 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;NV indices defined with unexpected attributes. Assert physical presence to clear\n&quot;);</span></a>
+<a name="627"><span class="lineNum"> 627 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="628"><span class="lineNum"> 628 </span> : : }</a>
+<a name="629"><span class="lineNum"> 629 </span> : : </a>
+<a name="630"><span class="lineNum"> 630 </span> : : /* Both indices are defined, now need to validate their contents */</a>
+<a name="631"><span class="lineNum"> 631 </span> : : </a>
+<a name="632"><span class="lineNum"> 632 </span> :<span class="lineNoCov"> 0 : rc = secboot_tpm_get_tpmnv_names(nv_vars_name, nv_control_name);</span></a>
+<a name="633"><span class="lineNum"> 633 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="634"><span class="lineNum"> 634 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="635"><span class="lineNum"> 635 </span> : : </a>
+<a name="636"><span class="lineNum"> 636 </span> : : /* Check for provisioned TPMNV indices, redefine them if detected */</a>
+<a name="637"><span class="lineNum"> 637 </span> :<span class="lineNoCov"> 0 : if (secboot_tpm_check_provisioned_indices(nv_vars_name, nv_control_name)) {</span></a>
+<a name="638"><span class="lineNum"> 638 </span> :<span class="lineNoCov"> 0 : prlog(PR_INFO, &quot;Provisioned TPM NV indices detected, redefining NV indices, and resetting keystore\n&quot;);</span></a>
+<a name="639"><span class="lineNum"> 639 </span> :<span class="lineNoCov"> 0 : rc = secboot_tpm_undefine_indices(&amp;vars_defined, &amp;control_defined);</span></a>
+<a name="640"><span class="lineNum"> 640 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="641"><span class="lineNum"> 641 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="642"><span class="lineNum"> 642 </span> : : </a>
+<a name="643"><span class="lineNum"> 643 </span> :<span class="lineNoCov"> 0 : rc = secboot_tpm_define_indices();</span></a>
+<a name="644"><span class="lineNum"> 644 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="645"><span class="lineNum"> 645 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="646"><span class="lineNum"> 646 </span> : : </a>
+<a name="647"><span class="lineNum"> 647 </span> : : /* Indices got defined and formatted, we're done here */</a>
+<a name="648"><span class="lineNum"> 648 </span> :<span class="lineNoCov"> 0 : goto done;</span></a>
+<a name="649"><span class="lineNum"> 649 </span> : : }</a>
+<a name="650"><span class="lineNum"> 650 </span> : : </a>
+<a name="651"><span class="lineNum"> 651 </span> : : /* Otherwise, ensure the NV indices were defined with the correct set of attributes */</a>
+<a name="652"><span class="lineNum"> 652 </span> :<span class="lineNoCov"> 0 : rc = secboot_tpm_check_tpmnv_attrs(nv_vars_name, nv_control_name);</span></a>
+<a name="653"><span class="lineNum"> 653 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="654"><span class="lineNum"> 654 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="655"><span class="lineNum"> 655 </span> : : </a>
+<a name="656"><span class="lineNum"> 656 </span> : : </a>
+<a name="657"><span class="lineNum"> 657 </span> : : /* TPMNV indices exist, are correct, and weren't just formatted, so read them in */</a>
+<a name="658"><span class="lineNum"> 658 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.read(SECBOOT_TPMNV_VARS_INDEX,</span></a>
+<a name="659"><span class="lineNum"> 659 </span> : : tpmnv_vars_image,</a>
+<a name="660"><span class="lineNum"> 660 </span> : : tpmnv_vars_size, 0);</a>
+<a name="661"><span class="lineNum"> 661 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="662"><span class="lineNum"> 662 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to read from the VARS index\n&quot;);</span></a>
+<a name="663"><span class="lineNum"> 663 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="664"><span class="lineNum"> 664 </span> : : }</a>
+<a name="665"><span class="lineNum"> 665 </span> : : </a>
+<a name="666"><span class="lineNum"> 666 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.read(SECBOOT_TPMNV_CONTROL_INDEX,</span></a>
+<a name="667"><span class="lineNum"> 667 </span> : : tpmnv_control_image,</a>
+<a name="668"><span class="lineNum"> 668 </span> : : sizeof(struct tpmnv_control), 0);</a>
+<a name="669"><span class="lineNum"> 669 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="670"><span class="lineNum"> 670 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;Failed to read from the CONTROL index\n&quot;);</span></a>
+<a name="671"><span class="lineNum"> 671 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="672"><span class="lineNum"> 672 </span> : : }</a>
+<a name="673"><span class="lineNum"> 673 </span> : : </a>
+<a name="674"><span class="lineNum"> 674 </span> : : /* Verify the header information is correct */</a>
+<a name="675"><span class="lineNum"> 675 </span> :<span class="lineNoCov"> 0 : if (tpmnv_vars_image-&gt;header.magic_number != SECBOOT_MAGIC_NUMBER ||</span></a>
+<a name="676"><span class="lineNum"> 676 </span> :<span class="lineNoCov"> 0 : tpmnv_control_image-&gt;header.magic_number != SECBOOT_MAGIC_NUMBER ||</span></a>
+<a name="677"><span class="lineNum"> 677 </span> :<span class="lineNoCov"> 0 : tpmnv_vars_image-&gt;header.version != SECBOOT_VERSION ||</span></a>
+<a name="678"><span class="lineNum"> 678 </span> :<span class="lineNoCov"> 0 : tpmnv_control_image-&gt;header.version != SECBOOT_VERSION) {</span></a>
+<a name="679"><span class="lineNum"> 679 </span> :<span class="lineNoCov"> 0 : prlog(PR_ERR, &quot;TPMNV indices defined, but contain bad data. Assert physical presence to clear\n&quot;);</span></a>
+<a name="680"><span class="lineNum"> 680 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="681"><span class="lineNum"> 681 </span> : : }</a>
+<a name="682"><span class="lineNum"> 682 </span> : : </a>
+<a name="683"><span class="lineNum"> 683 </span> : : /* Verify the secboot partition header information,</a>
+<a name="684"><span class="lineNum"> 684 </span> : : * reformat if incorrect</a>
+<a name="685"><span class="lineNum"> 685 </span> : : * Note: Future variants should attempt to handle older versions safely</a>
+<a name="686"><span class="lineNum"> 686 </span> : : */</a>
+<a name="687"><span class="lineNum"> 687 </span> :<span class="lineNoCov"> 0 : if (secboot_image-&gt;header.magic_number != SECBOOT_MAGIC_NUMBER ||</span></a>
+<a name="688"><span class="lineNum"> 688 </span> :<span class="lineNoCov"> 0 : secboot_image-&gt;header.version != SECBOOT_VERSION) {</span></a>
+<a name="689"><span class="lineNum"> 689 </span> :<span class="lineNoCov"> 0 : rc = secboot_format();</span></a>
+<a name="690"><span class="lineNum"> 690 </span> :<span class="lineNoCov"> 0 : if (rc)</span></a>
+<a name="691"><span class="lineNum"> 691 </span> :<span class="lineNoCov"> 0 : goto error;</span></a>
+<a name="692"><span class="lineNum"> 692 </span> : : }</a>
+<a name="693"><span class="lineNum"> 693 </span> : : </a>
+<a name="694"><span class="lineNum"> 694 </span> :<span class="lineNoCov"> 0 : done:</span></a>
+<a name="695"><span class="lineNum"> 695 </span> :<span class="lineCov"> 1 : return OPAL_SUCCESS;</span></a>
+<a name="696"><span class="lineNum"> 696 </span> : : </a>
+<a name="697"><span class="lineNum"> 697 </span> :<span class="lineNoCov"> 0 : error:</span></a>
+<a name="698"><span class="lineNum"> 698 </span> :<span class="lineNoCov"> 0 : free(secboot_image);</span></a>
+<a name="699"><span class="lineNum"> 699 </span> :<span class="lineNoCov"> 0 : secboot_image = NULL;</span></a>
+<a name="700"><span class="lineNum"> 700 </span> :<span class="lineNoCov"> 0 : free(tpmnv_vars_image);</span></a>
+<a name="701"><span class="lineNum"> 701 </span> :<span class="lineNoCov"> 0 : tpmnv_vars_image = NULL;</span></a>
+<a name="702"><span class="lineNum"> 702 </span> :<span class="lineNoCov"> 0 : free(tpmnv_control_image);</span></a>
+<a name="703"><span class="lineNum"> 703 </span> :<span class="lineNoCov"> 0 : tpmnv_control_image = NULL;</span></a>
+<a name="704"><span class="lineNum"> 704 </span> : : </a>
+<a name="705"><span class="lineNum"> 705 </span> :<span class="lineNoCov"> 0 : return rc;</span></a>
+<a name="706"><span class="lineNum"> 706 </span> : : }</a>
+<a name="707"><span class="lineNum"> 707 </span> : : </a>
+<a name="708"><span class="lineNum"> 708 </span> : : </a>
+<a name="709"><span class="lineNum"> 709 </span> :<span class="lineNoCov"> 0 : static void secboot_tpm_lockdown(void)</span></a>
+<a name="710"><span class="lineNum"> 710 </span> : : {</a>
+<a name="711"><span class="lineNum"> 711 </span> : : /* Note: While write lock is called here on the two NV indices,</a>
+<a name="712"><span class="lineNum"> 712 </span> : : * both indices are also defined on the platform hierarchy.</a>
+<a name="713"><span class="lineNum"> 713 </span> : : * The platform hierarchy auth is set later in the skiboot</a>
+<a name="714"><span class="lineNum"> 714 </span> : : * initialization process, and not by any secvar-related code.</a>
+<a name="715"><span class="lineNum"> 715 </span> : : */</a>
+<a name="716"><span class="lineNum"> 716 </span> : : int rc;</a>
+<a name="717"><span class="lineNum"> 717 </span> : : </a>
+<a name="718"><span class="lineNum"> 718 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.writelock(SECBOOT_TPMNV_VARS_INDEX);</span></a>
+<a name="719"><span class="lineNum"> 719 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="720"><span class="lineNum"> 720 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;TSS Write Lock failed on VARS index, halting.\n&quot;);</span></a>
+<a name="721"><span class="lineNum"> 721 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="722"><span class="lineNum"> 722 </span> : : }</a>
+<a name="723"><span class="lineNum"> 723 </span> : : </a>
+<a name="724"><span class="lineNum"> 724 </span> :<span class="lineNoCov"> 0 : rc = tpmnv_ops.writelock(SECBOOT_TPMNV_CONTROL_INDEX);</span></a>
+<a name="725"><span class="lineNum"> 725 </span> :<span class="lineNoCov"> 0 : if (rc) {</span></a>
+<a name="726"><span class="lineNum"> 726 </span> :<span class="lineNoCov"> 0 : prlog(PR_EMERG, &quot;TSS Write Lock failed on CONTROL index, halting.\n&quot;);</span></a>
+<a name="727"><span class="lineNum"> 727 </span> :<span class="lineNoCov"> 0 : abort();</span></a>
+<a name="728"><span class="lineNum"> 728 </span> : : }</a>
+<a name="729"><span class="lineNum"> 729 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="730"><span class="lineNum"> 730 </span> : : </a>
+<a name="731"><span class="lineNum"> 731 </span> : : struct secvar_storage_driver secboot_tpm_driver = {</a>
+<a name="732"><span class="lineNum"> 732 </span> : : .load_bank = secboot_tpm_load_bank,</a>
+<a name="733"><span class="lineNum"> 733 </span> : : .write_bank = secboot_tpm_write_bank,</a>
+<a name="734"><span class="lineNum"> 734 </span> : : .store_init = secboot_tpm_store_init,</a>
+<a name="735"><span class="lineNum"> 735 </span> : : .lockdown = secboot_tpm_lockdown,</a>
+<a name="736"><span class="lineNum"> 736 </span> : : .max_var_size = SECBOOT_TPM_MAX_VAR_SIZE,</a>
+<a name="737"><span class="lineNum"> 737 </span> : : };</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/index-sort-b.html b/coverage-report/libstb/secvar/test/index-sort-b.html
new file mode 100644
index 0000000..b54a6b6
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/index-sort-b.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">580</td>
+ <td class="headerCovTableEntry">583</td>
+ <td class="headerCovTableEntryHi">99.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-enqueue.c.gcov.html">secvar-test-enqueue.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">68 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-edk2-compat.c.gcov.html">secvar-test-edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=99 height=10 alt="99.7%"><img src="../../../snow.png" width=1 height=10 alt="99.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.7&nbsp;%</td>
+ <td class="coverNumHi">322 / 323</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-void.c.gcov.html">secvar-test-void.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-secboot-tpm.c.gcov.html">secvar-test-secboot-tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=98 height=10 alt="98.4%"><img src="../../../snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">62 / 63</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-nextvar.c.gcov.html">secvar-test-nextvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">61 / 61</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-getvar.c.gcov.html">secvar-test-getvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">47 / 47</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api_test.c.gcov.html">secvar_api_test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/index-sort-f.html b/coverage-report/libstb/secvar/test/index-sort-f.html
new file mode 100644
index 0000000..9069b24
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/index-sort-f.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">580</td>
+ <td class="headerCovTableEntry">583</td>
+ <td class="headerCovTableEntryHi">99.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-void.c.gcov.html">secvar-test-void.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-nextvar.c.gcov.html">secvar-test-nextvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">61 / 61</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-getvar.c.gcov.html">secvar-test-getvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">47 / 47</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-enqueue.c.gcov.html">secvar-test-enqueue.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">68 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api_test.c.gcov.html">secvar_api_test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-secboot-tpm.c.gcov.html">secvar-test-secboot-tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=98 height=10 alt="98.4%"><img src="../../../snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">62 / 63</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-edk2-compat.c.gcov.html">secvar-test-edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=99 height=10 alt="99.7%"><img src="../../../snow.png" width=1 height=10 alt="99.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.7&nbsp;%</td>
+ <td class="coverNumHi">322 / 323</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/index-sort-l.html b/coverage-report/libstb/secvar/test/index-sort-l.html
new file mode 100644
index 0000000..e80ebb5
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/index-sort-l.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">580</td>
+ <td class="headerCovTableEntry">583</td>
+ <td class="headerCovTableEntryHi">99.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api_test.c.gcov.html">secvar_api_test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-secboot-tpm.c.gcov.html">secvar-test-secboot-tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=98 height=10 alt="98.4%"><img src="../../../snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">62 / 63</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-edk2-compat.c.gcov.html">secvar-test-edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=99 height=10 alt="99.7%"><img src="../../../snow.png" width=1 height=10 alt="99.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.7&nbsp;%</td>
+ <td class="coverNumHi">322 / 323</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-void.c.gcov.html">secvar-test-void.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-getvar.c.gcov.html">secvar-test-getvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">47 / 47</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-nextvar.c.gcov.html">secvar-test-nextvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">61 / 61</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-enqueue.c.gcov.html">secvar-test-enqueue.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">68 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/index.html b/coverage-report/libstb/secvar/test/index.html
new file mode 100644
index 0000000..f50e41e
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/index.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - libstb/secvar/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">580</td>
+ <td class="headerCovTableEntry">583</td>
+ <td class="headerCovTableEntryHi">99.5 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntry">22</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-edk2-compat.c.gcov.html">secvar-test-edk2-compat.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=99 height=10 alt="99.7%"><img src="../../../snow.png" width=1 height=10 alt="99.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">99.7&nbsp;%</td>
+ <td class="coverNumHi">322 / 323</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">7 / 7</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-enqueue.c.gcov.html">secvar-test-enqueue.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">68 / 68</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-getvar.c.gcov.html">secvar-test-getvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">47 / 47</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-nextvar.c.gcov.html">secvar-test-nextvar.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">61 / 61</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-secboot-tpm.c.gcov.html">secvar-test-secboot-tpm.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=98 height=10 alt="98.4%"><img src="../../../snow.png" width=2 height=10 alt="98.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">98.4&nbsp;%</td>
+ <td class="coverNumHi">62 / 63</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar-test-void.c.gcov.html">secvar-test-void.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="secvar_api_test.c.gcov.html">secvar_api_test.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=95 height=10 alt="94.7%"><img src="../../../snow.png" width=5 height=10 alt="94.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">94.7&nbsp;%</td>
+ <td class="coverNumHi">18 / 19</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func-sort-c.html b/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func-sort-c.html
new file mode 100644
index 0000000..4c94964
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func-sort-c.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-edk2-compat.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-edk2-compat.c<span style="font-size: 80%;"> (<a href="secvar-test-edk2-compat.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">322</td>
+ <td class="headerCovTableEntry">323</td>
+ <td class="headerCovTableEntryHi">99.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar-test-edk2-compat.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#463">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#41">reset_keystore</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#84">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#66">delete_hw_key_hash</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#82">secvar_set_secure_mode</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#54">add_hw_key_hash</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#42">verify_hw_key_hash</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func.html b/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func.html
new file mode 100644
index 0000000..a1999b3
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.func.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-edk2-compat.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-edk2-compat.c<span style="font-size: 80%;"> (<a href="secvar-test-edk2-compat.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">322</td>
+ <td class="headerCovTableEntry">323</td>
+ <td class="headerCovTableEntryHi">99.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar-test-edk2-compat.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#54">add_hw_key_hash</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#66">delete_hw_key_hash</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#463">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#41">reset_keystore</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#84">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#82">secvar_set_secure_mode</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-edk2-compat.c.gcov.html#42">verify_hw_key_hash</a></td>
+ <td class="coverFnHi">14</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.gcov.html b/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.gcov.html
new file mode 100644
index 0000000..d053eb7
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-edk2-compat.c.gcov.html
@@ -0,0 +1,565 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-edk2-compat.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-edk2-compat.c<span style="font-size: 80%;"> (source / <a href="secvar-test-edk2-compat.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">322</td>
+ <td class="headerCovTableEntry">323</td>
+ <td class="headerCovTableEntryHi">99.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntry">7</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2020 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #define MBEDTLS_PKCS7_C</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;secvar_common_test.c&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &quot;../backend/edk2-compat.c&quot;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &quot;../backend/edk2-compat-process.c&quot;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &quot;../secvar_util.c&quot;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : #include &quot;../../crypto/pkcs7/pkcs7.c&quot;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : #include &quot;./data/PK.h&quot;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : #include &quot;./data/noPK.h&quot;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : #include &quot;./data/KEK.h&quot;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : #include &quot;./data/invalidkek.h&quot;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : #include &quot;./data/malformedkek.h&quot;</a>
+<a name="15"><span class="lineNum"> 15 </span> : : #include &quot;./data/db.h&quot;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : #include &quot;./data/dbsigneddata.h&quot;</a>
+<a name="17"><span class="lineNum"> 17 </span> : : #include &quot;./data/OldTSKEK.h&quot;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : #include &quot;./data/multipleKEK.h&quot;</a>
+<a name="19"><span class="lineNum"> 19 </span> : : #include &quot;./data/multipleDB.h&quot;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #include &quot;./data/multiplePK.h&quot;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #include &quot;./data/dbx.h&quot;</a>
+<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;./data/dbxcert.h&quot;</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;./data/dbxsha512.h&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #include &quot;./data/dbxmalformed.h&quot;</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : bool test_hw_key_hash = false;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : /* Hardcoding HW KEY HASH to avoid emulating device-tree in unit-tests. */</a>
+<a name="29"><span class="lineNum"> 29 </span> : : const unsigned char hw_key_hash[64] = {</a>
+<a name="30"><span class="lineNum"> 30 </span> : : 0xb6, 0xdf, 0xfe, 0x75, 0x53, 0xf9, 0x2e, 0xcb, 0x2b, 0x05, 0x55, 0x35, 0xd7, 0xda, 0xfe, 0x32, \</a>
+<a name="31"><span class="lineNum"> 31 </span> : : 0x98, 0x93, 0x35, 0x1e, 0xd7, 0x4b, 0xbb, 0x21, 0x6b, 0xa0, 0x56, 0xa7, 0x1e, 0x3c, 0x0b, 0x56, \</a>
+<a name="32"><span class="lineNum"> 32 </span> : : 0x6f, 0x0c, 0x4d, 0xbe, 0x31, 0x42, 0x13, 0x68, 0xcb, 0x32, 0x11, 0x6f, 0x13, 0xbb, 0xdd, 0x9e, \</a>
+<a name="33"><span class="lineNum"> 33 </span> : : 0x4f, 0xe3, 0x83, 0x8b, 0x1c, 0x6a, 0x2e, 0x07, 0xdb, 0x95, 0x16, 0xc9, 0x33, 0xaa, 0x20, 0xef</a>
+<a name="34"><span class="lineNum"> 34 </span> : : };</a>
+<a name="35"><span class="lineNum"> 35 </span> : : </a>
+<a name="36"><span class="lineNum"> 36 </span> : : const unsigned char new_hw_key_hash[64] = {</a>
+<a name="37"><span class="lineNum"> 37 </span> : : 0xa6, 0xdf, 0xfe, 0x75, 0x53, 0xf9, 0x2e, 0xcb, 0x2b, 0x05, 0x55, 0x35, 0xd7, 0xda, 0xfe, 0x32, \</a>
+<a name="38"><span class="lineNum"> 38 </span> : : 0x98, 0x93, 0x35, 0x1e, 0xd7, 0x4b, 0xbb, 0x21, 0x6b, 0xa0, 0x56, 0xa7, 0x1e, 0x3c, 0x0b, 0x56, \</a>
+<a name="39"><span class="lineNum"> 39 </span> : : 0x6f, 0x0c, 0x4d, 0xbe, 0x31, 0x42, 0x13, 0x68, 0xcb, 0x32, 0x11, 0x6f, 0x13, 0xbb, 0xdd, 0x9e, \</a>
+<a name="40"><span class="lineNum"> 40 </span> : : 0x4f, 0xe3, 0x83, 0x8b, 0x1c, 0x6a, 0x2e, 0x07, 0xdb, 0x95, 0x16, 0xc9, 0x33, 0xaa, 0x20, 0xef</a>
+<a name="41"><span class="lineNum"> 41 </span> : : };</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : int reset_keystore(struct list_head *bank __unused) { return 0; }</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 14 : int verify_hw_key_hash(void)</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : {</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : /* This check is added just to simulate mismatch of hashes. */</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 14 : if (test_hw_key_hash)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : if (memcmp(new_hw_key_hash, hw_key_hash, 64) != 0)</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : return OPAL_PERMISSION;</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 13 : return OPAL_SUCCESS;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : </a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 5 : int add_hw_key_hash(struct list_head *bank)</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : {</a>
+<a name="58"><span class="lineNum"> 58 </span> : : struct secvar *var;</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 5 : uint32_t hw_key_hash_size = 64;</span></a>
+<a name="60"><span class="lineNum"> 60 </span> : : </a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 5 : var = new_secvar(&quot;HWKH&quot;, 5, hw_key_hash,</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : hw_key_hash_size, SECVAR_FLAG_PROTECTED);</a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 5 : list_add_tail(bank, &amp;var-&gt;link);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 5 : return OPAL_SUCCESS;</span></a>
+<a name="66"><span class="lineNum"> 66 </span> : : }</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 2 : int delete_hw_key_hash(struct list_head *bank)</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : {</a>
+<a name="70"><span class="lineNum"> 70 </span> : : struct secvar *var;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 2 : var = find_secvar(&quot;HWKH&quot;, 5, bank);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 2 : if (!var)</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineNoCov"> 0 : return OPAL_SUCCESS;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 2 : list_del(&amp;var-&gt;link);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 2 : dealloc_secvar(var);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 2 : return OPAL_SUCCESS;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> : : }</a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : const char *secvar_test_name = &quot;edk2-compat&quot;;</a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 2 : int secvar_set_secure_mode(void) { return 0; };</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> :<span class="lineCov"> 1 : int run_test()</span></a>
+<a name="87"><span class="lineNum"> 87 </span> : : {</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : int rc = -1;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> : : struct secvar *tmp;</a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : char empty[64] = {0};</span></a>
+<a name="91"><span class="lineNum"> 91 </span> : : </a>
+<a name="92"><span class="lineNum"> 92 </span> : : /* The sequence of test cases here is important to ensure that</a>
+<a name="93"><span class="lineNum"> 93 </span> : : * timestamp checks work as expected. */</a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : /* Check pre-process creates the empty variables. */</a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;variable_bank));</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : rc = edk2_compat_pre_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;TS&quot;, 3, &amp;variable_bank);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : ASSERT(64 == tmp-&gt;data_size);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : ASSERT(!(memcmp(tmp-&gt;data, empty, 64)));</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> : : /* Add test to verify hw_key_hash.</a>
+<a name="106"><span class="lineNum"> 106 </span> : : * This is to ensure that mismatch of test happens.</a>
+<a name="107"><span class="lineNum"> 107 </span> : : * The test uses test_hw_key_hash variable to ensure that</a>
+<a name="108"><span class="lineNum"> 108 </span> : : * mismatch happens. For all next tests, test_hw_key_hash variable</a>
+<a name="109"><span class="lineNum"> 109 </span> : : * should be zero to avoid hard-coded mismatch.</a>
+<a name="110"><span class="lineNum"> 110 </span> : : */</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : test_hw_key_hash = 1;</span></a>
+<a name="112"><span class="lineNum"> 112 </span> :<span class="lineCov"> 1 : setup_mode = false;</span></a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : printf(&quot;Add PK&quot;);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;PK&quot;, 3, PK_auth, PK_auth_len, 0);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="116"><span class="lineNum"> 116 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : printf(&quot;rc is %04x %d\n&quot;, rc, rc);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="122"><span class="lineNum"> 122 </span> :<span class="lineCov"> 1 : ASSERT(setup_mode);</span></a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : /* Set test_hw_key_hash to zero to avoid hardcoded mismatch. */</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : test_hw_key_hash = 0;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> : : /* Add PK and a failed update. */</a>
+<a name="128"><span class="lineNum"> 128 </span> :<span class="lineCov"> 1 : printf(&quot;Add PK and failed dbx&quot;);</span></a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;PK&quot;, 3, PK_auth, PK_auth_len, 0);</span></a>
+<a name="130"><span class="lineNum"> 130 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;dbx&quot;, 4, wrongdbxauth, wrong_dbx_auth_len, 0);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 1 : ASSERT(2 == list_length(&amp;update_bank));</span></a>
+<a name="138"><span class="lineNum"> 138 </span> : : </a>
+<a name="139"><span class="lineNum"> 139 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PARAMETER == rc);</span></a>
+<a name="141"><span class="lineNum"> 141 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="142"><span class="lineNum"> 142 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="143"><span class="lineNum"> 143 </span> :<span class="lineCov"> 1 : rc = edk2_compat_post_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="145"><span class="lineNum"> 145 </span> :<span class="lineCov"> 1 : ASSERT(setup_mode);</span></a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> : : /* Add PK and db, db update should fail, so all updates fail. */</a>
+<a name="148"><span class="lineNum"> 148 </span> :<span class="lineCov"> 1 : printf(&quot;Add PK&quot;);</span></a>
+<a name="149"><span class="lineNum"> 149 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;PK&quot;, 3, PK_auth, PK_auth_len, 0);</span></a>
+<a name="150"><span class="lineNum"> 150 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="151"><span class="lineNum"> 151 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="152"><span class="lineNum"> 152 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="153"><span class="lineNum"> 153 </span> :<span class="lineCov"> 1 : printf(&quot;Add db&quot;);</span></a>
+<a name="154"><span class="lineNum"> 154 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;db&quot;, 3, DB_auth, sizeof(DB_auth), 0);</span></a>
+<a name="155"><span class="lineNum"> 155 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="156"><span class="lineNum"> 156 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="157"><span class="lineNum"> 157 </span> :<span class="lineCov"> 1 : ASSERT(2 == list_length(&amp;update_bank));</span></a>
+<a name="158"><span class="lineNum"> 158 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="159"><span class="lineNum"> 159 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PERMISSION == rc);</span></a>
+<a name="160"><span class="lineNum"> 160 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="161"><span class="lineNum"> 161 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="162"><span class="lineNum"> 162 </span> :<span class="lineCov"> 1 : rc = edk2_compat_post_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="163"><span class="lineNum"> 163 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="164"><span class="lineNum"> 164 </span> :<span class="lineCov"> 1 : ASSERT(setup_mode);</span></a>
+<a name="165"><span class="lineNum"> 165 </span> : : </a>
+<a name="166"><span class="lineNum"> 166 </span> : : /* Add PK to update and .process(). */</a>
+<a name="167"><span class="lineNum"> 167 </span> :<span class="lineCov"> 1 : printf(&quot;Add PK&quot;);</span></a>
+<a name="168"><span class="lineNum"> 168 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;PK&quot;, 3, PK_auth, PK_auth_len, 0);</span></a>
+<a name="169"><span class="lineNum"> 169 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="170"><span class="lineNum"> 170 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="171"><span class="lineNum"> 171 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="172"><span class="lineNum"> 172 </span> : : </a>
+<a name="173"><span class="lineNum"> 173 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="174"><span class="lineNum"> 174 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="175"><span class="lineNum"> 175 </span> :<span class="lineCov"> 1 : ASSERT(6 == list_length(&amp;variable_bank));</span></a>
+<a name="176"><span class="lineNum"> 176 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="177"><span class="lineNum"> 177 </span> :<span class="lineCov"> 1 : rc = edk2_compat_post_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;PK&quot;, 3, &amp;variable_bank);</span></a>
+<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 1 : ASSERT(PK_auth_len &gt; tmp-&gt;data_size); /* esl should be smaller without auth. */</span></a>
+<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 1 : ASSERT(!setup_mode);</span></a>
+<a name="184"><span class="lineNum"> 184 </span> : : </a>
+<a name="185"><span class="lineNum"> 185 </span> : : /* Add db, should fail with no KEK. */</a>
+<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 1 : printf(&quot;Add db&quot;);</span></a>
+<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;db&quot;, 3, DB_auth, DB_auth_len, 0);</span></a>
+<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="193"><span class="lineNum"> 193 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PERMISSION == rc);</span></a>
+<a name="194"><span class="lineNum"> 194 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="195"><span class="lineNum"> 195 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="196"><span class="lineNum"> 196 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;db&quot;, 3, &amp;variable_bank);</span></a>
+<a name="197"><span class="lineNum"> 197 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> : : /* Add valid KEK, .process(), succeeds. */</a>
+<a name="200"><span class="lineNum"> 200 </span> :<span class="lineCov"> 1 : printf(&quot;Add KEK&quot;);</span></a>
+<a name="201"><span class="lineNum"> 201 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;KEK&quot;, 4, KEK_auth, KEK_auth_len, 0);</span></a>
+<a name="202"><span class="lineNum"> 202 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="203"><span class="lineNum"> 203 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="204"><span class="lineNum"> 204 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="205"><span class="lineNum"> 205 </span> : : </a>
+<a name="206"><span class="lineNum"> 206 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="207"><span class="lineNum"> 207 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="208"><span class="lineNum"> 208 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="209"><span class="lineNum"> 209 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="210"><span class="lineNum"> 210 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;KEK&quot;, 4, &amp;variable_bank);</span></a>
+<a name="211"><span class="lineNum"> 211 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="212"><span class="lineNum"> 212 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="213"><span class="lineNum"> 213 </span> : : </a>
+<a name="214"><span class="lineNum"> 214 </span> : : /* Add valid KEK, .process(), timestamp check fails. */</a>
+<a name="215"><span class="lineNum"> 215 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;KEK&quot;, 4, OldTS_KEK_auth, OldTS_KEK_auth_len, 0);</span></a>
+<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="219"><span class="lineNum"> 219 </span> : : </a>
+<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PERMISSION == rc);</span></a>
+<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="224"><span class="lineNum"> 224 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;KEK&quot;, 4, &amp;variable_bank);</span></a>
+<a name="225"><span class="lineNum"> 225 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="226"><span class="lineNum"> 226 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="227"><span class="lineNum"> 227 </span> : : </a>
+<a name="228"><span class="lineNum"> 228 </span> : : /* Add db, .process(), should succeed. */</a>
+<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 1 : printf(&quot;Add db again\n&quot;);</span></a>
+<a name="230"><span class="lineNum"> 230 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;db&quot;, 3, DB_auth, DB_auth_len, 0);</span></a>
+<a name="231"><span class="lineNum"> 231 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="234"><span class="lineNum"> 234 </span> : : </a>
+<a name="235"><span class="lineNum"> 235 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="236"><span class="lineNum"> 236 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="237"><span class="lineNum"> 237 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="238"><span class="lineNum"> 238 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="239"><span class="lineNum"> 239 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;db&quot;, 3, &amp;variable_bank);</span></a>
+<a name="240"><span class="lineNum"> 240 </span> :<span class="lineCov"> 1 : printf(&quot;tmp is %s\n&quot;, tmp-&gt;key);</span></a>
+<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="242"><span class="lineNum"> 242 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="243"><span class="lineNum"> 243 </span> : : </a>
+<a name="244"><span class="lineNum"> 244 </span> : : /* Add db, .process(), should fail because of timestamp. */</a>
+<a name="245"><span class="lineNum"> 245 </span> :<span class="lineCov"> 1 : printf(&quot;Add db again\n&quot;);</span></a>
+<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;db&quot;, 3, DB_auth, DB_auth_len, 0);</span></a>
+<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="249"><span class="lineNum"> 249 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="250"><span class="lineNum"> 250 </span> : : </a>
+<a name="251"><span class="lineNum"> 251 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PERMISSION == rc);</span></a>
+<a name="253"><span class="lineNum"> 253 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="254"><span class="lineNum"> 254 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="255"><span class="lineNum"> 255 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;db&quot;, 3, &amp;variable_bank);</span></a>
+<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="258"><span class="lineNum"> 258 </span> : : </a>
+<a name="259"><span class="lineNum"> 259 </span> : : /* Add valid sha256 dbx. */</a>
+<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 1 : printf(&quot;Add sha256 dbx\n&quot;);</span></a>
+<a name="261"><span class="lineNum"> 261 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;dbx&quot;, 4, dbxauth, dbx_auth_len, 0);</span></a>
+<a name="262"><span class="lineNum"> 262 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="263"><span class="lineNum"> 263 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="264"><span class="lineNum"> 264 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="265"><span class="lineNum"> 265 </span> : : </a>
+<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="268"><span class="lineNum"> 268 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;db&quot;, 3, &amp;variable_bank);</span></a>
+<a name="271"><span class="lineNum"> 271 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="273"><span class="lineNum"> 273 </span> : : </a>
+<a name="274"><span class="lineNum"> 274 </span> : : /* Add invalid KEK, .process(), should fail. Timestamp check failure. */</a>
+<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 1 : printf(&quot;Add invalid KEK\n&quot;);</span></a>
+<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;KEK&quot;, 4, InvalidKEK_auth, InvalidKEK_auth_len, 0);</span></a>
+<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="278"><span class="lineNum"> 278 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="280"><span class="lineNum"> 280 </span> : : </a>
+<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PERMISSION == rc);</span></a>
+<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;KEK&quot;, 4, &amp;variable_bank);</span></a>
+<a name="286"><span class="lineNum"> 286 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="288"><span class="lineNum"> 288 </span> : : </a>
+<a name="289"><span class="lineNum"> 289 </span> : : /* Add ill formatted KEK, .process(), should fail. */</a>
+<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 1 : printf(&quot;Add invalid KEK\n&quot;);</span></a>
+<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;KEK&quot;, 4, MalformedKEK_auth, MalformedKEK_auth_len, 0);</span></a>
+<a name="292"><span class="lineNum"> 292 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="293"><span class="lineNum"> 293 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="294"><span class="lineNum"> 294 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PARAMETER == rc);</span></a>
+<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="300"><span class="lineNum"> 300 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;KEK&quot;, 4, &amp;variable_bank);</span></a>
+<a name="301"><span class="lineNum"> 301 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> : : /* Add multiple db and then multiple KEKs.</a>
+<a name="305"><span class="lineNum"> 305 </span> : : * The db should be signed with a KEK yet to be added.</a>
+<a name="306"><span class="lineNum"> 306 </span> : : */</a>
+<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 1 : printf(&quot;Add multiple db\n&quot;);</span></a>
+<a name="308"><span class="lineNum"> 308 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;db&quot;, 3, multipleDB_auth, multipleDB_auth_len, 0);</span></a>
+<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="311"><span class="lineNum"> 311 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 1 : printf(&quot;Add multiple KEK\n&quot;);</span></a>
+<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;KEK&quot;, 4, multipleKEK_auth, multipleKEK_auth_len, 0);</span></a>
+<a name="314"><span class="lineNum"> 314 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="316"><span class="lineNum"> 316 </span> :<span class="lineCov"> 1 : ASSERT(2 == list_length(&amp;update_bank));</span></a>
+<a name="317"><span class="lineNum"> 317 </span> : : </a>
+<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="319"><span class="lineNum"> 319 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PERMISSION == rc);</span></a>
+<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="321"><span class="lineNum"> 321 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="322"><span class="lineNum"> 322 </span> : : </a>
+<a name="323"><span class="lineNum"> 323 </span> : : /* Add multiple KEK ESLs, one of them should sign the db. */</a>
+<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 1 : printf(&quot;Add multiple KEK\n&quot;);</span></a>
+<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;KEK&quot;, 4, multipleKEK_auth, multipleKEK_auth_len, 0);</span></a>
+<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 1 : printf(&quot;Add multiple db\n&quot;);</span></a>
+<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;db&quot;, 3, multipleDB_auth, multipleDB_auth_len, 0);</span></a>
+<a name="331"><span class="lineNum"> 331 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="332"><span class="lineNum"> 332 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 1 : ASSERT(2 == list_length(&amp;update_bank));</span></a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="336"><span class="lineNum"> 336 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="337"><span class="lineNum"> 337 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="338"><span class="lineNum"> 338 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="339"><span class="lineNum"> 339 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;KEK&quot;, 4, &amp;variable_bank);</span></a>
+<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="341"><span class="lineNum"> 341 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;db&quot;, 3, &amp;variable_bank);</span></a>
+<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="345"><span class="lineNum"> 345 </span> : : </a>
+<a name="346"><span class="lineNum"> 346 </span> : : /* Add db with signeddata PKCS7 format. */</a>
+<a name="347"><span class="lineNum"> 347 </span> :<span class="lineCov"> 1 : printf(&quot;DB with signed data\n&quot;);</span></a>
+<a name="348"><span class="lineNum"> 348 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;db&quot;, 3, dbsigneddata_auth, dbsigneddata_auth_len, 0);</span></a>
+<a name="349"><span class="lineNum"> 349 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="351"><span class="lineNum"> 351 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="352"><span class="lineNum"> 352 </span> : : </a>
+<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="355"><span class="lineNum"> 355 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;db&quot;, 3, &amp;variable_bank);</span></a>
+<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="359"><span class="lineNum"> 359 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="360"><span class="lineNum"> 360 </span> : : </a>
+<a name="361"><span class="lineNum"> 361 </span> : : /* Delete PK and invalid dbx - to test queued updates for deleting PK. */</a>
+<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 1 : printf(&quot;Delete PK\n&quot;);</span></a>
+<a name="363"><span class="lineNum"> 363 </span> : : /* Add hw_key_hash explicitly to ensure it is deleted as part of PK deletion. */</a>
+<a name="364"><span class="lineNum"> 364 </span> :<span class="lineCov"> 1 : add_hw_key_hash(&amp;variable_bank);</span></a>
+<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 1 : ASSERT(6 == list_length(&amp;variable_bank));</span></a>
+<a name="366"><span class="lineNum"> 366 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;PK&quot;, 3, noPK_auth, noPK_auth_len, 0);</span></a>
+<a name="367"><span class="lineNum"> 367 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="369"><span class="lineNum"> 369 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="370"><span class="lineNum"> 370 </span> :<span class="lineCov"> 1 : printf(&quot;Add invalid dbx\n&quot;);</span></a>
+<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;dbx&quot;, 4, wrongdbxauth, wrong_dbx_auth_len, 0);</span></a>
+<a name="372"><span class="lineNum"> 372 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="373"><span class="lineNum"> 373 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 1 : ASSERT(2 == list_length(&amp;update_bank));</span></a>
+<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="376"><span class="lineNum"> 376 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PARAMETER == rc);</span></a>
+<a name="377"><span class="lineNum"> 377 </span> :<span class="lineCov"> 1 : ASSERT(6 == list_length(&amp;variable_bank));</span></a>
+<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 1 : rc = edk2_compat_post_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;PK&quot;, 3, &amp;variable_bank);</span></a>
+<a name="382"><span class="lineNum"> 382 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="383"><span class="lineNum"> 383 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 1 : ASSERT(!setup_mode);</span></a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> : : /* Delete PK. */</a>
+<a name="387"><span class="lineNum"> 387 </span> :<span class="lineCov"> 1 : printf(&quot;Delete PK\n&quot;);</span></a>
+<a name="388"><span class="lineNum"> 388 </span> : : /* Add hw_key_hash explicitly to ensure it is deleted as part of PK deletion. */</a>
+<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 1 : add_hw_key_hash(&amp;variable_bank);</span></a>
+<a name="390"><span class="lineNum"> 390 </span> :<span class="lineCov"> 1 : ASSERT(6 == list_length(&amp;variable_bank));</span></a>
+<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;PK&quot;, 3, noPK_auth, noPK_auth_len, 0);</span></a>
+<a name="392"><span class="lineNum"> 392 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="393"><span class="lineNum"> 393 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="394"><span class="lineNum"> 394 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="395"><span class="lineNum"> 395 </span> : : </a>
+<a name="396"><span class="lineNum"> 396 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="398"><span class="lineNum"> 398 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="399"><span class="lineNum"> 399 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 1 : rc = edk2_compat_post_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="402"><span class="lineNum"> 402 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;PK&quot;, 3, &amp;variable_bank);</span></a>
+<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="404"><span class="lineNum"> 404 </span> :<span class="lineCov"> 1 : ASSERT(0 == tmp-&gt;data_size);</span></a>
+<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 1 : ASSERT(setup_mode);</span></a>
+<a name="406"><span class="lineNum"> 406 </span> : : </a>
+<a name="407"><span class="lineNum"> 407 </span> : : /* Add multiple PK. */</a>
+<a name="408"><span class="lineNum"> 408 </span> :<span class="lineCov"> 1 : printf(&quot;Multiple PK\n&quot;);</span></a>
+<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;PK&quot;, 3, multiplePK_auth, multiplePK_auth_len, 0);</span></a>
+<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="411"><span class="lineNum"> 411 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="412"><span class="lineNum"> 412 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="413"><span class="lineNum"> 413 </span> : : </a>
+<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="415"><span class="lineNum"> 415 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PARAMETER == rc);</span></a>
+<a name="416"><span class="lineNum"> 416 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;PK&quot;, 3, &amp;variable_bank);</span></a>
+<a name="419"><span class="lineNum"> 419 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="420"><span class="lineNum"> 420 </span> :<span class="lineCov"> 1 : ASSERT(0 == tmp-&gt;data_size);</span></a>
+<a name="421"><span class="lineNum"> 421 </span> :<span class="lineCov"> 1 : ASSERT(setup_mode);</span></a>
+<a name="422"><span class="lineNum"> 422 </span> : : </a>
+<a name="423"><span class="lineNum"> 423 </span> : : /* Add invalid dbx like with wrong GUID. */</a>
+<a name="424"><span class="lineNum"> 424 </span> :<span class="lineCov"> 1 : printf(&quot;Add invalid dbx\n&quot;);</span></a>
+<a name="425"><span class="lineNum"> 425 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;dbx&quot;, 4, wrongdbxauth, wrong_dbx_auth_len, 0);</span></a>
+<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="427"><span class="lineNum"> 427 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="429"><span class="lineNum"> 429 </span> : : </a>
+<a name="430"><span class="lineNum"> 430 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="431"><span class="lineNum"> 431 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PARAMETER == rc);</span></a>
+<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="434"><span class="lineNum"> 434 </span> : : </a>
+<a name="435"><span class="lineNum"> 435 </span> : : /* Ensure sha512 dbx is considered as valid. */</a>
+<a name="436"><span class="lineNum"> 436 </span> :<span class="lineCov"> 1 : printf(&quot;Add sha512 dbx\n&quot;);</span></a>
+<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;dbx&quot;, 4, dbx512, dbx512_auth_len, 0);</span></a>
+<a name="438"><span class="lineNum"> 438 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="440"><span class="lineNum"> 440 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="441"><span class="lineNum"> 441 </span> : : </a>
+<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="443"><span class="lineNum"> 443 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="444"><span class="lineNum"> 444 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 1 : tmp = find_secvar(&quot;dbx&quot;, 4, &amp;variable_bank);</span></a>
+<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 1 : ASSERT(NULL != tmp);</span></a>
+<a name="448"><span class="lineNum"> 448 </span> :<span class="lineCov"> 1 : ASSERT(0 != tmp-&gt;data_size);</span></a>
+<a name="449"><span class="lineNum"> 449 </span> : : </a>
+<a name="450"><span class="lineNum"> 450 </span> : : /* We do not support cert as dbx. */</a>
+<a name="451"><span class="lineNum"> 451 </span> :<span class="lineCov"> 1 : printf(&quot;Add db(cert) as dbx\n&quot;);</span></a>
+<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;dbx&quot;, 4, dbx_cert_auth, sizeof(dbx_cert_auth), 0);</span></a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 1 : ASSERT(0 == edk2_compat_validate(tmp));</span></a>
+<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;update_bank, &amp;tmp-&gt;link);</span></a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 1 : ASSERT(1 == list_length(&amp;update_bank));</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : </a>
+<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 1 : rc = edk2_compat_process(&amp;variable_bank, &amp;update_bank);</span></a>
+<a name="458"><span class="lineNum"> 458 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_PARAMETER == rc);</span></a>
+<a name="459"><span class="lineNum"> 459 </span> :<span class="lineCov"> 1 : ASSERT(5 == list_length(&amp;variable_bank));</span></a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;update_bank));</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : </a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : }</a>
+<a name="464"><span class="lineNum"> 464 </span> : : </a>
+<a name="465"><span class="lineNum"> 465 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="466"><span class="lineNum"> 466 </span> : : {</a>
+<a name="467"><span class="lineNum"> 467 </span> : : int rc;</a>
+<a name="468"><span class="lineNum"> 468 </span> : : </a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 1 : list_head_init(&amp;variable_bank);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 1 : list_head_init(&amp;update_bank);</span></a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> :<span class="lineCov"> 1 : secvar_storage.max_var_size = 4096;</span></a>
+<a name="473"><span class="lineNum"> 473 </span> : : </a>
+<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 1 : rc = run_test();</span></a>
+<a name="475"><span class="lineNum"> 475 </span> : : </a>
+<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 1 : clear_bank_list(&amp;variable_bank);</span></a>
+<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 1 : clear_bank_list(&amp;update_bank);</span></a>
+<a name="478"><span class="lineNum"> 478 </span> : : </a>
+<a name="479"><span class="lineNum"> 479 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="480"><span class="lineNum"> 480 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func-sort-c.html b/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func-sort-c.html
new file mode 100644
index 0000000..d12e7e4
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func-sort-c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-enqueue.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-enqueue.c<span style="font-size: 80%;"> (<a href="secvar-test-enqueue.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar-test-enqueue.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-enqueue.c.gcov.html#13">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-enqueue.c.gcov.html#7">temp_write_bank</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func.html b/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func.html
new file mode 100644
index 0000000..a147b99
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.func.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-enqueue.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-enqueue.c<span style="font-size: 80%;"> (<a href="secvar-test-enqueue.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar-test-enqueue.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-enqueue.c.gcov.html#13">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-enqueue.c.gcov.html#7">temp_write_bank</a></td>
+ <td class="coverFnHi">5</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.gcov.html b/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.gcov.html
new file mode 100644
index 0000000..44b453d
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-enqueue.c.gcov.html
@@ -0,0 +1,233 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-enqueue.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-enqueue.c<span style="font-size: 80%;"> (source / <a href="secvar-test-enqueue.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntry">68</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;secvar_api_test.c&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : const char *secvar_test_name = &quot;enqueue&quot;;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : // Stub storage function, enqueue only cares that this succeeds</a>
+<a name="9"><span class="lineNum"> 9 </span> :<span class="lineCov"> 5 : static int temp_write_bank(struct list_head *bank, int section)</span></a>
+<a name="10"><span class="lineNum"> 10 </span> : : {</a>
+<a name="11"><span class="lineNum"> 11 </span> : : (void) bank, (void) section;</a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 5 : return OPAL_SUCCESS;</span></a>
+<a name="13"><span class="lineNum"> 13 </span> : : }</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 1 : int run_test(void)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> : : int64_t rc;</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : struct secvar *var;</a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 1 : char key[1024] = {0};</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 1 : uint64_t data_size = 128;</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : char *data = zalloc(data_size);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : secvar_storage.max_var_size = 1024;</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : /*** Bad cases first this time ***/</a>
+<a name="28"><span class="lineNum"> 28 </span> : : // No write bank hook set</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : secvar_storage.write_bank = NULL;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : memcpy(key, &quot;meow&quot;, 4); // ascii</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 4, data, data_size);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_HARDWARE);</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : // Set a stub bank writer, so the rest runs ok</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : secvar_storage.write_bank = temp_write_bank;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : // Parameter checks</a>
+<a name="38"><span class="lineNum"> 38 </span> : : // null key</a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(NULL, 5, data, data_size);</span></a>
+<a name="40"><span class="lineNum"> 40 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : ASSERT(list_empty(&amp;update_bank));</span></a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : // key is empty</a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : memset(key, 0, sizeof(key));</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 5, data, data_size);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : ASSERT(list_empty(&amp;update_bank));</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : // keylen is zero</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 0, data, data_size);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : ASSERT(list_empty(&amp;update_bank));</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : </a>
+<a name="54"><span class="lineNum"> 54 </span> : : // keylen is excessive</a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 5000, data, data_size);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 1 : ASSERT(list_empty(&amp;update_bank));</span></a>
+<a name="58"><span class="lineNum"> 58 </span> : : </a>
+<a name="59"><span class="lineNum"> 59 </span> : : // null data</a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 5, NULL, data_size);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : ASSERT(list_empty(&amp;update_bank));</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : </a>
+<a name="64"><span class="lineNum"> 64 </span> : : // data_size is excessive</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 5, data, 50000);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : ASSERT(list_empty(&amp;update_bank));</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : // data_size is zero</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 5, data, 0);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : ASSERT(list_empty(&amp;update_bank));</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> : : // secvar is disabled</a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : secvar_enabled = 0;</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 5, data, data_size);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_UNSUPPORTED);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : secvar_enabled = 1;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : // secvar is not ready</a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : secvar_ready = 0;</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 5, data, data_size);</span></a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_RESOURCE);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : secvar_ready = 1;</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> : : /*** Good cases ***/</a>
+<a name="88"><span class="lineNum"> 88 </span> : : // TODO: add data?</a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : memcpy(key, &quot;test&quot;, 4); // ascii</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 4, data, data_size);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;update_bank) == 1);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> : : </a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : memcpy(key, &quot;f\0o\0o\0b\0a\0r\0&quot;, 6*2); // &quot;unicode&quot;</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 6*2, data, data_size);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;update_bank) == 2);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : memcpy(key, &quot;meep&quot;, 4);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 4, data, data_size);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;update_bank) == 3); // should not increase</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> : : // Re-add the same variable</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : memcpy(key, &quot;meep&quot;, 4);</span></a>
+<a name="106"><span class="lineNum"> 106 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 4, data, data_size);</span></a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;update_bank) == 3); // should not increase</span></a>
+<a name="109"><span class="lineNum"> 109 </span> :<span class="lineCov"> 1 : var = list_tail(&amp;update_bank, struct secvar, link);</span></a>
+<a name="110"><span class="lineNum"> 110 </span> :<span class="lineCov"> 1 : ASSERT(!memcmp(var-&gt;key, key, 4)) // should be at end</span></a>
+<a name="111"><span class="lineNum"> 111 </span> : : </a>
+<a name="112"><span class="lineNum"> 112 </span> : : // Unstage the variable update</a>
+<a name="113"><span class="lineNum"> 113 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(key, 4, NULL, 0);</span></a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;update_bank) == 2);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> : : // Unstage a bogus variable update</a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : rc = secvar_enqueue(&quot;nada&quot;, 4, NULL, 0);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_EMPTY);</span></a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;update_bank) == 2);</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : </a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> : : // Empty the in-memory cache, and reload from &quot;pnor&quot;</a>
+<a name="124"><span class="lineNum"> 124 </span> : : // Removed to drop dependency on a storage backend</a>
+<a name="125"><span class="lineNum"> 125 </span> : : // Probably not actually necessary to test, that's the</a>
+<a name="126"><span class="lineNum"> 126 </span> : : // job of the storage backend tests</a>
+<a name="127"><span class="lineNum"> 127 </span> : : /*</a>
+<a name="128"><span class="lineNum"> 128 </span> : : clear_bank_list(&amp;update_bank);</a>
+<a name="129"><span class="lineNum"> 129 </span> : : ASSERT(list_empty(&amp;update_bank));</a>
+<a name="130"><span class="lineNum"> 130 </span> : : secvar_storage.load_bank(&amp;update_bank, SECVAR_UPDATE_BANK);</a>
+<a name="131"><span class="lineNum"> 131 </span> : : printf(&quot;list_length = %d\n&quot;, list_length(&amp;update_bank));</a>
+<a name="132"><span class="lineNum"> 132 </span> : : ASSERT(list_length(&amp;update_bank) == 2);</a>
+<a name="133"><span class="lineNum"> 133 </span> : : </a>
+<a name="134"><span class="lineNum"> 134 </span> : : node = list_top(&amp;update_bank, struct secvar_node, link);</a>
+<a name="135"><span class="lineNum"> 135 </span> : : ASSERT(node);</a>
+<a name="136"><span class="lineNum"> 136 </span> : : ASSERT(!memcmp(node-&gt;var-&gt;key, &quot;test&quot;, 4));</a>
+<a name="137"><span class="lineNum"> 137 </span> : : node = list_next(&amp;update_bank, node, link);</a>
+<a name="138"><span class="lineNum"> 138 </span> : : ASSERT(node);</a>
+<a name="139"><span class="lineNum"> 139 </span> : : ASSERT(!memcmp(node-&gt;var-&gt;key, &quot;f\0o\0o\0b\0a\0r\0&quot;, 6*2));</a>
+<a name="140"><span class="lineNum"> 140 </span> : : */</a>
+<a name="141"><span class="lineNum"> 141 </span> : : </a>
+<a name="142"><span class="lineNum"> 142 </span> : : /*** ONE more bad case... ***/</a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> :<span class="lineCov"> 1 : free(data);</span></a>
+<a name="145"><span class="lineNum"> 145 </span> : : </a>
+<a name="146"><span class="lineNum"> 146 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="147"><span class="lineNum"> 147 </span> : : </a>
+<a name="148"><span class="lineNum"> 148 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-getvar.c.func-sort-c.html b/coverage-report/libstb/secvar/test/secvar-test-getvar.c.func-sort-c.html
new file mode 100644
index 0000000..cf426f0
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-getvar.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-getvar.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-getvar.c<span style="font-size: 80%;"> (<a href="secvar-test-getvar.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar-test-getvar.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-getvar.c.gcov.html#11">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-getvar.c.func.html b/coverage-report/libstb/secvar/test/secvar-test-getvar.c.func.html
new file mode 100644
index 0000000..18bc0eb
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-getvar.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-getvar.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-getvar.c<span style="font-size: 80%;"> (<a href="secvar-test-getvar.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar-test-getvar.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-getvar.c.gcov.html#11">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-getvar.c.gcov.html b/coverage-report/libstb/secvar/test/secvar-test-getvar.c.gcov.html
new file mode 100644
index 0000000..c636411
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-getvar.c.gcov.html
@@ -0,0 +1,174 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-getvar.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-getvar.c<span style="font-size: 80%;"> (source / <a href="secvar-test-getvar.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntry">47</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;secvar_api_test.c&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : const char *secvar_test_name = &quot;getvar&quot;;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : // Run tests on the less obvious features of secvar_get</a>
+<a name="9"><span class="lineNum"> 9 </span> : : // Includes:</a>
+<a name="10"><span class="lineNum"> 10 </span> : : // - Partial reads</a>
+<a name="11"><span class="lineNum"> 11 </span> : : // - Size queries (NULL buffer)</a>
+<a name="12"><span class="lineNum"> 12 </span> : : //int run_test_helper(uint64_t bank_enum)</a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 1 : int run_test(void)</span></a>
+<a name="14"><span class="lineNum"> 14 </span> : : {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : int64_t rc;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : uint64_t size;</a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 1 : char *temp = zalloc(100);</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 1 : char key[1024] = {0};</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> : : struct secvar *var;</a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 1 : size_t data_size = sizeof(&quot;foobar&quot;);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 1 : char *data = zalloc(data_size);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1 : uint64_t key_len = 4;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : memcpy(data, &quot;foobar&quot;, data_size);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : memcpy(key, &quot;test&quot;, 4);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> : : // List should be empty at start</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, temp, &amp;size);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_EMPTY);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;variable_bank) == 0);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : // Manually add variables, and check get_variable call</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1 : var = new_secvar(key, key_len, data, data_size, 0);</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;var-&gt;link);</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;variable_bank) == 1);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : // TEST ONLY DATA</a>
+<a name="40"><span class="lineNum"> 40 </span> : : // Test actual variable get</a>
+<a name="41"><span class="lineNum"> 41 </span> :<span class="lineCov"> 1 : size = data_size;</span></a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, temp, &amp;size);</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : ASSERT(0 == memcmp(&quot;foobar&quot;, var-&gt;data, size));</span></a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : // Test buffer too small</a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : size = data_size / 2;</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : memset(temp, 0, 100);</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, temp, &amp;size);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARTIAL);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 1 : size = 0;</span></a>
+<a name="53"><span class="lineNum"> 53 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, temp, &amp;size);</span></a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARTIAL);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : ASSERT(size == data_size);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> : : // Test size query w/ no data</a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : size = 0;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, NULL, &amp;size);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : ASSERT(size == data_size);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : /**** Error/Bad param cases ****/</a>
+<a name="64"><span class="lineNum"> 64 </span> : : // NULL key</a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : rc = secvar_get(NULL, key_len, data, &amp;data_size);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> : : // zero key_len</a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, 0, data, &amp;data_size);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="70"><span class="lineNum"> 70 </span> : : // NULL size, valid data</a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, data, NULL);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="73"><span class="lineNum"> 73 </span> : : </a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : secvar_enabled = 0;</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, data, &amp;data_size);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_UNSUPPORTED);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : secvar_enabled = 1;</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : secvar_ready = 0;</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : rc = secvar_get(key, key_len, data, &amp;data_size);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_RESOURCE);</span></a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1 : secvar_ready = 1;</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : </a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : free(data);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : free(temp);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="88"><span class="lineNum"> 88 </span> : : }</a>
+<a name="89"><span class="lineNum"> 89 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func-sort-c.html b/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func-sort-c.html
new file mode 100644
index 0000000..86d26b8
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-nextvar.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-nextvar.c<span style="font-size: 80%;"> (<a href="secvar-test-nextvar.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar-test-nextvar.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-nextvar.c.gcov.html#6">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func.html b/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func.html
new file mode 100644
index 0000000..f4ca12f
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-nextvar.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-nextvar.c<span style="font-size: 80%;"> (<a href="secvar-test-nextvar.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar-test-nextvar.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-nextvar.c.gcov.html#6">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.gcov.html b/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.gcov.html
new file mode 100644
index 0000000..af23614
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-nextvar.c.gcov.html
@@ -0,0 +1,191 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-nextvar.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-nextvar.c<span style="font-size: 80%;"> (source / <a href="secvar-test-nextvar.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntry">61</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;secvar_api_test.c&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : const char *secvar_test_name = &quot;nextvar&quot;;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> :<span class="lineCov"> 1 : int run_test(void)</span></a>
+<a name="9"><span class="lineNum"> 9 </span> : : {</a>
+<a name="10"><span class="lineNum"> 10 </span> : : int64_t rc;</a>
+<a name="11"><span class="lineNum"> 11 </span> : : </a>
+<a name="12"><span class="lineNum"> 12 </span> : : struct secvar *tmpvar;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 1 : char key[1024] = {0};</span></a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 1 : uint64_t key_len = 16;</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> : : // Load up the bank with some variables.</a>
+<a name="18"><span class="lineNum"> 18 </span> : : // If these fail, we have bigger issues.</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;variable_bank) == 0);</span></a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 1 : tmpvar = new_secvar(&quot;test1&quot;, 6, NULL, 0, 0);</span></a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;tmpvar-&gt;link);</span></a>
+<a name="22"><span class="lineNum"> 22 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;variable_bank) == 1);</span></a>
+<a name="23"><span class="lineNum"> 23 </span> : : </a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 1 : tmpvar = new_secvar(&quot;test2&quot;, 5, NULL, 0, 0); // ascii w/o null</span></a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;tmpvar-&gt;link);</span></a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;variable_bank) == 2);</span></a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 1 : tmpvar = new_secvar((const char*) L&quot;test3&quot;, 5*2, NULL, 0, 0); // wide char &quot;unicode&quot;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;tmpvar-&gt;link);</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : ASSERT(list_length(&amp;variable_bank) == 3);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : // Test sequential nexts</a>
+<a name="33"><span class="lineNum"> 33 </span> : : // first item</a>
+<a name="34"><span class="lineNum"> 34 </span> :<span class="lineCov"> 1 : memset(key, 0, sizeof(key));</span></a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : key_len = 0;</span></a>
+<a name="36"><span class="lineNum"> 36 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, sizeof(key));</span></a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="38"><span class="lineNum"> 38 </span> :<span class="lineCov"> 1 : ASSERT(key_len == 6);</span></a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 1 : ASSERT(!memcmp(key, &quot;test1&quot;, key_len));</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : </a>
+<a name="41"><span class="lineNum"> 41 </span> : : // second item</a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, sizeof(key));</span></a>
+<a name="43"><span class="lineNum"> 43 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 1 : ASSERT(key_len == 5);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 1 : ASSERT(!memcmp(key, &quot;test2&quot;, key_len));</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> : : // last item</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, sizeof(key));</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : ASSERT(key_len == 5*2);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : ASSERT(!memcmp(key, L&quot;test3&quot;, key_len));</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : // end-of-list</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, sizeof(key));</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_EMPTY);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> : : </a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 1 : memset(key, 0, sizeof(key));</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : /*** Time for a break to test bad parameters ***/</a>
+<a name="60"><span class="lineNum"> 60 </span> : : // null key</a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(NULL, &amp;key_len, 1024);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> : : // Size too small</a>
+<a name="64"><span class="lineNum"> 64 </span> :<span class="lineCov"> 1 : key_len = 0;</span></a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, 1);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARTIAL);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : ASSERT(key_len == 6);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : // Supplied key length is larger than the buffer</a>
+<a name="69"><span class="lineNum"> 69 </span> :<span class="lineCov"> 1 : key_len = 6;</span></a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, 1);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> : : // NULL key_len pointer</a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, NULL, 1024);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : // NULL key_len pointer</a>
+<a name="78"><span class="lineNum"> 78 </span> :<span class="lineCov"> 1 : key_len = ~0;</span></a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, 1024);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : // zero key_len</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : key_len = 0;</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, 0);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> : : // Non-existing previous variable</a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : key_len = 1024;</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : memcpy(key, L&quot;foobar&quot;, 7*2);</span></a>
+<a name="90"><span class="lineNum"> 90 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, 1024);</span></a>
+<a name="91"><span class="lineNum"> 91 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_PARAMETER);</span></a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : secvar_enabled = 0;</span></a>
+<a name="94"><span class="lineNum"> 94 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, 1024);</span></a>
+<a name="95"><span class="lineNum"> 95 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_UNSUPPORTED);</span></a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : secvar_enabled = 1;</span></a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> :<span class="lineCov"> 1 : secvar_ready = 0;</span></a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : rc = secvar_get_next(key, &amp;key_len, 1024);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_RESOURCE);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> :<span class="lineCov"> 1 : secvar_ready = 1;</span></a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> :<span class="lineCov"> 1 : clear_bank_list(&amp;variable_bank);</span></a>
+<a name="104"><span class="lineNum"> 104 </span> : : </a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func-sort-c.html b/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func-sort-c.html
new file mode 100644
index 0000000..ba871dc
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func-sort-c.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-secboot-tpm.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-secboot-tpm.c<span style="font-size: 80%;"> (<a href="secvar-test-secboot-tpm.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">63</td>
+ <td class="headerCovTableEntryHi">98.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar-test-secboot-tpm.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#25">flash_secboot_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#121">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#40">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#33">secvar_check_physical_presence</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#13">flash_secboot_read</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#19">flash_secboot_write</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func.html b/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func.html
new file mode 100644
index 0000000..88ef379
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.func.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-secboot-tpm.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-secboot-tpm.c<span style="font-size: 80%;"> (<a href="secvar-test-secboot-tpm.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">63</td>
+ <td class="headerCovTableEntryHi">98.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar-test-secboot-tpm.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#25">flash_secboot_info</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#13">flash_secboot_read</a></td>
+ <td class="coverFnHi">2</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#19">flash_secboot_write</a></td>
+ <td class="coverFnHi">12</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#121">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#40">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-secboot-tpm.c.gcov.html#33">secvar_check_physical_presence</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.gcov.html b/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.gcov.html
new file mode 100644
index 0000000..fdb210d
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-secboot-tpm.c.gcov.html
@@ -0,0 +1,226 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-secboot-tpm.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-secboot-tpm.c<span style="font-size: 80%;"> (source / <a href="secvar-test-secboot-tpm.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">62</td>
+ <td class="headerCovTableEntry">63</td>
+ <td class="headerCovTableEntryHi">98.4 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2020 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #define TPM_SKIBOOT</a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;secvar_common_test.c&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &quot;../storage/secboot_tpm.c&quot;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &quot;../storage/fakenv_ops.c&quot;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &quot;../secvar_util.c&quot;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : char *secboot_buffer;</a>
+<a name="10"><span class="lineNum"> 10 </span> : : </a>
+<a name="11"><span class="lineNum"> 11 </span> : : #define ARBITRARY_SECBOOT_SIZE 128000</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> : : const char *secvar_test_name = &quot;secboot_tpm&quot;;</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 2 : int flash_secboot_read(void *dst, uint32_t src, uint32_t len)</span></a>
+<a name="16"><span class="lineNum"> 16 </span> : : {</a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 2 : memcpy(dst, secboot_buffer + src, len);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 2 : return 0;</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : }</a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineCov"> 12 : int flash_secboot_write(uint32_t dst, void *src, uint32_t len)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> :<span class="lineCov"> 12 : memcpy(secboot_buffer + dst, src, len);</span></a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineCov"> 12 : return 0;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : }</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineCov"> 1 : int flash_secboot_info(uint32_t *total_size)</span></a>
+<a name="28"><span class="lineNum"> 28 </span> : : {</a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineCov"> 1 : *total_size = ARBITRARY_SECBOOT_SIZE;</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="31"><span class="lineNum"> 31 </span> : : }</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : /* Toggle this to test the physical presence resetting */</a>
+<a name="34"><span class="lineNum"> 34 </span> : : bool phys_presence = false;</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 1 : bool secvar_check_physical_presence(void)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : {</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 1 : return phys_presence;</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : }</a>
+<a name="39"><span class="lineNum"> 39 </span> : : </a>
+<a name="40"><span class="lineNum"> 40 </span> : : struct platform platform;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> :<span class="lineCov"> 1 : int run_test(void)</span></a>
+<a name="43"><span class="lineNum"> 43 </span> : : {</a>
+<a name="44"><span class="lineNum"> 44 </span> : : int rc;</a>
+<a name="45"><span class="lineNum"> 45 </span> : : struct secvar *tmp;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 1 : secboot_buffer = zalloc(ARBITRARY_SECBOOT_SIZE);</span></a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : // Initialize and format the storage</a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_store_init();</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : // Load the just-formatted empty section</a>
+<a name="54"><span class="lineNum"> 54 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_load_bank(&amp;variable_bank, SECVAR_VARIABLE_BANK);</span></a>
+<a name="55"><span class="lineNum"> 55 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;variable_bank));</span></a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : // Add some test variables</a>
+<a name="59"><span class="lineNum"> 59 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;test&quot;, 5, &quot;testdata&quot;, 8, 0);</span></a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;tmp-&gt;link);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;foo&quot;, 3, &quot;moredata&quot;, 8, 0);</span></a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;tmp-&gt;link);</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> : : // Add a priority variable, ensure that works</a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;priority&quot;, 9, &quot;meep&quot;, 4, SECVAR_FLAG_PROTECTED);</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;tmp-&gt;link);</span></a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : // Add another one</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 1 : tmp = new_secvar(&quot;priority2&quot;, 9, &quot;meep&quot;, 4, SECVAR_FLAG_PROTECTED);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> :<span class="lineCov"> 1 : list_add_tail(&amp;variable_bank, &amp;tmp-&gt;link);</span></a>
+<a name="72"><span class="lineNum"> 72 </span> : : </a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 1 : ASSERT(4 == list_length(&amp;variable_bank));</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : </a>
+<a name="75"><span class="lineNum"> 75 </span> : : // Write the bank</a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_write_bank(&amp;variable_bank, SECVAR_VARIABLE_BANK);</span></a>
+<a name="77"><span class="lineNum"> 77 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="78"><span class="lineNum"> 78 </span> : : // should write to bank 1 first</a>
+<a name="79"><span class="lineNum"> 79 </span> :<span class="lineCov"> 1 : ASSERT(*((uint64_t*) secboot_image-&gt;bank[1]) != 0llu);</span></a>
+<a name="80"><span class="lineNum"> 80 </span> :<span class="lineCov"> 1 : ASSERT(*((uint64_t*) secboot_image-&gt;bank[0]) == 0llu);</span></a>
+<a name="81"><span class="lineNum"> 81 </span> : : </a>
+<a name="82"><span class="lineNum"> 82 </span> : : // Clear the variable list</a>
+<a name="83"><span class="lineNum"> 83 </span> :<span class="lineCov"> 1 : clear_bank_list(&amp;variable_bank);</span></a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1 : ASSERT(0 == list_length(&amp;variable_bank));</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : </a>
+<a name="86"><span class="lineNum"> 86 </span> : : // Load the bank</a>
+<a name="87"><span class="lineNum"> 87 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_load_bank(&amp;variable_bank, SECVAR_VARIABLE_BANK);</span></a>
+<a name="88"><span class="lineNum"> 88 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="89"><span class="lineNum"> 89 </span> :<span class="lineCov"> 1 : ASSERT(4 == list_length(&amp;variable_bank));</span></a>
+<a name="90"><span class="lineNum"> 90 </span> : : </a>
+<a name="91"><span class="lineNum"> 91 </span> : : // Change a variable</a>
+<a name="92"><span class="lineNum"> 92 </span> :<span class="lineCov"> 1 : tmp = list_tail(&amp;variable_bank, struct secvar, link);</span></a>
+<a name="93"><span class="lineNum"> 93 </span> :<span class="lineCov"> 1 : memcpy(tmp-&gt;data, &quot;somethin&quot;, 8);</span></a>
+<a name="94"><span class="lineNum"> 94 </span> : : </a>
+<a name="95"><span class="lineNum"> 95 </span> : : // Write the bank</a>
+<a name="96"><span class="lineNum"> 96 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_write_bank(&amp;variable_bank, SECVAR_VARIABLE_BANK);</span></a>
+<a name="97"><span class="lineNum"> 97 </span> :<span class="lineCov"> 1 : ASSERT(OPAL_SUCCESS == rc);</span></a>
+<a name="98"><span class="lineNum"> 98 </span> : : // should have data in both now</a>
+<a name="99"><span class="lineNum"> 99 </span> :<span class="lineCov"> 1 : ASSERT(*((uint64_t*) secboot_image-&gt;bank[0]) != 0llu);</span></a>
+<a name="100"><span class="lineNum"> 100 </span> :<span class="lineCov"> 1 : ASSERT(*((uint64_t*) secboot_image-&gt;bank[1]) != 0llu);</span></a>
+<a name="101"><span class="lineNum"> 101 </span> : : </a>
+<a name="102"><span class="lineNum"> 102 </span> :<span class="lineCov"> 1 : clear_bank_list(&amp;variable_bank);</span></a>
+<a name="103"><span class="lineNum"> 103 </span> : : </a>
+<a name="104"><span class="lineNum"> 104 </span> : : // Tamper with pnor, hash check should catch this</a>
+<a name="105"><span class="lineNum"> 105 </span> :<span class="lineCov"> 1 : secboot_image-&gt;bank[0][0] = ~secboot_image-&gt;bank[0][0];</span></a>
+<a name="106"><span class="lineNum"> 106 </span> : : </a>
+<a name="107"><span class="lineNum"> 107 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_load_bank(&amp;variable_bank, SECVAR_VARIABLE_BANK);</span></a>
+<a name="108"><span class="lineNum"> 108 </span> :<span class="lineCov"> 1 : ASSERT(rc != OPAL_SUCCESS); // TODO: permission?</span></a>
+<a name="109"><span class="lineNum"> 109 </span> : : </a>
+<a name="110"><span class="lineNum"> 110 </span> : : // Fix it back...</a>
+<a name="111"><span class="lineNum"> 111 </span> :<span class="lineCov"> 1 : secboot_image-&gt;bank[0][0] = ~secboot_image-&gt;bank[0][0];</span></a>
+<a name="112"><span class="lineNum"> 112 </span> : : </a>
+<a name="113"><span class="lineNum"> 113 </span> : : // Should be ok again</a>
+<a name="114"><span class="lineNum"> 114 </span> :<span class="lineCov"> 1 : rc = secboot_tpm_load_bank(&amp;variable_bank, SECVAR_VARIABLE_BANK);</span></a>
+<a name="115"><span class="lineNum"> 115 </span> :<span class="lineCov"> 1 : ASSERT(rc == OPAL_SUCCESS);</span></a>
+<a name="116"><span class="lineNum"> 116 </span> : : </a>
+<a name="117"><span class="lineNum"> 117 </span> :<span class="lineCov"> 1 : clear_bank_list(&amp;variable_bank);</span></a>
+<a name="118"><span class="lineNum"> 118 </span> :<span class="lineCov"> 1 : free(secboot_buffer);</span></a>
+<a name="119"><span class="lineNum"> 119 </span> : : </a>
+<a name="120"><span class="lineNum"> 120 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="124"><span class="lineNum"> 124 </span> : : {</a>
+<a name="125"><span class="lineNum"> 125 </span> :<span class="lineCov"> 1 : int rc = 0;</span></a>
+<a name="126"><span class="lineNum"> 126 </span> : : </a>
+<a name="127"><span class="lineNum"> 127 </span> :<span class="lineCov"> 1 : list_head_init(&amp;variable_bank);</span></a>
+<a name="128"><span class="lineNum"> 128 </span> : : </a>
+<a name="129"><span class="lineNum"> 129 </span> :<span class="lineCov"> 1 : rc = run_test();</span></a>
+<a name="130"><span class="lineNum"> 130 </span> : : </a>
+<a name="131"><span class="lineNum"> 131 </span> :<span class="lineCov"> 1 : if (rc)</span></a>
+<a name="132"><span class="lineNum"> 132 </span> :<span class="lineNoCov"> 0 : printf(COLOR_RED &quot;FAILED&quot; COLOR_RESET &quot;\n&quot;);</span></a>
+<a name="133"><span class="lineNum"> 133 </span> : : else</a>
+<a name="134"><span class="lineNum"> 134 </span> :<span class="lineCov"> 1 : printf(COLOR_GREEN &quot;OK&quot; COLOR_RESET &quot;\n&quot;);</span></a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> :<span class="lineCov"> 1 : free(tpmnv_vars_image);</span></a>
+<a name="137"><span class="lineNum"> 137 </span> :<span class="lineCov"> 1 : free(tpmnv_control_image);</span></a>
+<a name="138"><span class="lineNum"> 138 </span> :<span class="lineCov"> 1 : free(secboot_image);</span></a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> :<span class="lineCov"> 1 : return rc;</span></a>
+<a name="141"><span class="lineNum"> 141 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-void.c.func-sort-c.html b/coverage-report/libstb/secvar/test/secvar-test-void.c.func-sort-c.html
new file mode 100644
index 0000000..b588d6b
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-void.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-void.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-void.c<span style="font-size: 80%;"> (<a href="secvar-test-void.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar-test-void.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-void.c.gcov.html#6">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-void.c.func.html b/coverage-report/libstb/secvar/test/secvar-test-void.c.func.html
new file mode 100644
index 0000000..a4b66b8
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-void.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-void.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-void.c<span style="font-size: 80%;"> (<a href="secvar-test-void.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar-test-void.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar-test-void.c.gcov.html#6">run_test</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar-test-void.c.gcov.html b/coverage-report/libstb/secvar/test/secvar-test-void.c.gcov.html
new file mode 100644
index 0000000..9bb892b
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar-test-void.c.gcov.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar-test-void.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar-test-void.c<span style="font-size: 80%;"> (source / <a href="secvar-test-void.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &quot;secvar_api_test.c&quot;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : const char *secvar_test_name = &quot;void&quot;;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> :<span class="lineCov"> 1 : int run_test()</span></a>
+<a name="9"><span class="lineNum"> 9 </span> : : {</a>
+<a name="10"><span class="lineNum"> 10 </span> : : // Do nothing... ensure testing framework is...working.</a>
+<a name="11"><span class="lineNum"> 11 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="12"><span class="lineNum"> 12 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar_api_test.c.func-sort-c.html b/coverage-report/libstb/secvar/test/secvar_api_test.c.func-sort-c.html
new file mode 100644
index 0000000..a1c0b32
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar_api_test.c.func-sort-c.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar_api_test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar_api_test.c<span style="font-size: 80%;"> (<a href="secvar_api_test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">94.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="secvar_api_test.c.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#46">main</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#15">secvar_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#23">secvar_get_next</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#33">secvar_enqueue</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar_api_test.c.func.html b/coverage-report/libstb/secvar/test/secvar_api_test.c.func.html
new file mode 100644
index 0000000..18c779b
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar_api_test.c.func.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar_api_test.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar_api_test.c<span style="font-size: 80%;"> (<a href="secvar_api_test.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">94.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="secvar_api_test.c.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#46">main</a></td>
+ <td class="coverFnHi">4</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#33">secvar_enqueue</a></td>
+ <td class="coverFnHi">16</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#15">secvar_get</a></td>
+ <td class="coverFnHi">10</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="secvar_api_test.c.gcov.html#23">secvar_get_next</a></td>
+ <td class="coverFnHi">13</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/secvar/test/secvar_api_test.c.gcov.html b/coverage-report/libstb/secvar/test/secvar_api_test.c.gcov.html
new file mode 100644
index 0000000..43f93f5
--- /dev/null
+++ b/coverage-report/libstb/secvar/test/secvar_api_test.c.gcov.html
@@ -0,0 +1,163 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/secvar/test/secvar_api_test.c</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">libstb/secvar/test</a> - secvar_api_test.c<span style="font-size: 80%;"> (source / <a href="secvar_api_test.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">18</td>
+ <td class="headerCovTableEntry">19</td>
+ <td class="headerCovTableEntryHi">94.7 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2019 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : #include &quot;secvar_common_test.c&quot;</a>
+<a name="4"><span class="lineNum"> 4 </span> : : </a>
+<a name="5"><span class="lineNum"> 5 </span> : : // Hack to include the code we actually want to test here...</a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &quot;../secvar_api.c&quot;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &quot;../secvar_util.c&quot;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : // Stuff from secvar_main that we need, but not enough to</a>
+<a name="10"><span class="lineNum"> 10 </span> : : // include that file</a>
+<a name="11"><span class="lineNum"> 11 </span> : : int secvar_enabled = 0;</a>
+<a name="12"><span class="lineNum"> 12 </span> : : int secvar_ready = 0;</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : /**** Helper wrappers, so the caller doesn't have to cast ****/</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 10 : static int64_t secvar_get(const char *k_key, uint64_t k_key_len, void *k_data, uint64_t *k_data_size)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> : : {</a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 10 : return opal_secvar_get( k_key,</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : k_key_len,</a>
+<a name="21"><span class="lineNum"> 21 </span> : : k_data,</a>
+<a name="22"><span class="lineNum"> 22 </span> : : k_data_size);</a>
+<a name="23"><span class="lineNum"> 23 </span> : : }</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> :<span class="lineCov"> 13 : static int64_t secvar_get_next(char *k_key, uint64_t *k_key_len, uint64_t k_key_size)</span></a>
+<a name="26"><span class="lineNum"> 26 </span> : : {</a>
+<a name="27"><span class="lineNum"> 27 </span> : : </a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineCov"> 13 : return opal_secvar_get_next( k_key,</span></a>
+<a name="29"><span class="lineNum"> 29 </span> : : k_key_len,</a>
+<a name="30"><span class="lineNum"> 30 </span> : : k_key_size);</a>
+<a name="31"><span class="lineNum"> 31 </span> : : }</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : </a>
+<a name="34"><span class="lineNum"> 34 </span> : : </a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineCov"> 16 : static int64_t secvar_enqueue(const char *k_key, uint64_t k_key_len, void *k_data, uint64_t k_data_size)</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : {</a>
+<a name="37"><span class="lineNum"> 37 </span> :<span class="lineCov"> 16 : return opal_secvar_enqueue_update(k_key,</span></a>
+<a name="38"><span class="lineNum"> 38 </span> : : k_key_len,</a>
+<a name="39"><span class="lineNum"> 39 </span> : : k_data,</a>
+<a name="40"><span class="lineNum"> 40 </span> : : k_data_size);</a>
+<a name="41"><span class="lineNum"> 41 </span> : : </a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : </a>
+<a name="46"><span class="lineNum"> 46 </span> : : // Entry point</a>
+<a name="47"><span class="lineNum"> 47 </span> : : // TODO: do some real argparsing</a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 4 : int main(int argc, char **argv)</span></a>
+<a name="49"><span class="lineNum"> 49 </span> : : {</a>
+<a name="50"><span class="lineNum"> 50 </span> : : int ret;</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> : : (void) secvar_get;</a>
+<a name="53"><span class="lineNum"> 53 </span> : : (void) secvar_get_next;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : (void) secvar_enqueue;</a>
+<a name="55"><span class="lineNum"> 55 </span> : : (void) argc;</a>
+<a name="56"><span class="lineNum"> 56 </span> : : (void) argv;</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 4 : secvar_enabled = 1;</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+<a name="60"><span class="lineNum"> 60 </span> :<span class="lineCov"> 4 : list_head_init(&amp;variable_bank);</span></a>
+<a name="61"><span class="lineNum"> 61 </span> :<span class="lineCov"> 4 : list_head_init(&amp;update_bank);</span></a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> :<span class="lineCov"> 4 : secvar_ready = 1;</span></a>
+<a name="64"><span class="lineNum"> 64 </span> : : </a>
+<a name="65"><span class="lineNum"> 65 </span> :<span class="lineCov"> 4 : printf(&quot;Running test '%s'...&quot;, secvar_test_name);</span></a>
+<a name="66"><span class="lineNum"> 66 </span> :<span class="lineCov"> 4 : ret = run_test();</span></a>
+<a name="67"><span class="lineNum"> 67 </span> :<span class="lineCov"> 4 : if (ret)</span></a>
+<a name="68"><span class="lineNum"> 68 </span> :<span class="lineNoCov"> 0 : printf(COLOR_RED &quot;FAILED&quot; COLOR_RESET &quot;\n&quot;);</span></a>
+<a name="69"><span class="lineNum"> 69 </span> : : else</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 4 : printf(COLOR_GREEN &quot;OK&quot; COLOR_RESET &quot;\n&quot;);</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : </a>
+<a name="72"><span class="lineNum"> 72 </span> : : // Clean up for the test cases</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 4 : clear_bank_list(&amp;variable_bank);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> :<span class="lineCov"> 4 : clear_bank_list(&amp;update_bank);</span></a>
+<a name="75"><span class="lineNum"> 75 </span> : : </a>
+<a name="76"><span class="lineNum"> 76 </span> :<span class="lineCov"> 4 : return ret;</span></a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/test/index-sort-b.html b/coverage-report/libstb/test/index-sort-b.html
new file mode 100644
index 0000000..4225e53
--- /dev/null
+++ b/coverage-report/libstb/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stb-container.c.gcov.html">run-stb-container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/test/index-sort-f.html b/coverage-report/libstb/test/index-sort-f.html
new file mode 100644
index 0000000..e71c466
--- /dev/null
+++ b/coverage-report/libstb/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stb-container.c.gcov.html">run-stb-container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/test/index-sort-l.html b/coverage-report/libstb/test/index-sort-l.html
new file mode 100644
index 0000000..b4ab503
--- /dev/null
+++ b/coverage-report/libstb/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stb-container.c.gcov.html">run-stb-container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/test/index.html b/coverage-report/libstb/test/index.html
new file mode 100644
index 0000000..17a7197
--- /dev/null
+++ b/coverage-report/libstb/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/test</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - libstb/test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="run-stb-container.c.gcov.html">run-stb-container.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">9 / 9</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/test/run-stb-container.c.func-sort-c.html b/coverage-report/libstb/test/run-stb-container.c.func-sort-c.html
new file mode 100644
index 0000000..39a676e
--- /dev/null
+++ b/coverage-report/libstb/test/run-stb-container.c.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/test/run-stb-container.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/test</a> - run-stb-container.c<span style="font-size: 80%;"> (<a href="run-stb-container.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="run-stb-container.c.func.html"><img src="../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-stb-container.c.gcov.html#8">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/test/run-stb-container.c.func.html b/coverage-report/libstb/test/run-stb-container.c.func.html
new file mode 100644
index 0000000..3112457
--- /dev/null
+++ b/coverage-report/libstb/test/run-stb-container.c.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/test/run-stb-container.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/test</a> - run-stb-container.c<span style="font-size: 80%;"> (<a href="run-stb-container.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="run-stb-container.c.func-sort-c.html"><img src="../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="run-stb-container.c.gcov.html#8">main</a></td>
+ <td class="coverFnHi">1</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/libstb/test/run-stb-container.c.gcov.html b/coverage-report/libstb/test/run-stb-container.c.gcov.html
new file mode 100644
index 0000000..92f2d88
--- /dev/null
+++ b/coverage-report/libstb/test/run-stb-container.c.gcov.html
@@ -0,0 +1,106 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - libstb/test/run-stb-container.c</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../index.html">top level</a> - <a href="index.html">libstb/test</a> - run-stb-container.c<span style="font-size: 80%;"> (source / <a href="run-stb-container.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntry">9</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2016 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;config.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : </a>
+<a name="6"><span class="lineNum"> 6 </span> : : #include &quot;../container.c&quot;</a>
+<a name="7"><span class="lineNum"> 7 </span> : : </a>
+<a name="8"><span class="lineNum"> 8 </span> : : #include &lt;assert.h&gt;</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> :<span class="lineCov"> 1 : int main(void)</span></a>
+<a name="11"><span class="lineNum"> 11 </span> : : {</a>
+<a name="12"><span class="lineNum"> 12 </span> :<span class="lineCov"> 1 : ROM_container_raw *c = malloc(SECURE_BOOT_HEADERS_SIZE);</span></a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 1 : assert(stb_is_container(NULL, 0) == false);</span></a>
+<a name="14"><span class="lineNum"> 14 </span> :<span class="lineCov"> 1 : assert(stb_is_container(NULL, SECURE_BOOT_HEADERS_SIZE) == false);</span></a>
+<a name="15"><span class="lineNum"> 15 </span> :<span class="lineCov"> 1 : c-&gt;magic_number = cpu_to_be32(ROM_MAGIC_NUMBER + 1);</span></a>
+<a name="16"><span class="lineNum"> 16 </span> :<span class="lineCov"> 1 : assert(stb_is_container(c, SECURE_BOOT_HEADERS_SIZE) == false);</span></a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 1 : c-&gt;magic_number = cpu_to_be32(ROM_MAGIC_NUMBER);</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 1 : assert(stb_is_container(c, SECURE_BOOT_HEADERS_SIZE) == true);</span></a>
+<a name="19"><span class="lineNum"> 19 </span> : : </a>
+<a name="20"><span class="lineNum"> 20 </span> :<span class="lineCov"> 1 : return 0;</span></a>
+<a name="21"><span class="lineNum"> 21 </span> : : }</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/ruby.png b/coverage-report/ruby.png
new file mode 100644
index 0000000..991b6d4
--- /dev/null
+++ b/coverage-report/ruby.png
Binary files differ
diff --git a/coverage-report/snow.png b/coverage-report/snow.png
new file mode 100644
index 0000000..2cdae10
--- /dev/null
+++ b/coverage-report/snow.png
Binary files differ
diff --git a/coverage-report/test/dt_common.c.func-sort-c.html b/coverage-report/test/dt_common.c.func-sort-c.html
new file mode 100644
index 0000000..a3d07d4
--- /dev/null
+++ b/coverage-report/test/dt_common.c.func-sort-c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - test/dt_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">test</a> - dt_common.c<span style="font-size: 80%;"> (<a href="dt_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="dt_common.c.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dt_common.c.gcov.html#19">dump_val</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dt_common.c.gcov.html#37">dump_dt</a></td>
+ <td class="coverFnHi">463</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dt_common.c.gcov.html#11">indent_num</a></td>
+ <td class="coverFnHi">463</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/test/dt_common.c.func.html b/coverage-report/test/dt_common.c.func.html
new file mode 100644
index 0000000..cc9209f
--- /dev/null
+++ b/coverage-report/test/dt_common.c.func.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - test/dt_common.c - functions</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">test</a> - dt_common.c<span style="font-size: 80%;"> (<a href="dt_common.c.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="dt_common.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dt_common.c.gcov.html#37">dump_dt</a></td>
+ <td class="coverFnHi">463</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dt_common.c.gcov.html#19">dump_val</a></td>
+ <td class="coverFnLo">0</td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="dt_common.c.gcov.html#11">indent_num</a></td>
+ <td class="coverFnHi">463</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/test/dt_common.c.gcov.html b/coverage-report/test/dt_common.c.gcov.html
new file mode 100644
index 0000000..0f2a40a
--- /dev/null
+++ b/coverage-report/test/dt_common.c.gcov.html
@@ -0,0 +1,144 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - test/dt_common.c</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">test</a> - dt_common.c<span style="font-size: 80%;"> (source / <a href="dt_common.c.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later</a>
+<a name="2"><span class="lineNum"> 2 </span> : : /* Copyright 2015-2017 IBM Corp. */</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;skiboot.h&gt;</a>
+<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;stdlib.h&gt;</a>
+<a name="6"><span class="lineNum"> 6 </span> : : </a>
+<a name="7"><span class="lineNum"> 7 </span> : : #include &quot;../include/device.h&quot;</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : /* dump_dt() is used in hdata/test/hdata_to_dt.c and core/test/run-device.c</a>
+<a name="10"><span class="lineNum"> 10 </span> : : * this file is directly #included in both</a>
+<a name="11"><span class="lineNum"> 11 </span> : : */</a>
+<a name="12"><span class="lineNum"> 12 </span> : : </a>
+<a name="13"><span class="lineNum"> 13 </span> :<span class="lineCov"> 463 : static void indent_num(unsigned indent)</span></a>
+<a name="14"><span class="lineNum"> 14 </span> : : {</a>
+<a name="15"><span class="lineNum"> 15 </span> : : unsigned int i;</a>
+<a name="16"><span class="lineNum"> 16 </span> : : </a>
+<a name="17"><span class="lineNum"> 17 </span> :<span class="lineCov"> 3115 : for (i = 0; i &lt; indent; i++)</span></a>
+<a name="18"><span class="lineNum"> 18 </span> :<span class="lineCov"> 2652 : putc(' ', stdout);</span></a>
+<a name="19"><span class="lineNum"> 19 </span> :<span class="lineCov"> 463 : }</span></a>
+<a name="20"><span class="lineNum"> 20 </span> : : </a>
+<a name="21"><span class="lineNum"> 21 </span> :<span class="lineNoCov"> 0 : static void dump_val(unsigned indent, const void *prop, size_t size)</span></a>
+<a name="22"><span class="lineNum"> 22 </span> : : {</a>
+<a name="23"><span class="lineNum"> 23 </span> : : size_t i;</a>
+<a name="24"><span class="lineNum"> 24 </span> :<span class="lineNoCov"> 0 : int width = 78 - indent;</span></a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> :<span class="lineNoCov"> 0 : for (i = 0; i &lt; size; i++) {</span></a>
+<a name="27"><span class="lineNum"> 27 </span> :<span class="lineNoCov"> 0 : printf(&quot;%02x&quot;, ((unsigned char *)prop)[i]);</span></a>
+<a name="28"><span class="lineNum"> 28 </span> :<span class="lineNoCov"> 0 : width -= 2;</span></a>
+<a name="29"><span class="lineNum"> 29 </span> :<span class="lineNoCov"> 0 : if(width &lt; 2) {</span></a>
+<a name="30"><span class="lineNum"> 30 </span> :<span class="lineNoCov"> 0 : printf(&quot;\n&quot;);</span></a>
+<a name="31"><span class="lineNum"> 31 </span> :<span class="lineNoCov"> 0 : indent_num(indent);</span></a>
+<a name="32"><span class="lineNum"> 32 </span> :<span class="lineNoCov"> 0 : width = 80 - indent;</span></a>
+<a name="33"><span class="lineNum"> 33 </span> : : }</a>
+<a name="34"><span class="lineNum"> 34 </span> : : }</a>
+<a name="35"><span class="lineNum"> 35 </span> :<span class="lineNoCov"> 0 : }</span></a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : void dump_dt(const struct dt_node *root, unsigned indent, bool show_props);</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> :<span class="lineCov"> 463 : void dump_dt(const struct dt_node *root, unsigned indent, bool show_props)</span></a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> : : const struct dt_node *i;</a>
+<a name="42"><span class="lineNum"> 42 </span> : : const struct dt_property *p;</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> :<span class="lineCov"> 463 : indent_num(indent);</span></a>
+<a name="45"><span class="lineNum"> 45 </span> :<span class="lineCov"> 463 : printf(&quot;node: %s\n&quot;, root-&gt;name);</span></a>
+<a name="46"><span class="lineNum"> 46 </span> : : </a>
+<a name="47"><span class="lineNum"> 47 </span> :<span class="lineCov"> 463 : if (show_props) {</span></a>
+<a name="48"><span class="lineNum"> 48 </span> :<span class="lineCov"> 1 : list_for_each(&amp;root-&gt;properties, p, list) {</span></a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineNoCov"> 0 : indent_num(indent);</span></a>
+<a name="50"><span class="lineNum"> 50 </span> :<span class="lineNoCov"> 0 : printf(&quot;prop: %s size: %zu val: &quot;, p-&gt;name, p-&gt;len);</span></a>
+<a name="51"><span class="lineNum"> 51 </span> :<span class="lineNoCov"> 0 : dump_val(indent, p-&gt;prop, p-&gt;len);</span></a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineNoCov"> 0 : printf(&quot;\n&quot;);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : }</a>
+<a name="54"><span class="lineNum"> 54 </span> : : }</a>
+<a name="55"><span class="lineNum"> 55 </span> : : </a>
+<a name="56"><span class="lineNum"> 56 </span> :<span class="lineCov"> 915 : list_for_each(&amp;root-&gt;children, i, list)</span></a>
+<a name="57"><span class="lineNum"> 57 </span> :<span class="lineCov"> 452 : dump_dt(i, indent + 2, show_props);</span></a>
+<a name="58"><span class="lineNum"> 58 </span> :<span class="lineCov"> 463 : }</span></a>
+<a name="59"><span class="lineNum"> 59 </span> : : </a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/test/index-sort-b.html b/coverage-report/test/index-sort-b.html
new file mode 100644
index 0000000..bf81a81
--- /dev/null
+++ b/coverage-report/test/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - test</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dt_common.c.gcov.html">dt_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=46 height=10 alt="46.2%"><img src="../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/test/index-sort-f.html b/coverage-report/test/index-sort-f.html
new file mode 100644
index 0000000..3eebaca
--- /dev/null
+++ b/coverage-report/test/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - test</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dt_common.c.gcov.html">dt_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=46 height=10 alt="46.2%"><img src="../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/test/index-sort-l.html b/coverage-report/test/index-sort-l.html
new file mode 100644
index 0000000..fe14aea
--- /dev/null
+++ b/coverage-report/test/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - test</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dt_common.c.gcov.html">dt_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=46 height=10 alt="46.2%"><img src="../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/test/index.html b/coverage-report/test/index.html
new file mode 100644
index 0000000..6ffb5f8
--- /dev/null
+++ b/coverage-report/test/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - test</title>
+ <link rel="stylesheet" type="text/css" href="../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../index.html">top level</a> - test</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">12</td>
+ <td class="headerCovTableEntry">26</td>
+ <td class="headerCovTableEntryLo">46.2 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">3</td>
+ <td class="headerCovTableEntryLo">66.7 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="dt_common.c.gcov.html">dt_common.c</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../ruby.png" width=46 height=10 alt="46.2%"><img src="../snow.png" width=54 height=10 alt="46.2%"></td></tr></table>
+ </td>
+ <td class="coverPerLo">46.2&nbsp;%</td>
+ <td class="coverNumLo">12 / 26</td>
+ <td class="coverPerLo">66.7&nbsp;%</td>
+ <td class="coverNumLo">2 / 3</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/updown.png b/coverage-report/updown.png
new file mode 100644
index 0000000..aa56a23
--- /dev/null
+++ b/coverage-report/updown.png
Binary files differ
diff --git a/coverage-report/usr/include/bits/byteswap.h.func-sort-c.html b/coverage-report/usr/include/bits/byteswap.h.func-sort-c.html
new file mode 100644
index 0000000..41d837e
--- /dev/null
+++ b/coverage-report/usr/include/bits/byteswap.h.func-sort-c.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits/byteswap.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/bits</a> - byteswap.h<span style="font-size: 80%;"> (<a href="byteswap.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="byteswap.h.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="byteswap.h.gcov.html#68">__bswap_64</a></td>
+ <td class="coverFnHi">7601</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/byteswap.h.func.html b/coverage-report/usr/include/bits/byteswap.h.func.html
new file mode 100644
index 0000000..ce44bc6
--- /dev/null
+++ b/coverage-report/usr/include/bits/byteswap.h.func.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits/byteswap.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/bits</a> - byteswap.h<span style="font-size: 80%;"> (<a href="byteswap.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="byteswap.h.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFn"><a href="byteswap.h.gcov.html#68">__bswap_64</a></td>
+ <td class="coverFnHi">7601</td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/byteswap.h.gcov.html b/coverage-report/usr/include/bits/byteswap.h.gcov.html
new file mode 100644
index 0000000..7eba299
--- /dev/null
+++ b/coverage-report/usr/include/bits/byteswap.h.gcov.html
@@ -0,0 +1,164 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits/byteswap.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/bits</a> - byteswap.h<span style="font-size: 80%;"> (source / <a href="byteswap.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntry">4</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Macros and inline functions to swap the order of bytes in integer values.</a>
+<a name="2"><span class="lineNum"> 2 </span> : : Copyright (C) 1997-2020 Free Software Foundation, Inc.</a>
+<a name="3"><span class="lineNum"> 3 </span> : : This file is part of the GNU C Library.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : </a>
+<a name="5"><span class="lineNum"> 5 </span> : : The GNU C Library is free software; you can redistribute it and/or</a>
+<a name="6"><span class="lineNum"> 6 </span> : : modify it under the terms of the GNU Lesser General Public</a>
+<a name="7"><span class="lineNum"> 7 </span> : : License as published by the Free Software Foundation; either</a>
+<a name="8"><span class="lineNum"> 8 </span> : : version 2.1 of the License, or (at your option) any later version.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : The GNU C Library is distributed in the hope that it will be useful,</a>
+<a name="11"><span class="lineNum"> 11 </span> : : but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="12"><span class="lineNum"> 12 </span> : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</a>
+<a name="13"><span class="lineNum"> 13 </span> : : Lesser General Public License for more details.</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : You should have received a copy of the GNU Lesser General Public</a>
+<a name="16"><span class="lineNum"> 16 </span> : : License along with the GNU C Library; if not, see</a>
+<a name="17"><span class="lineNum"> 17 </span> : : &lt;https://www.gnu.org/licenses/&gt;. */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #if !defined _BYTESWAP_H &amp;&amp; !defined _NETINET_IN_H &amp;&amp; !defined _ENDIAN_H</a>
+<a name="20"><span class="lineNum"> 20 </span> : : # error &quot;Never use &lt;bits/byteswap.h&gt; directly; include &lt;byteswap.h&gt; instead.&quot;</a>
+<a name="21"><span class="lineNum"> 21 </span> : : #endif</a>
+<a name="22"><span class="lineNum"> 22 </span> : : </a>
+<a name="23"><span class="lineNum"> 23 </span> : : #ifndef _BITS_BYTESWAP_H</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #define _BITS_BYTESWAP_H 1</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : #include &lt;features.h&gt;</a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &lt;bits/types.h&gt;</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : /* Swap bytes in 16-bit value. */</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #define __bswap_constant_16(x) \</a>
+<a name="31"><span class="lineNum"> 31 </span> : : ((__uint16_t) ((((x) &gt;&gt; 8) &amp; 0xff) | (((x) &amp; 0xff) &lt;&lt; 8)))</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : static __inline __uint16_t</a>
+<a name="34"><span class="lineNum"> 34 </span> : : __bswap_16 (__uint16_t __bsx)</a>
+<a name="35"><span class="lineNum"> 35 </span> : : {</a>
+<a name="36"><span class="lineNum"> 36 </span> : : #if __GNUC_PREREQ (4, 8)</a>
+<a name="37"><span class="lineNum"> 37 </span> : : return __builtin_bswap16 (__bsx);</a>
+<a name="38"><span class="lineNum"> 38 </span> : : #else</a>
+<a name="39"><span class="lineNum"> 39 </span> : : return __bswap_constant_16 (__bsx);</a>
+<a name="40"><span class="lineNum"> 40 </span> : : #endif</a>
+<a name="41"><span class="lineNum"> 41 </span> : : }</a>
+<a name="42"><span class="lineNum"> 42 </span> : : </a>
+<a name="43"><span class="lineNum"> 43 </span> : : /* Swap bytes in 32-bit value. */</a>
+<a name="44"><span class="lineNum"> 44 </span> : : #define __bswap_constant_32(x) \</a>
+<a name="45"><span class="lineNum"> 45 </span> : : ((((x) &amp; 0xff000000u) &gt;&gt; 24) | (((x) &amp; 0x00ff0000u) &gt;&gt; 8) \</a>
+<a name="46"><span class="lineNum"> 46 </span> : : | (((x) &amp; 0x0000ff00u) &lt;&lt; 8) | (((x) &amp; 0x000000ffu) &lt;&lt; 24))</a>
+<a name="47"><span class="lineNum"> 47 </span> : : </a>
+<a name="48"><span class="lineNum"> 48 </span> : : static __inline __uint32_t</a>
+<a name="49"><span class="lineNum"> 49 </span> :<span class="lineCov"> 54 : __bswap_32 (__uint32_t __bsx)</span></a>
+<a name="50"><span class="lineNum"> 50 </span> : : {</a>
+<a name="51"><span class="lineNum"> 51 </span> : : #if __GNUC_PREREQ (4, 3)</a>
+<a name="52"><span class="lineNum"> 52 </span> :<span class="lineCov"> 50 : return __builtin_bswap32 (__bsx);</span></a>
+<a name="53"><span class="lineNum"> 53 </span> : : #else</a>
+<a name="54"><span class="lineNum"> 54 </span> : : return __bswap_constant_32 (__bsx);</a>
+<a name="55"><span class="lineNum"> 55 </span> : : #endif</a>
+<a name="56"><span class="lineNum"> 56 </span> : : }</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : /* Swap bytes in 64-bit value. */</a>
+<a name="59"><span class="lineNum"> 59 </span> : : #define __bswap_constant_64(x) \</a>
+<a name="60"><span class="lineNum"> 60 </span> : : ((((x) &amp; 0xff00000000000000ull) &gt;&gt; 56) \</a>
+<a name="61"><span class="lineNum"> 61 </span> : : | (((x) &amp; 0x00ff000000000000ull) &gt;&gt; 40) \</a>
+<a name="62"><span class="lineNum"> 62 </span> : : | (((x) &amp; 0x0000ff0000000000ull) &gt;&gt; 24) \</a>
+<a name="63"><span class="lineNum"> 63 </span> : : | (((x) &amp; 0x000000ff00000000ull) &gt;&gt; 8) \</a>
+<a name="64"><span class="lineNum"> 64 </span> : : | (((x) &amp; 0x00000000ff000000ull) &lt;&lt; 8) \</a>
+<a name="65"><span class="lineNum"> 65 </span> : : | (((x) &amp; 0x0000000000ff0000ull) &lt;&lt; 24) \</a>
+<a name="66"><span class="lineNum"> 66 </span> : : | (((x) &amp; 0x000000000000ff00ull) &lt;&lt; 40) \</a>
+<a name="67"><span class="lineNum"> 67 </span> : : | (((x) &amp; 0x00000000000000ffull) &lt;&lt; 56))</a>
+<a name="68"><span class="lineNum"> 68 </span> : : </a>
+<a name="69"><span class="lineNum"> 69 </span> : : __extension__ static __inline __uint64_t</a>
+<a name="70"><span class="lineNum"> 70 </span> :<span class="lineCov"> 7601 : __bswap_64 (__uint64_t __bsx)</span></a>
+<a name="71"><span class="lineNum"> 71 </span> : : {</a>
+<a name="72"><span class="lineNum"> 72 </span> : : #if __GNUC_PREREQ (4, 3)</a>
+<a name="73"><span class="lineNum"> 73 </span> :<span class="lineCov"> 7601 : return __builtin_bswap64 (__bsx);</span></a>
+<a name="74"><span class="lineNum"> 74 </span> : : #else</a>
+<a name="75"><span class="lineNum"> 75 </span> : : return __bswap_constant_64 (__bsx);</a>
+<a name="76"><span class="lineNum"> 76 </span> : : #endif</a>
+<a name="77"><span class="lineNum"> 77 </span> : : }</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : #endif /* _BITS_BYTESWAP_H */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/index-sort-b.html b/coverage-report/usr/include/bits/index-sort-b.html
new file mode 100644
index 0000000..105794d
--- /dev/null
+++ b/coverage-report/usr/include/bits/index-sort-b.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/bits</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stdio.h.gcov.html">stdio.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="byteswap.h.gcov.html">byteswap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/index-sort-f.html b/coverage-report/usr/include/bits/index-sort-f.html
new file mode 100644
index 0000000..c0ebf2c
--- /dev/null
+++ b/coverage-report/usr/include/bits/index-sort-f.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/bits</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stdio.h.gcov.html">stdio.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="byteswap.h.gcov.html">byteswap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/index-sort-l.html b/coverage-report/usr/include/bits/index-sort-l.html
new file mode 100644
index 0000000..a6ede2d
--- /dev/null
+++ b/coverage-report/usr/include/bits/index-sort-l.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/bits</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stdio.h.gcov.html">stdio.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="byteswap.h.gcov.html">byteswap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/index.html b/coverage-report/usr/include/bits/index.html
new file mode 100644
index 0000000..f88da20
--- /dev/null
+++ b/coverage-report/usr/include/bits/index.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/bits</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntry">1</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="byteswap.h.gcov.html">byteswap.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">4 / 4</td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1 / 1</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stdio.h.gcov.html">stdio.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2 / 2</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/stdio.h.func-sort-c.html b/coverage-report/usr/include/bits/stdio.h.func-sort-c.html
new file mode 100644
index 0000000..e875506
--- /dev/null
+++ b/coverage-report/usr/include/bits/stdio.h.func-sort-c.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits/stdio.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/bits</a> - stdio.h<span style="font-size: 80%;"> (<a href="stdio.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="stdio.h.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/stdio.h.func.html b/coverage-report/usr/include/bits/stdio.h.func.html
new file mode 100644
index 0000000..2c71b4d
--- /dev/null
+++ b/coverage-report/usr/include/bits/stdio.h.func.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits/stdio.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/bits</a> - stdio.h<span style="font-size: 80%;"> (<a href="stdio.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="stdio.h.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/bits/stdio.h.gcov.html b/coverage-report/usr/include/bits/stdio.h.gcov.html
new file mode 100644
index 0000000..685cc1d
--- /dev/null
+++ b/coverage-report/usr/include/bits/stdio.h.gcov.html
@@ -0,0 +1,280 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/bits/stdio.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/bits</a> - stdio.h<span style="font-size: 80%;"> (source / <a href="stdio.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntry">2</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Optimizing macros and inline functions for stdio functions.</a>
+<a name="2"><span class="lineNum"> 2 </span> : : Copyright (C) 1998-2020 Free Software Foundation, Inc.</a>
+<a name="3"><span class="lineNum"> 3 </span> : : This file is part of the GNU C Library.</a>
+<a name="4"><span class="lineNum"> 4 </span> : : </a>
+<a name="5"><span class="lineNum"> 5 </span> : : The GNU C Library is free software; you can redistribute it and/or</a>
+<a name="6"><span class="lineNum"> 6 </span> : : modify it under the terms of the GNU Lesser General Public</a>
+<a name="7"><span class="lineNum"> 7 </span> : : License as published by the Free Software Foundation; either</a>
+<a name="8"><span class="lineNum"> 8 </span> : : version 2.1 of the License, or (at your option) any later version.</a>
+<a name="9"><span class="lineNum"> 9 </span> : : </a>
+<a name="10"><span class="lineNum"> 10 </span> : : The GNU C Library is distributed in the hope that it will be useful,</a>
+<a name="11"><span class="lineNum"> 11 </span> : : but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="12"><span class="lineNum"> 12 </span> : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</a>
+<a name="13"><span class="lineNum"> 13 </span> : : Lesser General Public License for more details.</a>
+<a name="14"><span class="lineNum"> 14 </span> : : </a>
+<a name="15"><span class="lineNum"> 15 </span> : : You should have received a copy of the GNU Lesser General Public</a>
+<a name="16"><span class="lineNum"> 16 </span> : : License along with the GNU C Library; if not, see</a>
+<a name="17"><span class="lineNum"> 17 </span> : : &lt;https://www.gnu.org/licenses/&gt;. */</a>
+<a name="18"><span class="lineNum"> 18 </span> : : </a>
+<a name="19"><span class="lineNum"> 19 </span> : : #ifndef _BITS_STDIO_H</a>
+<a name="20"><span class="lineNum"> 20 </span> : : #define _BITS_STDIO_H 1</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : #ifndef _STDIO_H</a>
+<a name="23"><span class="lineNum"> 23 </span> : : # error &quot;Never include &lt;bits/stdio.h&gt; directly; use &lt;stdio.h&gt; instead.&quot;</a>
+<a name="24"><span class="lineNum"> 24 </span> : : #endif</a>
+<a name="25"><span class="lineNum"> 25 </span> : : </a>
+<a name="26"><span class="lineNum"> 26 </span> : : #ifndef __extern_inline</a>
+<a name="27"><span class="lineNum"> 27 </span> : : # define __STDIO_INLINE inline</a>
+<a name="28"><span class="lineNum"> 28 </span> : : #else</a>
+<a name="29"><span class="lineNum"> 29 </span> : : # define __STDIO_INLINE __extern_inline</a>
+<a name="30"><span class="lineNum"> 30 </span> : : #endif</a>
+<a name="31"><span class="lineNum"> 31 </span> : : </a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : #ifdef __USE_EXTERN_INLINES</a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* For -D_FORTIFY_SOURCE{,=2} bits/stdio2.h will define a different</a>
+<a name="35"><span class="lineNum"> 35 </span> : : inline. */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : # if !(__USE_FORTIFY_LEVEL &gt; 0 &amp;&amp; defined __fortify_function)</a>
+<a name="37"><span class="lineNum"> 37 </span> : : /* Write formatted output to stdout from argument list ARG. */</a>
+<a name="38"><span class="lineNum"> 38 </span> : : __STDIO_INLINE int</a>
+<a name="39"><span class="lineNum"> 39 </span> : : vprintf (const char *__restrict __fmt, __gnuc_va_list __arg)</a>
+<a name="40"><span class="lineNum"> 40 </span> : : {</a>
+<a name="41"><span class="lineNum"> 41 </span> : : return vfprintf (stdout, __fmt, __arg);</a>
+<a name="42"><span class="lineNum"> 42 </span> : : }</a>
+<a name="43"><span class="lineNum"> 43 </span> : : # endif</a>
+<a name="44"><span class="lineNum"> 44 </span> : : </a>
+<a name="45"><span class="lineNum"> 45 </span> : : /* Read a character from stdin. */</a>
+<a name="46"><span class="lineNum"> 46 </span> : : __STDIO_INLINE int</a>
+<a name="47"><span class="lineNum"> 47 </span> : : getchar (void)</a>
+<a name="48"><span class="lineNum"> 48 </span> : : {</a>
+<a name="49"><span class="lineNum"> 49 </span> : : return getc (stdin);</a>
+<a name="50"><span class="lineNum"> 50 </span> : : }</a>
+<a name="51"><span class="lineNum"> 51 </span> : : </a>
+<a name="52"><span class="lineNum"> 52 </span> : : </a>
+<a name="53"><span class="lineNum"> 53 </span> : : # ifdef __USE_MISC</a>
+<a name="54"><span class="lineNum"> 54 </span> : : /* Faster version when locking is not necessary. */</a>
+<a name="55"><span class="lineNum"> 55 </span> : : __STDIO_INLINE int</a>
+<a name="56"><span class="lineNum"> 56 </span> : : fgetc_unlocked (FILE *__fp)</a>
+<a name="57"><span class="lineNum"> 57 </span> : : {</a>
+<a name="58"><span class="lineNum"> 58 </span> : : return __getc_unlocked_body (__fp);</a>
+<a name="59"><span class="lineNum"> 59 </span> : : }</a>
+<a name="60"><span class="lineNum"> 60 </span> : : # endif /* misc */</a>
+<a name="61"><span class="lineNum"> 61 </span> : : </a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : # ifdef __USE_POSIX</a>
+<a name="64"><span class="lineNum"> 64 </span> : : /* This is defined in POSIX.1:1996. */</a>
+<a name="65"><span class="lineNum"> 65 </span> : : __STDIO_INLINE int</a>
+<a name="66"><span class="lineNum"> 66 </span> : : getc_unlocked (FILE *__fp)</a>
+<a name="67"><span class="lineNum"> 67 </span> : : {</a>
+<a name="68"><span class="lineNum"> 68 </span> : : return __getc_unlocked_body (__fp);</a>
+<a name="69"><span class="lineNum"> 69 </span> : : }</a>
+<a name="70"><span class="lineNum"> 70 </span> : : </a>
+<a name="71"><span class="lineNum"> 71 </span> : : /* This is defined in POSIX.1:1996. */</a>
+<a name="72"><span class="lineNum"> 72 </span> : : __STDIO_INLINE int</a>
+<a name="73"><span class="lineNum"> 73 </span> : : getchar_unlocked (void)</a>
+<a name="74"><span class="lineNum"> 74 </span> : : {</a>
+<a name="75"><span class="lineNum"> 75 </span> : : return __getc_unlocked_body (stdin);</a>
+<a name="76"><span class="lineNum"> 76 </span> : : }</a>
+<a name="77"><span class="lineNum"> 77 </span> : : # endif /* POSIX */</a>
+<a name="78"><span class="lineNum"> 78 </span> : : </a>
+<a name="79"><span class="lineNum"> 79 </span> : : </a>
+<a name="80"><span class="lineNum"> 80 </span> : : /* Write a character to stdout. */</a>
+<a name="81"><span class="lineNum"> 81 </span> : : __STDIO_INLINE int</a>
+<a name="82"><span class="lineNum"> 82 </span> :<span class="lineCov"> 1580 : putchar (int __c)</span></a>
+<a name="83"><span class="lineNum"> 83 </span> : : {</a>
+<a name="84"><span class="lineNum"> 84 </span> :<span class="lineCov"> 1580 : return putc (__c, stdout);</span></a>
+<a name="85"><span class="lineNum"> 85 </span> : : }</a>
+<a name="86"><span class="lineNum"> 86 </span> : : </a>
+<a name="87"><span class="lineNum"> 87 </span> : : </a>
+<a name="88"><span class="lineNum"> 88 </span> : : # ifdef __USE_MISC</a>
+<a name="89"><span class="lineNum"> 89 </span> : : /* Faster version when locking is not necessary. */</a>
+<a name="90"><span class="lineNum"> 90 </span> : : __STDIO_INLINE int</a>
+<a name="91"><span class="lineNum"> 91 </span> : : fputc_unlocked (int __c, FILE *__stream)</a>
+<a name="92"><span class="lineNum"> 92 </span> : : {</a>
+<a name="93"><span class="lineNum"> 93 </span> : : return __putc_unlocked_body (__c, __stream);</a>
+<a name="94"><span class="lineNum"> 94 </span> : : }</a>
+<a name="95"><span class="lineNum"> 95 </span> : : # endif /* misc */</a>
+<a name="96"><span class="lineNum"> 96 </span> : : </a>
+<a name="97"><span class="lineNum"> 97 </span> : : </a>
+<a name="98"><span class="lineNum"> 98 </span> : : # ifdef __USE_POSIX</a>
+<a name="99"><span class="lineNum"> 99 </span> : : /* This is defined in POSIX.1:1996. */</a>
+<a name="100"><span class="lineNum"> 100 </span> : : __STDIO_INLINE int</a>
+<a name="101"><span class="lineNum"> 101 </span> : : putc_unlocked (int __c, FILE *__stream)</a>
+<a name="102"><span class="lineNum"> 102 </span> : : {</a>
+<a name="103"><span class="lineNum"> 103 </span> : : return __putc_unlocked_body (__c, __stream);</a>
+<a name="104"><span class="lineNum"> 104 </span> : : }</a>
+<a name="105"><span class="lineNum"> 105 </span> : : </a>
+<a name="106"><span class="lineNum"> 106 </span> : : /* This is defined in POSIX.1:1996. */</a>
+<a name="107"><span class="lineNum"> 107 </span> : : __STDIO_INLINE int</a>
+<a name="108"><span class="lineNum"> 108 </span> : : putchar_unlocked (int __c)</a>
+<a name="109"><span class="lineNum"> 109 </span> : : {</a>
+<a name="110"><span class="lineNum"> 110 </span> : : return __putc_unlocked_body (__c, stdout);</a>
+<a name="111"><span class="lineNum"> 111 </span> : : }</a>
+<a name="112"><span class="lineNum"> 112 </span> : : # endif /* POSIX */</a>
+<a name="113"><span class="lineNum"> 113 </span> : : </a>
+<a name="114"><span class="lineNum"> 114 </span> : : </a>
+<a name="115"><span class="lineNum"> 115 </span> : : # ifdef __USE_GNU</a>
+<a name="116"><span class="lineNum"> 116 </span> : : /* Like `getdelim', but reads up to a newline. */</a>
+<a name="117"><span class="lineNum"> 117 </span> : : __STDIO_INLINE __ssize_t</a>
+<a name="118"><span class="lineNum"> 118 </span> : : getline (char **__lineptr, size_t *__n, FILE *__stream)</a>
+<a name="119"><span class="lineNum"> 119 </span> : : {</a>
+<a name="120"><span class="lineNum"> 120 </span> : : return __getdelim (__lineptr, __n, '\n', __stream);</a>
+<a name="121"><span class="lineNum"> 121 </span> : : }</a>
+<a name="122"><span class="lineNum"> 122 </span> : : # endif /* GNU */</a>
+<a name="123"><span class="lineNum"> 123 </span> : : </a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> : : # ifdef __USE_MISC</a>
+<a name="126"><span class="lineNum"> 126 </span> : : /* Faster versions when locking is not required. */</a>
+<a name="127"><span class="lineNum"> 127 </span> : : __STDIO_INLINE int</a>
+<a name="128"><span class="lineNum"> 128 </span> : : __NTH (feof_unlocked (FILE *__stream))</a>
+<a name="129"><span class="lineNum"> 129 </span> : : {</a>
+<a name="130"><span class="lineNum"> 130 </span> : : return __feof_unlocked_body (__stream);</a>
+<a name="131"><span class="lineNum"> 131 </span> : : }</a>
+<a name="132"><span class="lineNum"> 132 </span> : : </a>
+<a name="133"><span class="lineNum"> 133 </span> : : /* Faster versions when locking is not required. */</a>
+<a name="134"><span class="lineNum"> 134 </span> : : __STDIO_INLINE int</a>
+<a name="135"><span class="lineNum"> 135 </span> : : __NTH (ferror_unlocked (FILE *__stream))</a>
+<a name="136"><span class="lineNum"> 136 </span> : : {</a>
+<a name="137"><span class="lineNum"> 137 </span> : : return __ferror_unlocked_body (__stream);</a>
+<a name="138"><span class="lineNum"> 138 </span> : : }</a>
+<a name="139"><span class="lineNum"> 139 </span> : : # endif /* misc */</a>
+<a name="140"><span class="lineNum"> 140 </span> : : </a>
+<a name="141"><span class="lineNum"> 141 </span> : : #endif /* Use extern inlines. */</a>
+<a name="142"><span class="lineNum"> 142 </span> : : </a>
+<a name="143"><span class="lineNum"> 143 </span> : : </a>
+<a name="144"><span class="lineNum"> 144 </span> : : #if defined __USE_MISC &amp;&amp; defined __GNUC__ &amp;&amp; defined __OPTIMIZE__ \</a>
+<a name="145"><span class="lineNum"> 145 </span> : : &amp;&amp; !defined __cplusplus</a>
+<a name="146"><span class="lineNum"> 146 </span> : : /* Perform some simple optimizations. */</a>
+<a name="147"><span class="lineNum"> 147 </span> : : # define fread_unlocked(ptr, size, n, stream) \</a>
+<a name="148"><span class="lineNum"> 148 </span> : : (__extension__ ((__builtin_constant_p (size) &amp;&amp; __builtin_constant_p (n) \</a>
+<a name="149"><span class="lineNum"> 149 </span> : : &amp;&amp; (size_t) (size) * (size_t) (n) &lt;= 8 \</a>
+<a name="150"><span class="lineNum"> 150 </span> : : &amp;&amp; (size_t) (size) != 0) \</a>
+<a name="151"><span class="lineNum"> 151 </span> : : ? ({ char *__ptr = (char *) (ptr); \</a>
+<a name="152"><span class="lineNum"> 152 </span> : : FILE *__stream = (stream); \</a>
+<a name="153"><span class="lineNum"> 153 </span> : : size_t __cnt; \</a>
+<a name="154"><span class="lineNum"> 154 </span> : : for (__cnt = (size_t) (size) * (size_t) (n); \</a>
+<a name="155"><span class="lineNum"> 155 </span> : : __cnt &gt; 0; --__cnt) \</a>
+<a name="156"><span class="lineNum"> 156 </span> : : { \</a>
+<a name="157"><span class="lineNum"> 157 </span> : : int __c = getc_unlocked (__stream); \</a>
+<a name="158"><span class="lineNum"> 158 </span> : : if (__c == EOF) \</a>
+<a name="159"><span class="lineNum"> 159 </span> : : break; \</a>
+<a name="160"><span class="lineNum"> 160 </span> : : *__ptr++ = __c; \</a>
+<a name="161"><span class="lineNum"> 161 </span> : : } \</a>
+<a name="162"><span class="lineNum"> 162 </span> : : ((size_t) (size) * (size_t) (n) - __cnt) \</a>
+<a name="163"><span class="lineNum"> 163 </span> : : / (size_t) (size); }) \</a>
+<a name="164"><span class="lineNum"> 164 </span> : : : (((__builtin_constant_p (size) &amp;&amp; (size_t) (size) == 0) \</a>
+<a name="165"><span class="lineNum"> 165 </span> : : || (__builtin_constant_p (n) &amp;&amp; (size_t) (n) == 0)) \</a>
+<a name="166"><span class="lineNum"> 166 </span> : : /* Evaluate all parameters once. */ \</a>
+<a name="167"><span class="lineNum"> 167 </span> : : ? ((void) (ptr), (void) (stream), (void) (size), \</a>
+<a name="168"><span class="lineNum"> 168 </span> : : (void) (n), (size_t) 0) \</a>
+<a name="169"><span class="lineNum"> 169 </span> : : : fread_unlocked (ptr, size, n, stream))))</a>
+<a name="170"><span class="lineNum"> 170 </span> : : </a>
+<a name="171"><span class="lineNum"> 171 </span> : : # define fwrite_unlocked(ptr, size, n, stream) \</a>
+<a name="172"><span class="lineNum"> 172 </span> : : (__extension__ ((__builtin_constant_p (size) &amp;&amp; __builtin_constant_p (n) \</a>
+<a name="173"><span class="lineNum"> 173 </span> : : &amp;&amp; (size_t) (size) * (size_t) (n) &lt;= 8 \</a>
+<a name="174"><span class="lineNum"> 174 </span> : : &amp;&amp; (size_t) (size) != 0) \</a>
+<a name="175"><span class="lineNum"> 175 </span> : : ? ({ const char *__ptr = (const char *) (ptr); \</a>
+<a name="176"><span class="lineNum"> 176 </span> : : FILE *__stream = (stream); \</a>
+<a name="177"><span class="lineNum"> 177 </span> : : size_t __cnt; \</a>
+<a name="178"><span class="lineNum"> 178 </span> : : for (__cnt = (size_t) (size) * (size_t) (n); \</a>
+<a name="179"><span class="lineNum"> 179 </span> : : __cnt &gt; 0; --__cnt) \</a>
+<a name="180"><span class="lineNum"> 180 </span> : : if (putc_unlocked (*__ptr++, __stream) == EOF) \</a>
+<a name="181"><span class="lineNum"> 181 </span> : : break; \</a>
+<a name="182"><span class="lineNum"> 182 </span> : : ((size_t) (size) * (size_t) (n) - __cnt) \</a>
+<a name="183"><span class="lineNum"> 183 </span> : : / (size_t) (size); }) \</a>
+<a name="184"><span class="lineNum"> 184 </span> : : : (((__builtin_constant_p (size) &amp;&amp; (size_t) (size) == 0) \</a>
+<a name="185"><span class="lineNum"> 185 </span> : : || (__builtin_constant_p (n) &amp;&amp; (size_t) (n) == 0)) \</a>
+<a name="186"><span class="lineNum"> 186 </span> : : /* Evaluate all parameters once. */ \</a>
+<a name="187"><span class="lineNum"> 187 </span> : : ? ((void) (ptr), (void) (stream), (void) (size), \</a>
+<a name="188"><span class="lineNum"> 188 </span> : : (void) (n), (size_t) 0) \</a>
+<a name="189"><span class="lineNum"> 189 </span> : : : fwrite_unlocked (ptr, size, n, stream))))</a>
+<a name="190"><span class="lineNum"> 190 </span> : : #endif</a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> : : /* Define helper macro. */</a>
+<a name="193"><span class="lineNum"> 193 </span> : : #undef __STDIO_INLINE</a>
+<a name="194"><span class="lineNum"> 194 </span> : : </a>
+<a name="195"><span class="lineNum"> 195 </span> : : #endif /* bits/stdio.h. */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/sys/index-sort-b.html b/coverage-report/usr/include/sys/index-sort-b.html
new file mode 100644
index 0000000..95ff47e
--- /dev/null
+++ b/coverage-report/usr/include/sys/index-sort-b.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/sys</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/sys</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stat.h.gcov.html">stat.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/sys/index-sort-f.html b/coverage-report/usr/include/sys/index-sort-f.html
new file mode 100644
index 0000000..cc80708
--- /dev/null
+++ b/coverage-report/usr/include/sys/index-sort-f.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/sys</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/sys</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stat.h.gcov.html">stat.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/sys/index-sort-l.html b/coverage-report/usr/include/sys/index-sort-l.html
new file mode 100644
index 0000000..82ba07b
--- /dev/null
+++ b/coverage-report/usr/include/sys/index-sort-l.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/sys</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/sys</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stat.h.gcov.html">stat.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/sys/index.html b/coverage-report/usr/include/sys/index.html
new file mode 100644
index 0000000..68dacaf
--- /dev/null
+++ b/coverage-report/usr/include/sys/index.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/sys</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - /usr/include/sys</td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=1 cellspacing=1 border=0>
+
+ <tr>
+ <td width="44%"><br></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ <td width="8%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
+ <td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
+ <td class="tableHead" colspan=2>Branches <span class="tableHeadSort"><a href="index-sort-b.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by branch coverage" title="Sort by branch coverage" border=0></a></span></td>
+ </tr>
+ <tr>
+ <td class="coverFile"><a href="stat.h.gcov.html">stat.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">6 / 6</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ <td class="coverPerHi">-</td>
+ <td class="coverNumHi">0 / 0</td>
+ </tr>
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/sys/stat.h.func-sort-c.html b/coverage-report/usr/include/sys/stat.h.func-sort-c.html
new file mode 100644
index 0000000..99d1086
--- /dev/null
+++ b/coverage-report/usr/include/sys/stat.h.func-sort-c.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/sys/stat.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/sys</a> - stat.h<span style="font-size: 80%;"> (<a href="stat.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="stat.h.func.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/sys/stat.h.func.html b/coverage-report/usr/include/sys/stat.h.func.html
new file mode 100644
index 0000000..c65fdda
--- /dev/null
+++ b/coverage-report/usr/include/sys/stat.h.func.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/sys/stat.h - functions</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/sys</a> - stat.h<span style="font-size: 80%;"> (<a href="stat.h.gcov.html">source</a> / functions)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="60%" cellpadding=1 cellspacing=1 border=0>
+ <tr><td><br></td></tr>
+ <tr>
+ <td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../../../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
+ <td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="stat.h.func-sort-c.html"><img src="../../../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
+ </tr>
+ </table>
+ <br>
+ </center>
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/coverage-report/usr/include/sys/stat.h.gcov.html b/coverage-report/usr/include/sys/stat.h.gcov.html
new file mode 100644
index 0000000..0a5e954
--- /dev/null
+++ b/coverage-report/usr/include/sys/stat.h.gcov.html
@@ -0,0 +1,622 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>LCOV - skiboot.info - /usr/include/sys/stat.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LCOV - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td width="10%" class="headerItem">Current view:</td>
+ <td width="35%" class="headerValue"><a href="../../../index.html">top level</a> - <a href="index.html">usr/include/sys</a> - stat.h<span style="font-size: 80%;"> (source / <a href="stat.h.func-sort-c.html">functions</a>)</span></td>
+ <td width="5%"></td>
+ <td width="15%"></td>
+ <td width="10%" class="headerCovTableHead">Hit</td>
+ <td width="10%" class="headerCovTableHead">Total</td>
+ <td width="15%" class="headerCovTableHead">Coverage</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Test:</td>
+ <td class="headerValue">skiboot.info</td>
+ <td></td>
+ <td class="headerItem">Lines:</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntry">6</td>
+ <td class="headerCovTableEntryHi">100.0 %</td>
+ </tr>
+ <tr>
+ <td class="headerItem">Date:</td>
+ <td class="headerValue">2021-05-13 12:18:09</td>
+ <td></td>
+ <td class="headerItem">Functions:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td class="headerItem">Branches:</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntry">0</td>
+ <td class="headerCovTableEntryHi">-</td>
+ </tr>
+ <tr><td><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td>
+<pre class="sourceHeading"> Branch data Line data Source code</pre>
+<pre class="source">
+<a name="1"><span class="lineNum"> 1 </span> : : /* Copyright (C) 1991-2020 Free Software Foundation, Inc.</a>
+<a name="2"><span class="lineNum"> 2 </span> : : This file is part of the GNU C Library.</a>
+<a name="3"><span class="lineNum"> 3 </span> : : </a>
+<a name="4"><span class="lineNum"> 4 </span> : : The GNU C Library is free software; you can redistribute it and/or</a>
+<a name="5"><span class="lineNum"> 5 </span> : : modify it under the terms of the GNU Lesser General Public</a>
+<a name="6"><span class="lineNum"> 6 </span> : : License as published by the Free Software Foundation; either</a>
+<a name="7"><span class="lineNum"> 7 </span> : : version 2.1 of the License, or (at your option) any later version.</a>
+<a name="8"><span class="lineNum"> 8 </span> : : </a>
+<a name="9"><span class="lineNum"> 9 </span> : : The GNU C Library is distributed in the hope that it will be useful,</a>
+<a name="10"><span class="lineNum"> 10 </span> : : but WITHOUT ANY WARRANTY; without even the implied warranty of</a>
+<a name="11"><span class="lineNum"> 11 </span> : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</a>
+<a name="12"><span class="lineNum"> 12 </span> : : Lesser General Public License for more details.</a>
+<a name="13"><span class="lineNum"> 13 </span> : : </a>
+<a name="14"><span class="lineNum"> 14 </span> : : You should have received a copy of the GNU Lesser General Public</a>
+<a name="15"><span class="lineNum"> 15 </span> : : License along with the GNU C Library; if not, see</a>
+<a name="16"><span class="lineNum"> 16 </span> : : &lt;https://www.gnu.org/licenses/&gt;. */</a>
+<a name="17"><span class="lineNum"> 17 </span> : : </a>
+<a name="18"><span class="lineNum"> 18 </span> : : /*</a>
+<a name="19"><span class="lineNum"> 19 </span> : : * POSIX Standard: 5.6 File Characteristics &lt;sys/stat.h&gt;</a>
+<a name="20"><span class="lineNum"> 20 </span> : : */</a>
+<a name="21"><span class="lineNum"> 21 </span> : : </a>
+<a name="22"><span class="lineNum"> 22 </span> : : #ifndef _SYS_STAT_H</a>
+<a name="23"><span class="lineNum"> 23 </span> : : #define _SYS_STAT_H 1</a>
+<a name="24"><span class="lineNum"> 24 </span> : : </a>
+<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;features.h&gt;</a>
+<a name="26"><span class="lineNum"> 26 </span> : : </a>
+<a name="27"><span class="lineNum"> 27 </span> : : #include &lt;bits/types.h&gt; /* For __mode_t and __dev_t. */</a>
+<a name="28"><span class="lineNum"> 28 </span> : : </a>
+<a name="29"><span class="lineNum"> 29 </span> : : #ifdef __USE_XOPEN2K8</a>
+<a name="30"><span class="lineNum"> 30 </span> : : # include &lt;bits/types/struct_timespec.h&gt;</a>
+<a name="31"><span class="lineNum"> 31 </span> : : #endif</a>
+<a name="32"><span class="lineNum"> 32 </span> : : </a>
+<a name="33"><span class="lineNum"> 33 </span> : : #if defined __USE_XOPEN || defined __USE_XOPEN2K</a>
+<a name="34"><span class="lineNum"> 34 </span> : : /* The Single Unix specification says that some more types are</a>
+<a name="35"><span class="lineNum"> 35 </span> : : available here. */</a>
+<a name="36"><span class="lineNum"> 36 </span> : : </a>
+<a name="37"><span class="lineNum"> 37 </span> : : # include &lt;bits/types/time_t.h&gt;</a>
+<a name="38"><span class="lineNum"> 38 </span> : : </a>
+<a name="39"><span class="lineNum"> 39 </span> : : # ifndef __dev_t_defined</a>
+<a name="40"><span class="lineNum"> 40 </span> : : typedef __dev_t dev_t;</a>
+<a name="41"><span class="lineNum"> 41 </span> : : # define __dev_t_defined</a>
+<a name="42"><span class="lineNum"> 42 </span> : : # endif</a>
+<a name="43"><span class="lineNum"> 43 </span> : : </a>
+<a name="44"><span class="lineNum"> 44 </span> : : # ifndef __gid_t_defined</a>
+<a name="45"><span class="lineNum"> 45 </span> : : typedef __gid_t gid_t;</a>
+<a name="46"><span class="lineNum"> 46 </span> : : # define __gid_t_defined</a>
+<a name="47"><span class="lineNum"> 47 </span> : : # endif</a>
+<a name="48"><span class="lineNum"> 48 </span> : : </a>
+<a name="49"><span class="lineNum"> 49 </span> : : # ifndef __ino_t_defined</a>
+<a name="50"><span class="lineNum"> 50 </span> : : # ifndef __USE_FILE_OFFSET64</a>
+<a name="51"><span class="lineNum"> 51 </span> : : typedef __ino_t ino_t;</a>
+<a name="52"><span class="lineNum"> 52 </span> : : # else</a>
+<a name="53"><span class="lineNum"> 53 </span> : : typedef __ino64_t ino_t;</a>
+<a name="54"><span class="lineNum"> 54 </span> : : # endif</a>
+<a name="55"><span class="lineNum"> 55 </span> : : # define __ino_t_defined</a>
+<a name="56"><span class="lineNum"> 56 </span> : : # endif</a>
+<a name="57"><span class="lineNum"> 57 </span> : : </a>
+<a name="58"><span class="lineNum"> 58 </span> : : # ifndef __mode_t_defined</a>
+<a name="59"><span class="lineNum"> 59 </span> : : typedef __mode_t mode_t;</a>
+<a name="60"><span class="lineNum"> 60 </span> : : # define __mode_t_defined</a>
+<a name="61"><span class="lineNum"> 61 </span> : : # endif</a>
+<a name="62"><span class="lineNum"> 62 </span> : : </a>
+<a name="63"><span class="lineNum"> 63 </span> : : # ifndef __nlink_t_defined</a>
+<a name="64"><span class="lineNum"> 64 </span> : : typedef __nlink_t nlink_t;</a>
+<a name="65"><span class="lineNum"> 65 </span> : : # define __nlink_t_defined</a>
+<a name="66"><span class="lineNum"> 66 </span> : : # endif</a>
+<a name="67"><span class="lineNum"> 67 </span> : : </a>
+<a name="68"><span class="lineNum"> 68 </span> : : # ifndef __off_t_defined</a>
+<a name="69"><span class="lineNum"> 69 </span> : : # ifndef __USE_FILE_OFFSET64</a>
+<a name="70"><span class="lineNum"> 70 </span> : : typedef __off_t off_t;</a>
+<a name="71"><span class="lineNum"> 71 </span> : : # else</a>
+<a name="72"><span class="lineNum"> 72 </span> : : typedef __off64_t off_t;</a>
+<a name="73"><span class="lineNum"> 73 </span> : : # endif</a>
+<a name="74"><span class="lineNum"> 74 </span> : : # define __off_t_defined</a>
+<a name="75"><span class="lineNum"> 75 </span> : : # endif</a>
+<a name="76"><span class="lineNum"> 76 </span> : : </a>
+<a name="77"><span class="lineNum"> 77 </span> : : # ifndef __uid_t_defined</a>
+<a name="78"><span class="lineNum"> 78 </span> : : typedef __uid_t uid_t;</a>
+<a name="79"><span class="lineNum"> 79 </span> : : # define __uid_t_defined</a>
+<a name="80"><span class="lineNum"> 80 </span> : : # endif</a>
+<a name="81"><span class="lineNum"> 81 </span> : : #endif /* X/Open */</a>
+<a name="82"><span class="lineNum"> 82 </span> : : </a>
+<a name="83"><span class="lineNum"> 83 </span> : : #ifdef __USE_UNIX98</a>
+<a name="84"><span class="lineNum"> 84 </span> : : # ifndef __blkcnt_t_defined</a>
+<a name="85"><span class="lineNum"> 85 </span> : : # ifndef __USE_FILE_OFFSET64</a>
+<a name="86"><span class="lineNum"> 86 </span> : : typedef __blkcnt_t blkcnt_t;</a>
+<a name="87"><span class="lineNum"> 87 </span> : : # else</a>
+<a name="88"><span class="lineNum"> 88 </span> : : typedef __blkcnt64_t blkcnt_t;</a>
+<a name="89"><span class="lineNum"> 89 </span> : : # endif</a>
+<a name="90"><span class="lineNum"> 90 </span> : : # define __blkcnt_t_defined</a>
+<a name="91"><span class="lineNum"> 91 </span> : : # endif</a>
+<a name="92"><span class="lineNum"> 92 </span> : : </a>
+<a name="93"><span class="lineNum"> 93 </span> : : # ifndef __blksize_t_defined</a>
+<a name="94"><span class="lineNum"> 94 </span> : : typedef __blksize_t blksize_t;</a>
+<a name="95"><span class="lineNum"> 95 </span> : : # define __blksize_t_defined</a>
+<a name="96"><span class="lineNum"> 96 </span> : : # endif</a>
+<a name="97"><span class="lineNum"> 97 </span> : : #endif /* Unix98 */</a>
+<a name="98"><span class="lineNum"> 98 </span> : : </a>
+<a name="99"><span class="lineNum"> 99 </span> : : __BEGIN_DECLS</a>
+<a name="100"><span class="lineNum"> 100 </span> : : </a>
+<a name="101"><span class="lineNum"> 101 </span> : : #include &lt;bits/stat.h&gt;</a>
+<a name="102"><span class="lineNum"> 102 </span> : : </a>
+<a name="103"><span class="lineNum"> 103 </span> : : #if defined __USE_MISC || defined __USE_XOPEN</a>
+<a name="104"><span class="lineNum"> 104 </span> : : # define S_IFMT __S_IFMT</a>
+<a name="105"><span class="lineNum"> 105 </span> : : # define S_IFDIR __S_IFDIR</a>
+<a name="106"><span class="lineNum"> 106 </span> : : # define S_IFCHR __S_IFCHR</a>
+<a name="107"><span class="lineNum"> 107 </span> : : # define S_IFBLK __S_IFBLK</a>
+<a name="108"><span class="lineNum"> 108 </span> : : # define S_IFREG __S_IFREG</a>
+<a name="109"><span class="lineNum"> 109 </span> : : # ifdef __S_IFIFO</a>
+<a name="110"><span class="lineNum"> 110 </span> : : # define S_IFIFO __S_IFIFO</a>
+<a name="111"><span class="lineNum"> 111 </span> : : # endif</a>
+<a name="112"><span class="lineNum"> 112 </span> : : # ifdef __S_IFLNK</a>
+<a name="113"><span class="lineNum"> 113 </span> : : # define S_IFLNK __S_IFLNK</a>
+<a name="114"><span class="lineNum"> 114 </span> : : # endif</a>
+<a name="115"><span class="lineNum"> 115 </span> : : # if (defined __USE_MISC || defined __USE_XOPEN_EXTENDED) \</a>
+<a name="116"><span class="lineNum"> 116 </span> : : &amp;&amp; defined __S_IFSOCK</a>
+<a name="117"><span class="lineNum"> 117 </span> : : # define S_IFSOCK __S_IFSOCK</a>
+<a name="118"><span class="lineNum"> 118 </span> : : # endif</a>
+<a name="119"><span class="lineNum"> 119 </span> : : #endif</a>
+<a name="120"><span class="lineNum"> 120 </span> : : </a>
+<a name="121"><span class="lineNum"> 121 </span> : : /* Test macros for file types. */</a>
+<a name="122"><span class="lineNum"> 122 </span> : : </a>
+<a name="123"><span class="lineNum"> 123 </span> : : #define __S_ISTYPE(mode, mask) (((mode) &amp; __S_IFMT) == (mask))</a>
+<a name="124"><span class="lineNum"> 124 </span> : : </a>
+<a name="125"><span class="lineNum"> 125 </span> : : #define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR)</a>
+<a name="126"><span class="lineNum"> 126 </span> : : #define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR)</a>
+<a name="127"><span class="lineNum"> 127 </span> : : #define S_ISBLK(mode) __S_ISTYPE((mode), __S_IFBLK)</a>
+<a name="128"><span class="lineNum"> 128 </span> : : #define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)</a>
+<a name="129"><span class="lineNum"> 129 </span> : : #ifdef __S_IFIFO</a>
+<a name="130"><span class="lineNum"> 130 </span> : : # define S_ISFIFO(mode) __S_ISTYPE((mode), __S_IFIFO)</a>
+<a name="131"><span class="lineNum"> 131 </span> : : #endif</a>
+<a name="132"><span class="lineNum"> 132 </span> : : #ifdef __S_IFLNK</a>
+<a name="133"><span class="lineNum"> 133 </span> : : # define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)</a>
+<a name="134"><span class="lineNum"> 134 </span> : : #endif</a>
+<a name="135"><span class="lineNum"> 135 </span> : : </a>
+<a name="136"><span class="lineNum"> 136 </span> : : #if defined __USE_MISC &amp;&amp; !defined __S_IFLNK</a>
+<a name="137"><span class="lineNum"> 137 </span> : : # define S_ISLNK(mode) 0</a>
+<a name="138"><span class="lineNum"> 138 </span> : : #endif</a>
+<a name="139"><span class="lineNum"> 139 </span> : : </a>
+<a name="140"><span class="lineNum"> 140 </span> : : #if (defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K) \</a>
+<a name="141"><span class="lineNum"> 141 </span> : : &amp;&amp; defined __S_IFSOCK</a>
+<a name="142"><span class="lineNum"> 142 </span> : : # define S_ISSOCK(mode) __S_ISTYPE((mode), __S_IFSOCK)</a>
+<a name="143"><span class="lineNum"> 143 </span> : : #elif defined __USE_XOPEN2K</a>
+<a name="144"><span class="lineNum"> 144 </span> : : # define S_ISSOCK(mode) 0</a>
+<a name="145"><span class="lineNum"> 145 </span> : : #endif</a>
+<a name="146"><span class="lineNum"> 146 </span> : : </a>
+<a name="147"><span class="lineNum"> 147 </span> : : /* These are from POSIX.1b. If the objects are not implemented using separate</a>
+<a name="148"><span class="lineNum"> 148 </span> : : distinct file types, the macros always will evaluate to zero. Unlike the</a>
+<a name="149"><span class="lineNum"> 149 </span> : : other S_* macros the following three take a pointer to a `struct stat'</a>
+<a name="150"><span class="lineNum"> 150 </span> : : object as the argument. */</a>
+<a name="151"><span class="lineNum"> 151 </span> : : #ifdef __USE_POSIX199309</a>
+<a name="152"><span class="lineNum"> 152 </span> : : # define S_TYPEISMQ(buf) __S_TYPEISMQ(buf)</a>
+<a name="153"><span class="lineNum"> 153 </span> : : # define S_TYPEISSEM(buf) __S_TYPEISSEM(buf)</a>
+<a name="154"><span class="lineNum"> 154 </span> : : # define S_TYPEISSHM(buf) __S_TYPEISSHM(buf)</a>
+<a name="155"><span class="lineNum"> 155 </span> : : #endif</a>
+<a name="156"><span class="lineNum"> 156 </span> : : </a>
+<a name="157"><span class="lineNum"> 157 </span> : : </a>
+<a name="158"><span class="lineNum"> 158 </span> : : /* Protection bits. */</a>
+<a name="159"><span class="lineNum"> 159 </span> : : </a>
+<a name="160"><span class="lineNum"> 160 </span> : : #define S_ISUID __S_ISUID /* Set user ID on execution. */</a>
+<a name="161"><span class="lineNum"> 161 </span> : : #define S_ISGID __S_ISGID /* Set group ID on execution. */</a>
+<a name="162"><span class="lineNum"> 162 </span> : : </a>
+<a name="163"><span class="lineNum"> 163 </span> : : #if defined __USE_MISC || defined __USE_XOPEN</a>
+<a name="164"><span class="lineNum"> 164 </span> : : /* Save swapped text after use (sticky bit). This is pretty well obsolete. */</a>
+<a name="165"><span class="lineNum"> 165 </span> : : # define S_ISVTX __S_ISVTX</a>
+<a name="166"><span class="lineNum"> 166 </span> : : #endif</a>
+<a name="167"><span class="lineNum"> 167 </span> : : </a>
+<a name="168"><span class="lineNum"> 168 </span> : : #define S_IRUSR __S_IREAD /* Read by owner. */</a>
+<a name="169"><span class="lineNum"> 169 </span> : : #define S_IWUSR __S_IWRITE /* Write by owner. */</a>
+<a name="170"><span class="lineNum"> 170 </span> : : #define S_IXUSR __S_IEXEC /* Execute by owner. */</a>
+<a name="171"><span class="lineNum"> 171 </span> : : /* Read, write, and execute by owner. */</a>
+<a name="172"><span class="lineNum"> 172 </span> : : #define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC)</a>
+<a name="173"><span class="lineNum"> 173 </span> : : </a>
+<a name="174"><span class="lineNum"> 174 </span> : : #ifdef __USE_MISC</a>
+<a name="175"><span class="lineNum"> 175 </span> : : # define S_IREAD S_IRUSR</a>
+<a name="176"><span class="lineNum"> 176 </span> : : # define S_IWRITE S_IWUSR</a>
+<a name="177"><span class="lineNum"> 177 </span> : : # define S_IEXEC S_IXUSR</a>
+<a name="178"><span class="lineNum"> 178 </span> : : #endif</a>
+<a name="179"><span class="lineNum"> 179 </span> : : </a>
+<a name="180"><span class="lineNum"> 180 </span> : : #define S_IRGRP (S_IRUSR &gt;&gt; 3) /* Read by group. */</a>
+<a name="181"><span class="lineNum"> 181 </span> : : #define S_IWGRP (S_IWUSR &gt;&gt; 3) /* Write by group. */</a>
+<a name="182"><span class="lineNum"> 182 </span> : : #define S_IXGRP (S_IXUSR &gt;&gt; 3) /* Execute by group. */</a>
+<a name="183"><span class="lineNum"> 183 </span> : : /* Read, write, and execute by group. */</a>
+<a name="184"><span class="lineNum"> 184 </span> : : #define S_IRWXG (S_IRWXU &gt;&gt; 3)</a>
+<a name="185"><span class="lineNum"> 185 </span> : : </a>
+<a name="186"><span class="lineNum"> 186 </span> : : #define S_IROTH (S_IRGRP &gt;&gt; 3) /* Read by others. */</a>
+<a name="187"><span class="lineNum"> 187 </span> : : #define S_IWOTH (S_IWGRP &gt;&gt; 3) /* Write by others. */</a>
+<a name="188"><span class="lineNum"> 188 </span> : : #define S_IXOTH (S_IXGRP &gt;&gt; 3) /* Execute by others. */</a>
+<a name="189"><span class="lineNum"> 189 </span> : : /* Read, write, and execute by others. */</a>
+<a name="190"><span class="lineNum"> 190 </span> : : #define S_IRWXO (S_IRWXG &gt;&gt; 3)</a>
+<a name="191"><span class="lineNum"> 191 </span> : : </a>
+<a name="192"><span class="lineNum"> 192 </span> : : </a>
+<a name="193"><span class="lineNum"> 193 </span> : : #ifdef __USE_MISC</a>
+<a name="194"><span class="lineNum"> 194 </span> : : /* Macros for common mode bit masks. */</a>
+<a name="195"><span class="lineNum"> 195 </span> : : # define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */</a>
+<a name="196"><span class="lineNum"> 196 </span> : : # define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)/* 07777 */</a>
+<a name="197"><span class="lineNum"> 197 </span> : : # define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)/* 0666*/</a>
+<a name="198"><span class="lineNum"> 198 </span> : : </a>
+<a name="199"><span class="lineNum"> 199 </span> : : # define S_BLKSIZE 512 /* Block size for `st_blocks'. */</a>
+<a name="200"><span class="lineNum"> 200 </span> : : #endif</a>
+<a name="201"><span class="lineNum"> 201 </span> : : </a>
+<a name="202"><span class="lineNum"> 202 </span> : : </a>
+<a name="203"><span class="lineNum"> 203 </span> : : #ifndef __USE_FILE_OFFSET64</a>
+<a name="204"><span class="lineNum"> 204 </span> : : /* Get file attributes for FILE and put them in BUF. */</a>
+<a name="205"><span class="lineNum"> 205 </span> : : extern int stat (const char *__restrict __file,</a>
+<a name="206"><span class="lineNum"> 206 </span> : : struct stat *__restrict __buf) __THROW __nonnull ((1, 2));</a>
+<a name="207"><span class="lineNum"> 207 </span> : : </a>
+<a name="208"><span class="lineNum"> 208 </span> : : /* Get file attributes for the file, device, pipe, or socket</a>
+<a name="209"><span class="lineNum"> 209 </span> : : that file descriptor FD is open on and put them in BUF. */</a>
+<a name="210"><span class="lineNum"> 210 </span> : : extern int fstat (int __fd, struct stat *__buf) __THROW __nonnull ((2));</a>
+<a name="211"><span class="lineNum"> 211 </span> : : #else</a>
+<a name="212"><span class="lineNum"> 212 </span> : : # ifdef __REDIRECT_NTH</a>
+<a name="213"><span class="lineNum"> 213 </span> : : extern int __REDIRECT_NTH (stat, (const char *__restrict __file,</a>
+<a name="214"><span class="lineNum"> 214 </span> : : struct stat *__restrict __buf), stat64)</a>
+<a name="215"><span class="lineNum"> 215 </span> : : __nonnull ((1, 2));</a>
+<a name="216"><span class="lineNum"> 216 </span> : : extern int __REDIRECT_NTH (fstat, (int __fd, struct stat *__buf), fstat64)</a>
+<a name="217"><span class="lineNum"> 217 </span> : : __nonnull ((2));</a>
+<a name="218"><span class="lineNum"> 218 </span> : : # else</a>
+<a name="219"><span class="lineNum"> 219 </span> : : # define stat stat64</a>
+<a name="220"><span class="lineNum"> 220 </span> : : # define fstat fstat64</a>
+<a name="221"><span class="lineNum"> 221 </span> : : # endif</a>
+<a name="222"><span class="lineNum"> 222 </span> : : #endif</a>
+<a name="223"><span class="lineNum"> 223 </span> : : #ifdef __USE_LARGEFILE64</a>
+<a name="224"><span class="lineNum"> 224 </span> : : extern int stat64 (const char *__restrict __file,</a>
+<a name="225"><span class="lineNum"> 225 </span> : : struct stat64 *__restrict __buf) __THROW __nonnull ((1, 2));</a>
+<a name="226"><span class="lineNum"> 226 </span> : : extern int fstat64 (int __fd, struct stat64 *__buf) __THROW __nonnull ((2));</a>
+<a name="227"><span class="lineNum"> 227 </span> : : #endif</a>
+<a name="228"><span class="lineNum"> 228 </span> : : </a>
+<a name="229"><span class="lineNum"> 229 </span> : : #ifdef __USE_ATFILE</a>
+<a name="230"><span class="lineNum"> 230 </span> : : /* Similar to stat, get the attributes for FILE and put them in BUF.</a>
+<a name="231"><span class="lineNum"> 231 </span> : : Relative path names are interpreted relative to FD unless FD is</a>
+<a name="232"><span class="lineNum"> 232 </span> : : AT_FDCWD. */</a>
+<a name="233"><span class="lineNum"> 233 </span> : : # ifndef __USE_FILE_OFFSET64</a>
+<a name="234"><span class="lineNum"> 234 </span> : : extern int fstatat (int __fd, const char *__restrict __file,</a>
+<a name="235"><span class="lineNum"> 235 </span> : : struct stat *__restrict __buf, int __flag)</a>
+<a name="236"><span class="lineNum"> 236 </span> : : __THROW __nonnull ((2, 3));</a>
+<a name="237"><span class="lineNum"> 237 </span> : : # else</a>
+<a name="238"><span class="lineNum"> 238 </span> : : # ifdef __REDIRECT_NTH</a>
+<a name="239"><span class="lineNum"> 239 </span> : : extern int __REDIRECT_NTH (fstatat, (int __fd, const char *__restrict __file,</a>
+<a name="240"><span class="lineNum"> 240 </span> : : struct stat *__restrict __buf,</a>
+<a name="241"><span class="lineNum"> 241 </span> : : int __flag),</a>
+<a name="242"><span class="lineNum"> 242 </span> : : fstatat64) __nonnull ((2, 3));</a>
+<a name="243"><span class="lineNum"> 243 </span> : : # else</a>
+<a name="244"><span class="lineNum"> 244 </span> : : # define fstatat fstatat64</a>
+<a name="245"><span class="lineNum"> 245 </span> : : # endif</a>
+<a name="246"><span class="lineNum"> 246 </span> : : # endif</a>
+<a name="247"><span class="lineNum"> 247 </span> : : </a>
+<a name="248"><span class="lineNum"> 248 </span> : : # ifdef __USE_LARGEFILE64</a>
+<a name="249"><span class="lineNum"> 249 </span> : : extern int fstatat64 (int __fd, const char *__restrict __file,</a>
+<a name="250"><span class="lineNum"> 250 </span> : : struct stat64 *__restrict __buf, int __flag)</a>
+<a name="251"><span class="lineNum"> 251 </span> : : __THROW __nonnull ((2, 3));</a>
+<a name="252"><span class="lineNum"> 252 </span> : : # endif</a>
+<a name="253"><span class="lineNum"> 253 </span> : : #endif</a>
+<a name="254"><span class="lineNum"> 254 </span> : : </a>
+<a name="255"><span class="lineNum"> 255 </span> : : #if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K</a>
+<a name="256"><span class="lineNum"> 256 </span> : : # ifndef __USE_FILE_OFFSET64</a>
+<a name="257"><span class="lineNum"> 257 </span> : : /* Get file attributes about FILE and put them in BUF.</a>
+<a name="258"><span class="lineNum"> 258 </span> : : If FILE is a symbolic link, do not follow it. */</a>
+<a name="259"><span class="lineNum"> 259 </span> : : extern int lstat (const char *__restrict __file,</a>
+<a name="260"><span class="lineNum"> 260 </span> : : struct stat *__restrict __buf) __THROW __nonnull ((1, 2));</a>
+<a name="261"><span class="lineNum"> 261 </span> : : # else</a>
+<a name="262"><span class="lineNum"> 262 </span> : : # ifdef __REDIRECT_NTH</a>
+<a name="263"><span class="lineNum"> 263 </span> : : extern int __REDIRECT_NTH (lstat,</a>
+<a name="264"><span class="lineNum"> 264 </span> : : (const char *__restrict __file,</a>
+<a name="265"><span class="lineNum"> 265 </span> : : struct stat *__restrict __buf), lstat64)</a>
+<a name="266"><span class="lineNum"> 266 </span> : : __nonnull ((1, 2));</a>
+<a name="267"><span class="lineNum"> 267 </span> : : # else</a>
+<a name="268"><span class="lineNum"> 268 </span> : : # define lstat lstat64</a>
+<a name="269"><span class="lineNum"> 269 </span> : : # endif</a>
+<a name="270"><span class="lineNum"> 270 </span> : : # endif</a>
+<a name="271"><span class="lineNum"> 271 </span> : : # ifdef __USE_LARGEFILE64</a>
+<a name="272"><span class="lineNum"> 272 </span> : : extern int lstat64 (const char *__restrict __file,</a>
+<a name="273"><span class="lineNum"> 273 </span> : : struct stat64 *__restrict __buf)</a>
+<a name="274"><span class="lineNum"> 274 </span> : : __THROW __nonnull ((1, 2));</a>
+<a name="275"><span class="lineNum"> 275 </span> : : # endif</a>
+<a name="276"><span class="lineNum"> 276 </span> : : #endif</a>
+<a name="277"><span class="lineNum"> 277 </span> : : </a>
+<a name="278"><span class="lineNum"> 278 </span> : : /* Set file access permissions for FILE to MODE.</a>
+<a name="279"><span class="lineNum"> 279 </span> : : If FILE is a symbolic link, this affects its target instead. */</a>
+<a name="280"><span class="lineNum"> 280 </span> : : extern int chmod (const char *__file, __mode_t __mode)</a>
+<a name="281"><span class="lineNum"> 281 </span> : : __THROW __nonnull ((1));</a>
+<a name="282"><span class="lineNum"> 282 </span> : : </a>
+<a name="283"><span class="lineNum"> 283 </span> : : #ifdef __USE_MISC</a>
+<a name="284"><span class="lineNum"> 284 </span> : : /* Set file access permissions for FILE to MODE.</a>
+<a name="285"><span class="lineNum"> 285 </span> : : If FILE is a symbolic link, this affects the link itself</a>
+<a name="286"><span class="lineNum"> 286 </span> : : rather than its target. */</a>
+<a name="287"><span class="lineNum"> 287 </span> : : extern int lchmod (const char *__file, __mode_t __mode)</a>
+<a name="288"><span class="lineNum"> 288 </span> : : __THROW __nonnull ((1));</a>
+<a name="289"><span class="lineNum"> 289 </span> : : #endif</a>
+<a name="290"><span class="lineNum"> 290 </span> : : </a>
+<a name="291"><span class="lineNum"> 291 </span> : : /* Set file access permissions of the file FD is open on to MODE. */</a>
+<a name="292"><span class="lineNum"> 292 </span> : : #if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED</a>
+<a name="293"><span class="lineNum"> 293 </span> : : extern int fchmod (int __fd, __mode_t __mode) __THROW;</a>
+<a name="294"><span class="lineNum"> 294 </span> : : #endif</a>
+<a name="295"><span class="lineNum"> 295 </span> : : </a>
+<a name="296"><span class="lineNum"> 296 </span> : : #ifdef __USE_ATFILE</a>
+<a name="297"><span class="lineNum"> 297 </span> : : /* Set file access permissions of FILE relative to</a>
+<a name="298"><span class="lineNum"> 298 </span> : : the directory FD is open on. */</a>
+<a name="299"><span class="lineNum"> 299 </span> : : extern int fchmodat (int __fd, const char *__file, __mode_t __mode,</a>
+<a name="300"><span class="lineNum"> 300 </span> : : int __flag)</a>
+<a name="301"><span class="lineNum"> 301 </span> : : __THROW __nonnull ((2)) __wur;</a>
+<a name="302"><span class="lineNum"> 302 </span> : : #endif /* Use ATFILE. */</a>
+<a name="303"><span class="lineNum"> 303 </span> : : </a>
+<a name="304"><span class="lineNum"> 304 </span> : : </a>
+<a name="305"><span class="lineNum"> 305 </span> : : </a>
+<a name="306"><span class="lineNum"> 306 </span> : : /* Set the file creation mask of the current process to MASK,</a>
+<a name="307"><span class="lineNum"> 307 </span> : : and return the old creation mask. */</a>
+<a name="308"><span class="lineNum"> 308 </span> : : extern __mode_t umask (__mode_t __mask) __THROW;</a>
+<a name="309"><span class="lineNum"> 309 </span> : : </a>
+<a name="310"><span class="lineNum"> 310 </span> : : #ifdef __USE_GNU</a>
+<a name="311"><span class="lineNum"> 311 </span> : : /* Get the current `umask' value without changing it.</a>
+<a name="312"><span class="lineNum"> 312 </span> : : This function is only available under the GNU Hurd. */</a>
+<a name="313"><span class="lineNum"> 313 </span> : : extern __mode_t getumask (void) __THROW;</a>
+<a name="314"><span class="lineNum"> 314 </span> : : #endif</a>
+<a name="315"><span class="lineNum"> 315 </span> : : </a>
+<a name="316"><span class="lineNum"> 316 </span> : : /* Create a new directory named PATH, with permission bits MODE. */</a>
+<a name="317"><span class="lineNum"> 317 </span> : : extern int mkdir (const char *__path, __mode_t __mode)</a>
+<a name="318"><span class="lineNum"> 318 </span> : : __THROW __nonnull ((1));</a>
+<a name="319"><span class="lineNum"> 319 </span> : : </a>
+<a name="320"><span class="lineNum"> 320 </span> : : #ifdef __USE_ATFILE</a>
+<a name="321"><span class="lineNum"> 321 </span> : : /* Like mkdir, create a new directory with permission bits MODE. But</a>
+<a name="322"><span class="lineNum"> 322 </span> : : interpret relative PATH names relative to the directory associated</a>
+<a name="323"><span class="lineNum"> 323 </span> : : with FD. */</a>
+<a name="324"><span class="lineNum"> 324 </span> : : extern int mkdirat (int __fd, const char *__path, __mode_t __mode)</a>
+<a name="325"><span class="lineNum"> 325 </span> : : __THROW __nonnull ((2));</a>
+<a name="326"><span class="lineNum"> 326 </span> : : #endif</a>
+<a name="327"><span class="lineNum"> 327 </span> : : </a>
+<a name="328"><span class="lineNum"> 328 </span> : : /* Create a device file named PATH, with permission and special bits MODE</a>
+<a name="329"><span class="lineNum"> 329 </span> : : and device number DEV (which can be constructed from major and minor</a>
+<a name="330"><span class="lineNum"> 330 </span> : : device numbers with the `makedev' macro above). */</a>
+<a name="331"><span class="lineNum"> 331 </span> : : #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED</a>
+<a name="332"><span class="lineNum"> 332 </span> : : extern int mknod (const char *__path, __mode_t __mode, __dev_t __dev)</a>
+<a name="333"><span class="lineNum"> 333 </span> : : __THROW __nonnull ((1));</a>
+<a name="334"><span class="lineNum"> 334 </span> : : </a>
+<a name="335"><span class="lineNum"> 335 </span> : : # ifdef __USE_ATFILE</a>
+<a name="336"><span class="lineNum"> 336 </span> : : /* Like mknod, create a new device file with permission bits MODE and</a>
+<a name="337"><span class="lineNum"> 337 </span> : : device number DEV. But interpret relative PATH names relative to</a>
+<a name="338"><span class="lineNum"> 338 </span> : : the directory associated with FD. */</a>
+<a name="339"><span class="lineNum"> 339 </span> : : extern int mknodat (int __fd, const char *__path, __mode_t __mode,</a>
+<a name="340"><span class="lineNum"> 340 </span> : : __dev_t __dev) __THROW __nonnull ((2));</a>
+<a name="341"><span class="lineNum"> 341 </span> : : # endif</a>
+<a name="342"><span class="lineNum"> 342 </span> : : #endif</a>
+<a name="343"><span class="lineNum"> 343 </span> : : </a>
+<a name="344"><span class="lineNum"> 344 </span> : : </a>
+<a name="345"><span class="lineNum"> 345 </span> : : /* Create a new FIFO named PATH, with permission bits MODE. */</a>
+<a name="346"><span class="lineNum"> 346 </span> : : extern int mkfifo (const char *__path, __mode_t __mode)</a>
+<a name="347"><span class="lineNum"> 347 </span> : : __THROW __nonnull ((1));</a>
+<a name="348"><span class="lineNum"> 348 </span> : : </a>
+<a name="349"><span class="lineNum"> 349 </span> : : #ifdef __USE_ATFILE</a>
+<a name="350"><span class="lineNum"> 350 </span> : : /* Like mkfifo, create a new FIFO with permission bits MODE. But</a>
+<a name="351"><span class="lineNum"> 351 </span> : : interpret relative PATH names relative to the directory associated</a>
+<a name="352"><span class="lineNum"> 352 </span> : : with FD. */</a>
+<a name="353"><span class="lineNum"> 353 </span> : : extern int mkfifoat (int __fd, const char *__path, __mode_t __mode)</a>
+<a name="354"><span class="lineNum"> 354 </span> : : __THROW __nonnull ((2));</a>
+<a name="355"><span class="lineNum"> 355 </span> : : #endif</a>
+<a name="356"><span class="lineNum"> 356 </span> : : </a>
+<a name="357"><span class="lineNum"> 357 </span> : : #ifdef __USE_ATFILE</a>
+<a name="358"><span class="lineNum"> 358 </span> : : /* Set file access and modification times relative to directory file</a>
+<a name="359"><span class="lineNum"> 359 </span> : : descriptor. */</a>
+<a name="360"><span class="lineNum"> 360 </span> : : extern int utimensat (int __fd, const char *__path,</a>
+<a name="361"><span class="lineNum"> 361 </span> : : const struct timespec __times[2],</a>
+<a name="362"><span class="lineNum"> 362 </span> : : int __flags)</a>
+<a name="363"><span class="lineNum"> 363 </span> : : __THROW __nonnull ((2));</a>
+<a name="364"><span class="lineNum"> 364 </span> : : #endif</a>
+<a name="365"><span class="lineNum"> 365 </span> : : </a>
+<a name="366"><span class="lineNum"> 366 </span> : : #ifdef __USE_XOPEN2K8</a>
+<a name="367"><span class="lineNum"> 367 </span> : : /* Set file access and modification times of the file associated with FD. */</a>
+<a name="368"><span class="lineNum"> 368 </span> : : extern int futimens (int __fd, const struct timespec __times[2]) __THROW;</a>
+<a name="369"><span class="lineNum"> 369 </span> : : #endif</a>
+<a name="370"><span class="lineNum"> 370 </span> : : </a>
+<a name="371"><span class="lineNum"> 371 </span> : : /* To allow the `struct stat' structure and the file type `mode_t'</a>
+<a name="372"><span class="lineNum"> 372 </span> : : bits to vary without changing shared library major version number,</a>
+<a name="373"><span class="lineNum"> 373 </span> : : the `stat' family of functions and `mknod' are in fact inline</a>
+<a name="374"><span class="lineNum"> 374 </span> : : wrappers around calls to `xstat', `fxstat', `lxstat', and `xmknod',</a>
+<a name="375"><span class="lineNum"> 375 </span> : : which all take a leading version-number argument designating the</a>
+<a name="376"><span class="lineNum"> 376 </span> : : data structure and bits used. &lt;bits/stat.h&gt; defines _STAT_VER with</a>
+<a name="377"><span class="lineNum"> 377 </span> : : the version number corresponding to `struct stat' as defined in</a>
+<a name="378"><span class="lineNum"> 378 </span> : : that file; and _MKNOD_VER with the version number corresponding to</a>
+<a name="379"><span class="lineNum"> 379 </span> : : the S_IF* macros defined therein. It is arranged that when not</a>
+<a name="380"><span class="lineNum"> 380 </span> : : inlined these function are always statically linked; that way a</a>
+<a name="381"><span class="lineNum"> 381 </span> : : dynamically-linked executable always encodes the version number</a>
+<a name="382"><span class="lineNum"> 382 </span> : : corresponding to the data structures it uses, so the `x' functions</a>
+<a name="383"><span class="lineNum"> 383 </span> : : in the shared library can adapt without needing to recompile all</a>
+<a name="384"><span class="lineNum"> 384 </span> : : callers. */</a>
+<a name="385"><span class="lineNum"> 385 </span> : : </a>
+<a name="386"><span class="lineNum"> 386 </span> : : #ifndef _STAT_VER</a>
+<a name="387"><span class="lineNum"> 387 </span> : : # define _STAT_VER 0</a>
+<a name="388"><span class="lineNum"> 388 </span> : : #endif</a>
+<a name="389"><span class="lineNum"> 389 </span> : : #ifndef _MKNOD_VER</a>
+<a name="390"><span class="lineNum"> 390 </span> : : # define _MKNOD_VER 0</a>
+<a name="391"><span class="lineNum"> 391 </span> : : #endif</a>
+<a name="392"><span class="lineNum"> 392 </span> : : </a>
+<a name="393"><span class="lineNum"> 393 </span> : : /* Wrappers for stat and mknod system calls. */</a>
+<a name="394"><span class="lineNum"> 394 </span> : : #ifndef __USE_FILE_OFFSET64</a>
+<a name="395"><span class="lineNum"> 395 </span> : : extern int __fxstat (int __ver, int __fildes, struct stat *__stat_buf)</a>
+<a name="396"><span class="lineNum"> 396 </span> : : __THROW __nonnull ((3));</a>
+<a name="397"><span class="lineNum"> 397 </span> : : extern int __xstat (int __ver, const char *__filename,</a>
+<a name="398"><span class="lineNum"> 398 </span> : : struct stat *__stat_buf) __THROW __nonnull ((2, 3));</a>
+<a name="399"><span class="lineNum"> 399 </span> : : extern int __lxstat (int __ver, const char *__filename,</a>
+<a name="400"><span class="lineNum"> 400 </span> : : struct stat *__stat_buf) __THROW __nonnull ((2, 3));</a>
+<a name="401"><span class="lineNum"> 401 </span> : : extern int __fxstatat (int __ver, int __fildes, const char *__filename,</a>
+<a name="402"><span class="lineNum"> 402 </span> : : struct stat *__stat_buf, int __flag)</a>
+<a name="403"><span class="lineNum"> 403 </span> : : __THROW __nonnull ((3, 4));</a>
+<a name="404"><span class="lineNum"> 404 </span> : : #else</a>
+<a name="405"><span class="lineNum"> 405 </span> : : # ifdef __REDIRECT_NTH</a>
+<a name="406"><span class="lineNum"> 406 </span> : : extern int __REDIRECT_NTH (__fxstat, (int __ver, int __fildes,</a>
+<a name="407"><span class="lineNum"> 407 </span> : : struct stat *__stat_buf), __fxstat64)</a>
+<a name="408"><span class="lineNum"> 408 </span> : : __nonnull ((3));</a>
+<a name="409"><span class="lineNum"> 409 </span> : : extern int __REDIRECT_NTH (__xstat, (int __ver, const char *__filename,</a>
+<a name="410"><span class="lineNum"> 410 </span> : : struct stat *__stat_buf), __xstat64)</a>
+<a name="411"><span class="lineNum"> 411 </span> : : __nonnull ((2, 3));</a>
+<a name="412"><span class="lineNum"> 412 </span> : : extern int __REDIRECT_NTH (__lxstat, (int __ver, const char *__filename,</a>
+<a name="413"><span class="lineNum"> 413 </span> : : struct stat *__stat_buf), __lxstat64)</a>
+<a name="414"><span class="lineNum"> 414 </span> : : __nonnull ((2, 3));</a>
+<a name="415"><span class="lineNum"> 415 </span> : : extern int __REDIRECT_NTH (__fxstatat, (int __ver, int __fildes,</a>
+<a name="416"><span class="lineNum"> 416 </span> : : const char *__filename,</a>
+<a name="417"><span class="lineNum"> 417 </span> : : struct stat *__stat_buf, int __flag),</a>
+<a name="418"><span class="lineNum"> 418 </span> : : __fxstatat64) __nonnull ((3, 4));</a>
+<a name="419"><span class="lineNum"> 419 </span> : : </a>
+<a name="420"><span class="lineNum"> 420 </span> : : # else</a>
+<a name="421"><span class="lineNum"> 421 </span> : : # define __fxstat __fxstat64</a>
+<a name="422"><span class="lineNum"> 422 </span> : : # define __xstat __xstat64</a>
+<a name="423"><span class="lineNum"> 423 </span> : : # define __lxstat __lxstat64</a>
+<a name="424"><span class="lineNum"> 424 </span> : : # endif</a>
+<a name="425"><span class="lineNum"> 425 </span> : : #endif</a>
+<a name="426"><span class="lineNum"> 426 </span> : : </a>
+<a name="427"><span class="lineNum"> 427 </span> : : #ifdef __USE_LARGEFILE64</a>
+<a name="428"><span class="lineNum"> 428 </span> : : extern int __fxstat64 (int __ver, int __fildes, struct stat64 *__stat_buf)</a>
+<a name="429"><span class="lineNum"> 429 </span> : : __THROW __nonnull ((3));</a>
+<a name="430"><span class="lineNum"> 430 </span> : : extern int __xstat64 (int __ver, const char *__filename,</a>
+<a name="431"><span class="lineNum"> 431 </span> : : struct stat64 *__stat_buf) __THROW __nonnull ((2, 3));</a>
+<a name="432"><span class="lineNum"> 432 </span> : : extern int __lxstat64 (int __ver, const char *__filename,</a>
+<a name="433"><span class="lineNum"> 433 </span> : : struct stat64 *__stat_buf) __THROW __nonnull ((2, 3));</a>
+<a name="434"><span class="lineNum"> 434 </span> : : extern int __fxstatat64 (int __ver, int __fildes, const char *__filename,</a>
+<a name="435"><span class="lineNum"> 435 </span> : : struct stat64 *__stat_buf, int __flag)</a>
+<a name="436"><span class="lineNum"> 436 </span> : : __THROW __nonnull ((3, 4));</a>
+<a name="437"><span class="lineNum"> 437 </span> : : #endif</a>
+<a name="438"><span class="lineNum"> 438 </span> : : extern int __xmknod (int __ver, const char *__path, __mode_t __mode,</a>
+<a name="439"><span class="lineNum"> 439 </span> : : __dev_t *__dev) __THROW __nonnull ((2, 4));</a>
+<a name="440"><span class="lineNum"> 440 </span> : : </a>
+<a name="441"><span class="lineNum"> 441 </span> : : extern int __xmknodat (int __ver, int __fd, const char *__path,</a>
+<a name="442"><span class="lineNum"> 442 </span> : : __mode_t __mode, __dev_t *__dev)</a>
+<a name="443"><span class="lineNum"> 443 </span> : : __THROW __nonnull ((3, 5));</a>
+<a name="444"><span class="lineNum"> 444 </span> : : </a>
+<a name="445"><span class="lineNum"> 445 </span> : : #ifdef __USE_GNU</a>
+<a name="446"><span class="lineNum"> 446 </span> : : # include &lt;bits/statx.h&gt;</a>
+<a name="447"><span class="lineNum"> 447 </span> : : #endif</a>
+<a name="448"><span class="lineNum"> 448 </span> : : </a>
+<a name="449"><span class="lineNum"> 449 </span> : : #ifdef __USE_EXTERN_INLINES</a>
+<a name="450"><span class="lineNum"> 450 </span> : : /* Inlined versions of the real stat and mknod functions. */</a>
+<a name="451"><span class="lineNum"> 451 </span> : : </a>
+<a name="452"><span class="lineNum"> 452 </span> : : __extern_inline int</a>
+<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 2 : __NTH (stat (const char *__path, struct stat *__statbuf))</span></a>
+<a name="454"><span class="lineNum"> 454 </span> : : {</a>
+<a name="455"><span class="lineNum"> 455 </span> :<span class="lineCov"> 2 : return __xstat (_STAT_VER, __path, __statbuf);</span></a>
+<a name="456"><span class="lineNum"> 456 </span> : : }</a>
+<a name="457"><span class="lineNum"> 457 </span> : : </a>
+<a name="458"><span class="lineNum"> 458 </span> : : # if defined __USE_MISC || defined __USE_XOPEN_EXTENDED</a>
+<a name="459"><span class="lineNum"> 459 </span> : : __extern_inline int</a>
+<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 22 : __NTH (lstat (const char *__path, struct stat *__statbuf))</span></a>
+<a name="461"><span class="lineNum"> 461 </span> : : {</a>
+<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 22 : return __lxstat (_STAT_VER, __path, __statbuf);</span></a>
+<a name="463"><span class="lineNum"> 463 </span> : : }</a>
+<a name="464"><span class="lineNum"> 464 </span> : : # endif</a>
+<a name="465"><span class="lineNum"> 465 </span> : : </a>
+<a name="466"><span class="lineNum"> 466 </span> : : __extern_inline int</a>
+<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 188 : __NTH (fstat (int __fd, struct stat *__statbuf))</span></a>
+<a name="468"><span class="lineNum"> 468 </span> : : {</a>
+<a name="469"><span class="lineNum"> 469 </span> :<span class="lineCov"> 188 : return __fxstat (_STAT_VER, __fd, __statbuf);</span></a>
+<a name="470"><span class="lineNum"> 470 </span> : : }</a>
+<a name="471"><span class="lineNum"> 471 </span> : : </a>
+<a name="472"><span class="lineNum"> 472 </span> : : # ifdef __USE_ATFILE</a>
+<a name="473"><span class="lineNum"> 473 </span> : : __extern_inline int</a>
+<a name="474"><span class="lineNum"> 474 </span> : : __NTH (fstatat (int __fd, const char *__filename, struct stat *__statbuf,</a>
+<a name="475"><span class="lineNum"> 475 </span> : : int __flag))</a>
+<a name="476"><span class="lineNum"> 476 </span> : : {</a>
+<a name="477"><span class="lineNum"> 477 </span> : : return __fxstatat (_STAT_VER, __fd, __filename, __statbuf, __flag);</a>
+<a name="478"><span class="lineNum"> 478 </span> : : }</a>
+<a name="479"><span class="lineNum"> 479 </span> : : # endif</a>
+<a name="480"><span class="lineNum"> 480 </span> : : </a>
+<a name="481"><span class="lineNum"> 481 </span> : : # ifdef __USE_MISC</a>
+<a name="482"><span class="lineNum"> 482 </span> : : __extern_inline int</a>
+<a name="483"><span class="lineNum"> 483 </span> : : __NTH (mknod (const char *__path, __mode_t __mode, __dev_t __dev))</a>
+<a name="484"><span class="lineNum"> 484 </span> : : {</a>
+<a name="485"><span class="lineNum"> 485 </span> : : return __xmknod (_MKNOD_VER, __path, __mode, &amp;__dev);</a>
+<a name="486"><span class="lineNum"> 486 </span> : : }</a>
+<a name="487"><span class="lineNum"> 487 </span> : : # endif</a>
+<a name="488"><span class="lineNum"> 488 </span> : : </a>
+<a name="489"><span class="lineNum"> 489 </span> : : # ifdef __USE_ATFILE</a>
+<a name="490"><span class="lineNum"> 490 </span> : : __extern_inline int</a>
+<a name="491"><span class="lineNum"> 491 </span> : : __NTH (mknodat (int __fd, const char *__path, __mode_t __mode,</a>
+<a name="492"><span class="lineNum"> 492 </span> : : __dev_t __dev))</a>
+<a name="493"><span class="lineNum"> 493 </span> : : {</a>
+<a name="494"><span class="lineNum"> 494 </span> : : return __xmknodat (_MKNOD_VER, __fd, __path, __mode, &amp;__dev);</a>
+<a name="495"><span class="lineNum"> 495 </span> : : }</a>
+<a name="496"><span class="lineNum"> 496 </span> : : # endif</a>
+<a name="497"><span class="lineNum"> 497 </span> : : </a>
+<a name="498"><span class="lineNum"> 498 </span> : : # if defined __USE_LARGEFILE64 \</a>
+<a name="499"><span class="lineNum"> 499 </span> : : &amp;&amp; (! defined __USE_FILE_OFFSET64 \</a>
+<a name="500"><span class="lineNum"> 500 </span> : : || (defined __REDIRECT_NTH &amp;&amp; defined __OPTIMIZE__))</a>
+<a name="501"><span class="lineNum"> 501 </span> : : __extern_inline int</a>
+<a name="502"><span class="lineNum"> 502 </span> : : __NTH (stat64 (const char *__path, struct stat64 *__statbuf))</a>
+<a name="503"><span class="lineNum"> 503 </span> : : {</a>
+<a name="504"><span class="lineNum"> 504 </span> : : return __xstat64 (_STAT_VER, __path, __statbuf);</a>
+<a name="505"><span class="lineNum"> 505 </span> : : }</a>
+<a name="506"><span class="lineNum"> 506 </span> : : </a>
+<a name="507"><span class="lineNum"> 507 </span> : : # if defined __USE_MISC || defined __USE_XOPEN_EXTENDED</a>
+<a name="508"><span class="lineNum"> 508 </span> : : __extern_inline int</a>
+<a name="509"><span class="lineNum"> 509 </span> : : __NTH (lstat64 (const char *__path, struct stat64 *__statbuf))</a>
+<a name="510"><span class="lineNum"> 510 </span> : : {</a>
+<a name="511"><span class="lineNum"> 511 </span> : : return __lxstat64 (_STAT_VER, __path, __statbuf);</a>
+<a name="512"><span class="lineNum"> 512 </span> : : }</a>
+<a name="513"><span class="lineNum"> 513 </span> : : # endif</a>
+<a name="514"><span class="lineNum"> 514 </span> : : </a>
+<a name="515"><span class="lineNum"> 515 </span> : : __extern_inline int</a>
+<a name="516"><span class="lineNum"> 516 </span> : : __NTH (fstat64 (int __fd, struct stat64 *__statbuf))</a>
+<a name="517"><span class="lineNum"> 517 </span> : : {</a>
+<a name="518"><span class="lineNum"> 518 </span> : : return __fxstat64 (_STAT_VER, __fd, __statbuf);</a>
+<a name="519"><span class="lineNum"> 519 </span> : : }</a>
+<a name="520"><span class="lineNum"> 520 </span> : : </a>
+<a name="521"><span class="lineNum"> 521 </span> : : # ifdef __USE_ATFILE</a>
+<a name="522"><span class="lineNum"> 522 </span> : : __extern_inline int</a>
+<a name="523"><span class="lineNum"> 523 </span> : : __NTH (fstatat64 (int __fd, const char *__filename, struct stat64 *__statbuf,</a>
+<a name="524"><span class="lineNum"> 524 </span> : : int __flag))</a>
+<a name="525"><span class="lineNum"> 525 </span> : : {</a>
+<a name="526"><span class="lineNum"> 526 </span> : : return __fxstatat64 (_STAT_VER, __fd, __filename, __statbuf, __flag);</a>
+<a name="527"><span class="lineNum"> 527 </span> : : }</a>
+<a name="528"><span class="lineNum"> 528 </span> : : # endif</a>
+<a name="529"><span class="lineNum"> 529 </span> : : </a>
+<a name="530"><span class="lineNum"> 530 </span> : : # endif</a>
+<a name="531"><span class="lineNum"> 531 </span> : : </a>
+<a name="532"><span class="lineNum"> 532 </span> : : #endif</a>
+<a name="533"><span class="lineNum"> 533 </span> : : </a>
+<a name="534"><span class="lineNum"> 534 </span> : : __END_DECLS</a>
+<a name="535"><span class="lineNum"> 535 </span> : : </a>
+<a name="536"><span class="lineNum"> 536 </span> : : </a>
+<a name="537"><span class="lineNum"> 537 </span> : : #endif /* sys/stat.h */</a>
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>